Documentation

How to use Makera, and how the desktop app talks to this site.

Getting started

Replace this with the first-run walkthrough. Keep it to the shortest path that produces a result, and link to the deeper sections rather than explaining everything here.

  1. Open the app and point it at whatever it works on.
  2. Do the one thing the app is for.
  3. Save or export the result.

Core concepts

Define the handful of nouns the rest of the documentation uses.

TermMeaning
ProjectWhat the app opens and saves.
ProfileA reusable group of settings.
ExportThe finished file the app produces.

Settings

Document each setting, its default, and where the app stores it on disk.

Troubleshooting

The app will not start

Cover the common causes, then point at the feedback form.

Where are the log files?

Name the exact folder on Windows and macOS. People attach these to feedback, and the crash reporter uploads them automatically.

App Crash Log API

When Makera fails, it posts a crash report to this site. It is the same endpoint the browser form uses, with auto_reported=1 added, so crash reports and human reports land in one queue and the admin can filter them apart.

Endpoint

POST https://makera.logminds.com/feedback
Content-Type: multipart/form-data
Accept: application/json

No CSRF token and no authentication. The desktop app has no browser session, so /feedback is listed in the CSRF exceptions in bootstrap/app.php. A report with auto_reported=1 must carry X-App-Time and X-App-Key, or it is refused with a 401.

Fields

FieldRequiredNotes
nameyesMax 255. Crash uploads may send a machine name or "Crash Reporter".
emailnoEnables the follow-up and resolved emails.
descriptionyesMax 10000. For a crash, the exception message plus stack trace.
appnoThe app's slug, on a site that serves more than one. This one is makera. Omitted, the report is filed under the site's first app; a slug the site does not serve is a 422.
app_versionnoMax 32, for example 1.4.2.
app_platformnoMax 32, for example windows or macos.
auto_reportedno1 for crash uploads. Flags the report "auto" in admin.
screenshots[]noPNG, JPG, or GIF. Up to 5 files, 10 MB each.
logs[]no.log or .txt only.

At most 5 files across both arrays, and 10 MB total for the request. One IP address may send at most 10 reports a minute and 30 an hour.

Responses

StatusBody
200{"ok":true,"id":123,"message":"..."}
401{"message":"...","errorno":1013}: no valid X-App-Key; keep the report
422{"errors":{"field":["..."]}}
429{"errors":{"rate":["..."]}}, with a Retry-After header in seconds

Send Accept: application/json. Without it a failed submission returns a redirect instead of JSON. Queue crash reports locally and retry later on a network error or a 429, and delete the queued report once a 200 comes back.

Example

curl -X POST https://makera.logminds.com/feedback \
  -H "Accept: application/json" \
  -F "name=Crash Reporter" \
  -F "email=user@example.com" \
  -F "description=Unhandled NullReferenceException in ExportJob.Run()" \
  -F "app=makera" \
  -F "app_version=1.4.2" \
  -F "app_platform=windows" \
  -F "auto_reported=1" \
  -F "logs[]=@makera.log"

Releases API

The desktop app can check for updates without scraping the download page. The list is rebuilt from the zip files on disk, newest version first.

GET https://makera.logminds.com/api/makera/releases
[
  {
    "platform": "windows",
    "version": "1.4.2",
    "filename": "makera_1.4.2_windows.zip",
    "size_bytes": 18234123,
    "sha256": "…",
    "uploaded_at": "2026-09-22T10:00:00-06:00",
    "notes": "Fixes the export crash."
  }
]

Download through /download-file/{filename}. That route logs the download and sends the notification email; a direct link into /downloads/makera/ is served by the web server and is never recorded.

Accounts API

Sign-up, sign-in and password reset for Makera and other apps. One email is one account with one password on every site and app this deployment serves.

POST https://makera.logminds.com/api/makera/session/{action}
Content-Type: application/json
Accept: application/json
X-App-Time, X-App-Key

Every reply is one flat JSON object. A success always carries ip, location ("City, Region, Country") and country_code ("US", empty when unknown). Anything else is {"error": "...", "errorno": N}. Access tokens last 24 hours and refresh tokens 60 days; a password reset signs every device out.

Actions

ActionFieldsSuccess
info-200, version, app
create_useremail, password (8-72), name, fname, lname, subject, template201, email, guid, nickname, confirmed; emails a 6-character code when not confirmed
confirmemail, token (the code)200
resendemail, subject, template201, for any email
sign_inemail, password200, guid, nickname, access_token, refresh_token, expires_at
refreshrefresh_token200, new tokens
sign_outBearer token200, that device only
update_userBearer token; any of name, fname, lname, phone, countrycode, usertag, filter, nickname200, the profile
delete_userBearer token and password200, email, guid; the account is gone from every site
resetpassemail, subject, template201, for any email
changepassemail, token, password201; every device signed out

