.akr packs.
Catalog URL
Catalog URLs are HTTPS JSON endpoints. Command examples use this placeholder:akron.micr.dev catalog routes and rewrites reserved asset paths to Cloudflare R2:
Players and catalog entries should use the Akron-branded URLs. Raw R2 URLs are a storage fallback, not the public catalog contract.
JSON shape
The catalog is a JSON document with the following structure. Replace angle-bracket placeholders with valid HTTPS URLs:Pack fields
The
section field must be one of the following values:
All, StartPos, Auto Kill, and Auto Deafen.
Publishing guidelines
Each catalog entry must point to a.akr file for a specific map and sharing scope.
Before adding archives to the catalog, ensure that:
- The
mapSidmatches the Celeste map SID. - The
downloadUrlis a stable HTTPS URL for the.akrfile. - Catalog metadata is updated whenever the pack changes.
- The
.akris no larger than 4 MiB. - Optional catalog image sources are no larger than 100 MiB before optimization.
- Optimized catalog images stored in R2 are no larger than 4 MiB.
Catalog validation
Before publishing, verify the catalog-facing pack contract:- Verify that the archive contains exactly
manifest.jsonandsetup.json. - Verify that the manifest
Kindissetup. - Ensure that
setup.jsonuses theakron-setup-v2format. - Verify that the entry
sectionmatches the setup section, unless a different scope is intended. - Confirm that the download URL returns the expected
.akrarchive. - Reject
Wholesetup packs from the public Discord catalog.
- Open archives in memory and never extract uploaded archives to the filesystem.
- Reject absolute paths,
..traversal, nested archives, unexpected files, suspicious compression ratios, oversized JSON payloads, and suspicious command-like or credential-like text.
Storage and publication architecture
The official catalog separates unreviewed upload storage from public catalog storage. In-game uploads go to the Upload Worker first. The Worker stores source.akr files and marked-room captures in a private quarantine bucket, records batch, submission, and object state in its database, and exposes signed bot-only endpoints for moderation. Nothing from quarantine is public.
The Discord bot polls the Worker for queued jobs, posts moderation messages, handles attribution confirmation, and sends approve, reject, or request-changes actions back to the Worker. Moderation messages should attach every marked-room capture and expose next/previous controls when Discord-side pagination is needed. Approval is the only path that copies a pack into public catalog storage.
When a submission is approved, the Worker writes the .akr archive to the public pack path, transforms each marked-room capture into an optimized catalog preview image, stores those previews at the public capture path, and rebuilds catalog/index.json with an images array. The public website serves branded Akron URLs and routes the reserved catalog and map asset paths to the public storage objects.
Operational capacity depends on the number and size of approved public packs, optimized preview images, retained quarantine objects, catalog refreshes, pack downloads, and image transformations. Keep provider quotas in deployment configuration and monitoring, not in the player-facing catalog contract.
Runtime logic
Akron filters catalog entries using the following criteria:- Current map SID.
- Selected category.
- Search terms against title, description, author, map URL, section label, and tags.
Saves/AkronSetups/community-*.akr and imports the declared scope.
Automation commands
Debug and live verification can drive the same browser flow:list prints the currently filtered zero-based entries. import uses the same download and scoped import path as the in-game button.