Monorepo for Aesthetic.Computer aesthetic.computer
README.md

Picture toolkit #

src/media/picture.mjs creates a portable 512 × 512 picture. It stores accepted layers and a pending proposal in picture.json, renders the current proposal in preview.png, and exports accepted layers to composite.png. Accept adds a layer; discard does not touch accepted pixels. The shared Aesel artifact store owns revision numbering and rollback of these files.

ac-line.mjs vendors the exact nopaintProposal contract from system/public/aesthetic.computer/disks/line.mjs and seeded PRNG from lib/nopaint-proposals.mjs. Its generator, bounded geometry, and render score are AC's Line brush. The portable CPU ink().line() implementation rasterizes round segments without AC runtime dependencies; it does not promise pixel identity with every AC renderer. A test compares the vendored proposal with its source. The toolkit is distributed by Aesthetic Computer under the Aesel license.

Use propose with a seed and optional RGBA color, thickness, and points, inspect its preview, then accept or discard. import_png accepts an existing file inside the artifact directory. Layer opacity and visibility remain editable. Source assets are content-addressed. Import supports 8-bit noninterlaced gray, RGB, and RGBA PNG, up to 2048 × 2048 / 32 MB; convert JPEG/indexed PNG first.

Illy's explicit provider/model selection and .illy.json provenance contract are preserved by illy.mjs. The installed registry supplies gpt-image-2 and fal Flux generate/edit routes. Actual model availability depends on the user's provider account. Credentials come only from OPENAI_API_KEY / FAL_KEY in the process environment, never a studio vault or a project file. No automatic provider fallback, paid POST retry, or subscription entitlement is assumed.

image_plan is free. generate requires an explicit provider, model, user prompt, unique job ID, and paid-action authorization. The caller must obtain that authorization outside model-authored tool arguments. Job receipts survive failures; the same job ID cannot be submitted twice. Returned provider bytes are retained in jobs/ before PNG validation, including unsupported outputs. Paid image results become proposals. Generation has a ten-minute bound.

This first adapter does not offer automatic queue reconnect, remote cancellation, hosted billing, partial provider images, a freehand pointer editor, arbitrary brush plugins, or JPEG decoding. The shell can show every raster revision now.

Publish as an AC painting #

/publish explicitly publishes the current accepted composite.png through the existing AC painting pipeline: a user-bucket upload grant, PNG upload, and /api/track-media registration. AC assigns the painting's #code; this is the existing bitmap short identifier, not a new descriptive hashtag system. Pending proposals are excluded. Accept the proposal first if it belongs in the painting.

The client verifies the code's owner/slug and the public PNG hash before exposing its painting URL or /qr. It does not upload recordings, source recipes, prompts, or layers. Public registration retains the backend's existing painting/profile and ATProto behavior. There is no Picture autopublish.

A receipt under .aesel-media/publications/<artifact>/vN.json records the exact accepted output and server result. It stores neither auth tokens nor presigned query credentials. A retry resolves a lost upload/registration response before proceeding; an unresolved outcome reports that fact rather than creating another painting. A new local version has no public QR until explicitly published.