Bearer token means Authorization: Bearer <access_token> from sign_in. Signing up with an email that already has an account adds the app when the password matches, and is a 2001 when it does not; an email is never reported as taken. usertag is the account's category - a group label such as staff or beta, not a user name - and filter a free-text value the app keeps for the account and reads back. The site's admin can set both as well.

Emails and nicknames are always lowercase. Every account has a unique nickname, made from the email's first letters when it signs up (djunod2@gmail.com gets djunod, then djunod-2 for the next one). The user can change it with update_user: 2 to 24 letters, digits and single hyphens, not starting or ending with a hyphen, so 2fast4u and 5318008 are fine. Some nicknames are reserved - the site names and words such as admin - and are refused with 1014. A deleted account's nickname stays held; only the site's admin can give it back.

Errors

errornoStatusWhen
1001422email missing or not an address
1002422password not 8 to 72 characters
1003422code not 6 characters [a-z0-9]
1004422template name malformed
1005422no such template
1006422subject missing or over 150 characters
1007401no Authorization: Bearer <token>, or malformed
1009422refresh_token missing or malformed
1010404the URL's app is not one of this site's apps
1011422a profile field is too long
1012422brand or brand_color/brand_style/brand_icon not allowed
1013401no valid X-App-Key
1014422nickname not 2 to 24 letters, digits or single hyphens, or reserved
1015409nickname taken by another account
2001401wrong email or password (one message for both; also create_user with an existing email and another password, and delete_user with a wrong password)
2002403account not confirmed yet
2003422wrong confirmation code
2006409already confirmed
2008422wrong reset code
2014401token unknown, expired, rotated or signed out
2015422code expired or out of tries: request a new one
3002500server error
3004429too many attempts: the message says how long to wait

One IP address may send 120 requests a minute, and 20 a minute or 60 an hour to the three actions that send email. Ten wrong passwords or codes for one email in 15 minutes lock it for the rest of that time.

Example

curl -X POST https://makera.logminds.com/api/makera/session/sign_in \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"email": "user@example.com", "password": "..."}'

App Sessions API

Makera reports each run - start, a ping while it runs, end - and the start and ping replies carry its parameters: key/value pairs the site sets for the app. No account is needed; a start that carries an Accounts API Authorization: Bearer token records the account.

POST https://makera.logminds.com/api/makera/sessions/{action}
Content-Type: application/json
Accept: application/json
X-App-Time, X-App-Key

Replies have the Accounts API's shape - ip, location and country_code on a start, {"error": "...", "errorno": N} on anything else - plus parameters, always a JSON object (empty when the app has none) whose values keep their types.

Actions

ActionFieldsSuccess
startinstall_id (8-64 of letters, digits and hyphens, made once per install); optional app_version, platform, os_version, device_model, locale, flavor, and previous_session, previous_reason (crash or killed) to close the last run that never ended200, session, started_at, ping_seconds, account, parameters
pingsession; optional errors200, ok, parameters
endsession, reason (normal, crash, killed); optional duration_seconds, errors200, ok; a repeat is 200 and changes nothing

platform is one of windows, macos, linux, ios, android, web, other. Ping every ping_seconds while the app runs.

Errors

errornoStatusWhen
1010404the URL's app is not one of this site's apps
4001422install_id missing or malformed
4002422platform not one of the names above
4003404session unknown: stop pinging, start again next run
4004422a field too long, or a count not a whole number
4005422reason or previous_reason not allowed
4006401no valid X-App-Key
3002500server error
3004429too many: the message says how long to wait

One IP address may send 120 requests a minute, and 30 starts a minute or 600 an hour. One install may start 60 times an hour.

Example

curl -X POST https://makera.logminds.com/api/makera/sessions/start \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"install_id": "6e086457-7425-46c8-966d-0821d705b7ba", "platform": "windows", "app_version": "1.2.3"}'

X-App-Key

Every request to the Accounts API and the App Sessions API, and every crash report, needs these two headers:

HeaderValue
X-App-TimeThe current Unix time in seconds.
X-App-KeyA key made from that time and the request. The example clients that come with the package show how to make it.

Without them the request is a 401 (errorno 1013, or 4006 from the App Sessions API); its X-App-Time header has the site's time, to send again with if the device's clock is wrong.

3views

Feedback

Use the feedback form for anything about Makera: something broken, something confusing, something that works especially well, or something you wish it did. Suggestions and feature requests are welcome through the same form.

For a bug, say what you did, what you expected, and what happened instead. Attach a screenshot and the log file if the app produced one; both help more than a careful description does. For a suggestion, what you were trying to get done matters more than the feature you have in mind — there may already be a way, or a better one.

Leave an email address if you would like a reply. Nothing is sent to you otherwise, and it is only used to answer your feedback.

Send Feedback →