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.
- Open the app and point it at whatever it works on.
- Do the one thing the app is for.
- Save or export the result.
Core concepts
Define the handful of nouns the rest of the documentation uses.
| Term | Meaning |
|---|---|
| Project | What the app opens and saves. |
| Profile | A reusable group of settings. |
| Export | The 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
| Field | Required | Notes |
|---|---|---|
name | yes | Max 255. Crash uploads may send a machine name or "Crash Reporter". |
email | no | Enables the follow-up and resolved emails. |
description | yes | Max 10000. For a crash, the exception message plus stack trace. |
app | no | The 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_version | no | Max 32, for example 1.4.2. |
app_platform | no | Max 32, for example windows or macos. |
auto_reported | no | 1 for crash uploads. Flags the report "auto" in admin. |
screenshots[] | no | PNG, 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
| Status | Body |
|---|---|
| 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
| Action | Fields | Success |
|---|---|---|
info | - | 200, version, app |
create_user | email, password (8-72), name, fname, lname, subject, template | 201, email, guid, nickname, confirmed; emails a 6-character code when not confirmed |
confirm | email, token (the code) | 200 |
resend | email, subject, template | 201, for any email |
sign_in | email, password | 200, guid, nickname, access_token, refresh_token, expires_at |
refresh | refresh_token | 200, new tokens |
sign_out | Bearer token | 200, that device only |
update_user | Bearer token; any of name, fname, lname, phone, countrycode, usertag, filter, nickname | 200, the profile |
delete_user | Bearer token and password | 200, email, guid; the account is gone from every site |
resetpass | email, subject, template | 201, for any email |
changepass | email, token, password | 201; 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
| errorno | Status | When |
|---|---|---|
| 1001 | 422 | email missing or not an address |
| 1002 | 422 | password not 8 to 72 characters |
| 1003 | 422 | code not 6 characters [a-z0-9] |
| 1004 | 422 | template name malformed |
| 1005 | 422 | no such template |
| 1006 | 422 | subject missing or over 150 characters |
| 1007 | 401 | no Authorization: Bearer <token>, or malformed |
| 1009 | 422 | refresh_token missing or malformed |
| 1010 | 404 | the URL's app is not one of this site's apps |
| 1011 | 422 | a profile field is too long |
| 1012 | 422 | brand or brand_color/brand_style/brand_icon not allowed |
| 1013 | 401 | no valid X-App-Key |
| 1014 | 422 | nickname not 2 to 24 letters, digits or single hyphens, or reserved |
| 1015 | 409 | nickname taken by another account |
| 2001 | 401 | wrong email or password (one message for both; also create_user with an existing email and another password, and delete_user with a wrong password) |
| 2002 | 403 | account not confirmed yet |
| 2003 | 422 | wrong confirmation code |
| 2006 | 409 | already confirmed |
| 2008 | 422 | wrong reset code |
| 2014 | 401 | token unknown, expired, rotated or signed out |
| 2015 | 422 | code expired or out of tries: request a new one |
| 3002 | 500 | server error |
| 3004 | 429 | too 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
| Action | Fields | Success |
|---|---|---|
start | install_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 ended | 200, session, started_at, ping_seconds, account, parameters |
ping | session; optional errors | 200, ok, parameters |
end | session, reason (normal, crash, killed); optional duration_seconds, errors | 200, 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
| errorno | Status | When |
|---|---|---|
| 1010 | 404 | the URL's app is not one of this site's apps |
| 4001 | 422 | install_id missing or malformed |
| 4002 | 422 | platform not one of the names above |
| 4003 | 404 | session unknown: stop pinging, start again next run |
| 4004 | 422 | a field too long, or a count not a whole number |
| 4005 | 422 | reason or previous_reason not allowed |
| 4006 | 401 | no valid X-App-Key |
| 3002 | 500 | server error |
| 3004 | 429 | too 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:
| Header | Value |
|---|---|
X-App-Time | The current Unix time in seconds. |
X-App-Key | A 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.
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.