Studio setup for web developers
The Studio download contains the full source of both editions, a deploy tool for Cloudflare and the technical documents. This guide is the short version for people who would rather run each step themselves.
- Best for
- Web developers and IT teams who would rather install Studio themselves, from the source in the Studio download.
- You need
- The Studio download; for the PHP edition, an Apache, LiteSpeed or nginx host with PHP 8.0 or newer; for the Cloudflare edition, a Cloudflare account with R2 turned on and Node.js 20 or newer.
- Editions
- Two editions of the same app with the same URLs, upload API, dashboard and roles: a database-free PHP app, and a Cloudflare Worker backed by R2 and D1.
Get the Studio download
Sign in to Maxisnap with the account that has Studio, then:
- On Windows: in Maxisnap, open Settings → Account → Maxisnap Studio setup wizard, click “Get started”, then “Download dashboard”. Maxisnap saves the Studio ZIP to your Downloads folder and opens that folder.
- On a Mac: in Maxisnap, open Settings → Welcome & Help → Studio Setup Guide, click “Get Started”, then “Download Dashboard”. Maxisnap saves the Studio ZIP to your Downloads folder.
Extract the ZIP. On Windows, right-click it and choose “Extract All”. On a Mac, double-click it.
Maxisnap-Studio-v<version>/
Maxisnap Studio - Start Here.html guided setup (branding + every route)
snaps/ PHP edition: upload this folder to a web host
cloudflare/ Cloudflare Workers edition (Worker + R2 + D1)
deploy/cli.mjs deploys it through the Cloudflare API (Node 20+)
docs/Developer guide.html architecture, upload API, security, updates
docs/Cloudflare setup - technical brief.html
AGENTS.md instructions for AI coding assistants The full Developer guide covers the architecture, the upload API, keys and roles, the security model and troubleshooting. It is docs/Developer guide.html in the download.
PHP edition: upload and finish setup
- Upload the snaps folder to the web root, including its hidden .htaccess files, so that the result is public_html/snaps/index.php. A branded snaps.zip from the Start Here page works the same way; extract it in place and don’t nest snaps/snaps.
- Open https://yourcompany.com/snaps/ once. The setup page checks PHP and the folder permissions and suggests an Admin key of 40 characters; the key must have at least 16. Copy it, then click “Create my dashboard”.
- On nginx, reproduce the routing and deny rules from snaps/.htaccess. Keep uploads, data and branding private.
The setup page writes your-settings.php, which is kept across updates:
'dashboard_key' => '…', // the Admin key; the setup page writes it
'base_url' => 'https://yourcompany.com/snaps', // the address setup was opened at; fix it here if share links come out wrong
'max_upload_mb' => 500, // your host's PHP limits still apply Cloudflare edition: deploy from a terminal
The bundled CLI reads the account first, shows a plan of what it will create and what it will not touch, and refuses names that are already in use. If a deploy stops part-way, running the same command again continues without creating anything twice.
cd cloudflare
# Option 1: the bundled CLI (Node 20+; plan first, then --yes). PowerShell:
$env:CLOUDFLARE_API_TOKEN = "<token: Account Settings Read; Workers Scripts, R2 and D1 Edit;
for --zone/--hostname also Zone Read, DNS Read, Workers Routes Read>"
node deploy/cli.mjs whoami
node deploy/cli.mjs plan --account <account id> --name snaps
# no workers.dev name on the account yet? The plan asks you to "Choose your free
# workers.dev name": add --subdomain <your-company> to both commands (account-wide).
# A subdomain of your domain as well: add --zone <zone id> --hostname snaps.example.com
node deploy/cli.mjs deploy --account <account id> --name snaps --yes
# prints the Studio address and the Admin key once, and writes deployment.json here
# Option 2: plain Wrangler (create the bucket and database, set their ids in wrangler.jsonc)
npm install
npx wrangler r2 bucket create maxisnap-studio-media
npx wrangler d1 create maxisnap-studio
npx wrangler secret put ADMIN_KEY
npm run sync
npx wrangler deploy The deploy prints the Studio address and the Admin key once, and writes deployment.json in the folder it runs from. Keep that file: update and remove use it.
Check that it works
curl.exe -s -H "X-Dashboard-Key: <Admin key>" https://<studio address>/api/health.php
# {"ok":true,"app":"Maxisnap Studio","version":"…"} the Cloudflare edition adds "edition":"cloudflare" Then open the Studio address in a browser and sign in with the Admin key. 401 means a wrong key; 404 means a wrong address or folder.
Connect Maxisnap
- Maxisnap for Windows: open Settings → Account → Maxisnap Studio setup wizard, click “Get started”, then “Next” until step 4, “Connect Maxisnap”. Paste your Studio’s address and key, click “Test connection”, then “Next”, then “Finish & Save” on the last page. The Admin key from setup works, and so does an upload code from People & access in your dashboard.
- Maxisnap for Mac: open Settings → Welcome & Help → Studio Setup Guide and choose “I already have a dashboard”. Paste your Studio’s address and key, click “Test Connection”, then “Next”, then “Finish & Save”.
Know the upload API
- The Maxisnap apps upload with an X-Dashboard-Key header to api/upload.php. Images (PNG, JPG, GIF and WebP) and videos (MP4, WebM and MOV) are accepted.
- Maxisnap for Windows and Maxisnap for Mac send each upload to a Cloudflare Studio in one request, which it accepts up to 25 MB per file.
- The Cloudflare edition also has a chunked upload API for larger files, described in the Developer guide: api/upload/start, part and complete.
- Share pages and their media files use these paths; every other path is internal:
/<slug>/<slug>.<ext>
Update or remove it later
PHP: replace only the files listed in snaps/How to update.txt, then clear the host and CDN caches. Captures, people, branding and settings stay.
Cloudflare: run these from the cloudflare folder of the newer package, with the old deployment.json copied in.
# Update: from a newer package's cloudflare folder, with the old deployment.json copied in
node deploy/cli.mjs update --record deployment.json --yes
# New Admin key (shown once):
node deploy/cli.mjs update --record deployment.json --yes --new-admin-key
# Remove the custom domain and the Worker; the bucket and database (the captures) stay
node deploy/cli.mjs remove --record deployment.json --yes
# Also delete every capture: cannot be undone
node deploy/cli.mjs remove --record deployment.json --yes --delete-data Read the Cloudflare technical brief: every resource, permission and API call.
If something goes wrong
The health check answers 401
{"error":"unauthorized"}
The key is wrong, disabled or shorter than Studio accepts, or setup has not finished on a PHP host. Send it in the X-Dashboard-Key header, never in the address.
The health check answers 404, or HTML instead of JSON
The address or folder is wrong, the host ignores Studio’s .htaccess rules (nginx, or Apache without rewriting), or a CDN or security layer answers instead of Studio. On nginx, reproduce the routing and deny rules from snaps/.htaccess; the Developer guide lists them.
The health check answers 429
Too many incorrect codes. Wait a few minutes before trying again.
After repeated wrong keys, Studio refuses further attempts from your network for 15 minutes. Wait, then try again with the right key.
Uploads answer 403 on a custom domain
Cloudflare Access, a WAF rule or Bot Fight Mode on that hostname blocks the apps’ uploads. Exclude the Studio hostname; the technical brief has the checklist. A Viewer code also gets 403 on uploads: use the Admin key or an upload code.
Uploads answer 413
On PHP, upload_max_filesize, post_max_size or a host or CDN limit is below the file size; Studio’s own limit is max_upload_mb in your-settings.php.
On Cloudflare, one request may carry up to 25 MB; larger files need the chunked upload API.
Every page of a Cloudflare Studio answers 503
This Studio is not set up correctly: its ADMIN_KEY secret must be at least 16 characters.
Set a longer ADMIN_KEY secret, for example with the update command and --new-admin-key, or with npx wrangler secret put ADMIN_KEY.
The plan stops with an “x” line
Each “x” line is a blocker, and it says what to do: turn on R2, add --subdomain for an account without a workers.dev name, or change --name, --zone or --hostname when a name is invalid, taken or outside the domain. Then run the plan again. Bucket and database names that are taken get the next free name without a blocker.
The CLI refuses deployment.json
deployment.json belongs to the Studio "snaps". Keep it, and pass --record <another file> for this one.
Each Studio has its own record. Keep that file and give the second Studio another one with --record. Without any record, update and remove cannot run; pass the path of the right file.
A workers.dev Studio shows “Error 1027”
The free plan’s daily request limit was reached. It resets at midnight UTC.
Still need help?
Email us and a person will write back, usually within one business day. These details help us answer in one go:
- The setup option you chose and the step you are on.
- A screenshot of the screen, with any error message in full.
- Where your Studio is going: a new or existing Cloudflare account, or the name of your web hosting company.
- Your Maxisnap version: on Windows in Settings, then About; on a Mac under Maxisnap, then About Maxisnap.
Please don’t send your Admin key, a Cloudflare key or a password. We don’t need them to help you.
Other setup guides
- I don’t have a website
Put Studio in a free Cloudflare account
- My business already uses Cloudflare
Add Studio to your business’s Cloudflare account
- I have web hosting
Install Studio on your web hosting
- My AI assistant will set it up
Let your AI assistant set up Studio
- I already have a Studio
Connect Maxisnap to your Studio