.akr packs.
Catalog URL
Remote catalog URLs are HTTPS JSON endpoints. Local testing can use an explicitfile:/// index path. 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 three community-supported values:
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 512 MiB. - Optional catalog image sources submitted through Akron are no larger than 24 MiB before optimization.
- The
imageslist and legacyimageUrlslist each declare no more than 16 entries. The legacyimageUrlfield can add one single preview. Akron removes duplicate URLs when it builds the preview list. - Optimized catalog images are no larger than 2 MiB, no wider or taller than 2048 pixels, and no larger than 4,194,304 pixels in total.
Catalog reader limits
The official in-game upload flow accepts StartPos, Auto Kill, and Auto Deafen packs. Auto Kill and Auto Deafen areas are coordinate-based setup state, so catalog maintainers should reject area packs when the submitted map SID does not match the map those areas were created for.
One in-game upload captures at most 10 marked rooms. For StartPos uploads, Akron orders candidate rooms by the lowest saved StartPos slot in each room before applying that limit.
Catalog validation
Before publishing, verify the catalog-facing pack contract:- Verify that the archive contains
manifest.json,setup.json, and the exact v10 snapshot entry named by each StartPos. - Verify that the manifest
kindissetup. - Ensure that
setup.jsonuses theakron-setup-v7format. - Verify that the entry
sectionexactly matches the setup section. - Confirm that the download URL returns the expected
.akrarchive. - Reject every section except
StartPos,AutoKill, andAutoDeafen.
- 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.
The StartPos, Auto Kill, and Auto Deafen Discord forums are bot-authored showcases for approved catalog packs. Members can read and reply, but cannot create posts there. Keybind, HUD, audio, and recorder forums still accept direct member posts and remain outside the map catalog.
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.