Repository navigation
AppTown v1.0.0-rc.12
Pre-releaseFlokkit AppTown v1.0.0-rc.12
RC12 removes machinery that nothing used, makes cleanup of leftover containers
the default, narrows what AppTown counts as its own at a deployment target, and
builds a release once, as a candidate, before its version tag exists. A project
can now adopt several packs. It includes all changes since RC11. Several changes are breaking; read
"Breaking changes" before upgrading. Take matching database and file backups
before upgrading, as described in the
upgrade guide.
Breaking changes
Startup and operation:
- Cleanup is on by default;
-reapis removed. The periodic cleanup of step,
service and chat containers and networks, unwatched previews and their kept
builds, images, toolchain caches and finished workspaces now deletes instead
of only logging.apptownd -disable-reap(APPTOWN_DISABLE_REAP=true) turns
deletion off. A command line that still passes-reapstopsapptownd;
APPTOWN_REAPis no longer read. Remove both from service files, including a
systemd drop-in that setsAPPTOWN_REAP. Cleanup cannot tell two AppTowns'
containers apart: give a second AppTown on the same Docker daemon its own
daemon, or run both with-disable-reap. - The update supervisor is removed. The
-update-supervisor-socketflag is
gone (passing it fails start-up),bin/apptown-updateis no longer shipped and
the managed supervisor guide is removed. The Updates page still checks signed
release information and shows how to install a newer release.
UPDATE-MANIFEST.jsonis format 2; builds before RC12 cannot read it and show
the release check as failed or stale, so update those by hand once. The
notification cache moves to<data>/release-checks; delete the old
<data>/instance-updatesfolder. - Host-process execution is removed.
apptownd -agent-executorand
-host-scriptsare unknown flags andAPPTOWN_AGENT_EXECUTORand
APPTOWN_HOST_SCRIPTSare not read. Agents and scripts run only in
containers. A workflow that names an executor other thandockeris refused
when saved; a run admitted earlier withexecutor: localstops at that step. - Private Docker is on by default.
-no-private-dockeris removed and
APPTOWN_NO_PRIVATE_DOCKERis ignored. Use-private-docker=false
(APPTOWN_PRIVATE_DOCKER=false). With a worker,docker: truesteps and release
builds run there without opting in. - Docker's buildx plugin is required. AppTown no longer falls back to
Docker's legacy builder whendocker buildx versionfails: the build is refused
before anything is sent. Installdocker-buildx-pluginbeside the docker CLI
AppTown runs (AppTown's published images include it). Check-image and
agent-image builds now also require buildx and the daemon's own builder, as
deployment builds already did. - PostgreSQL major version is checked at start. AppTown supports a range of
PostgreSQL majors for its own database, built in or-db-url(today 16 only).
apptowndrefuses to start on a server outside the range and names it.
Backups and restores check the same range. - Data folders from before 1.0.0-rc.9 are refused. Upgrade with RC9 to RC11
first. Whole-AppTown restore accepts only backups taken by RC9 or later; an
archive with linked or borrowed workspace Git metadata is refused. The
data-folder layout 1-to-2 upgrade is removed; new installs write layout 2.
Backups:
- Whole-AppTown backups hold AppTown only. Built-in deployments are filled on
restore from their own newest whole deployment backup. One whose data did not
come back is kept out of automatic rebuilds (a new restore check,not-filled)
so a restart does not start it on empty data; releasing it is the decision to
start it without that data. The manifest no longer lists deployments. pg_dumpruns in a pinned container, on AppTown's own Docker when it has
one, otherwise on its worker. The host'spg_dumpis no longer used. A
-db-urldatabase must be reachable from a container: a loopback host is
refused.sslrootcertin-db-urlis honoured;verify-caandverify-full
without one verify against the image's system roots. On a worker the gzipped
dump is one result of at most 64 MiB; a larger one is refused. Backups with
-no-local-dockerneed the worker and AppTown upgraded together. The first
backup on a host pulls the pinned postgres image.scripts/apptown-db-backup.shis removed from archives and the image. Take
apptownd backupbefore upgrading; the upgrade guide describes rolling back from
that archive.
Targets and deployments:
- Inventory counts only resources carrying this installation's mark. Every
resource AppTown makes at a target carries the installation's id (a Docker label,
a Portainer stack variable, an App Platform spec variable, a DigitalOcean database
tag, or a private_apptown/instanceobject in a bucket-website bucket).
Resources without the mark only confirm recorded deployments; only a marked
resource that nothing records is reported as not accounted for or can be removed
from the infrastructure page. Resources made by a person or script, such as the
database AppTown runs on, are no longer listed. At each start AppTown marks
managed database clusters and bucket-website buckets that deployment records
name; Docker objects, Portainer stacks and App Platform apps gain the mark at
their next release. A target kind with no inventory reader shows as unknown
rather than an error. - Health is judged one way. With no declared
expect, a 4xx or 5xx answer at
the health path is no longer ready on Docker and Portainer, for HTTP liveness
probes, or in a restore rehearsal's sealed boot. An app whose health path
answers 404 must fix the path or declareexpect: 404. On App Platform a
redirect at the health path now counts as ready (it is not followed). .forge/app.yamlis no longer read. Only.apptown/app.yamlat a commit
is the app contract (a regular file, at most 1 MiB; links are refused). A commit
whose contract is only at.forge/app.yamlreads as having none, which affects
redeploying or restoring a release built from it.- Resource limits are flattened to three levels: the deployment's override,
else what the app declares for its profile, else AppTown's default. A pack can no
longer declare resources;clears: [resources]is refused. An app part that
declares no memory gets 512Mi at its next release. An unattended pack update from
a publication that declared memory is refused. secretsDeliveryanddeploymentPolicyare removed.secretsDeliveryis
gone from target responses and the target page (migration 183).deploymentPolicy
is refused when creating a deployment (400, unknown key) and no longer appears in
deployment, tier, target-page or MCPget_projectresponses.- Release setup and
promoteAfterare removed. Theapptown release-setup
command, the route, imported setup state and the per-deployment promotion toggle
are gone. Promotion permission is needed only for protected deployments;
admitted releases keep their recorded requirement. ThepromoteAfterattribute
is removed. - Legacy Portainer confirmation is removed. Other Portainer targets without a
recorded endpoint must be attached again. A deployment whose stored URL does not
match the recorded hostname rule, or whose host another deployment claims, gets
a new generated hostname at its next release. - The storage-bindings routes are removed; the next deploy records the binding.
Ways of working (a project takes several packs):
- A project adopts one or more packs, none above another, and packs no longer
include one another. Migration 192 drops the single primary pack name and
pack inclusion. New receipts carrypacks(sorted names, platform included)
instead ofpack; an old receipt'spackkey is no longer read. - Stock packs are reorganised. Retired (turned off at sync; a project on one
keeps working until moved):go-small,node-fullstack,django-htmx,
java-spring,rust-serviceandwordpress-bedrock. New:server-base,
go,node,django,java,rust,wordpress,postgres,vite-react
andserver-rendered.railsanddotnetkeep their names but hold only
backend content, and their old contents clash withserver-base. Guidance
blocks withdrawn:frontend/vite-typescriptand
lang/selection/typescript-for-web(nowfrontend/vite-react),
frontend/hypermedia-htmx(nowfrontend/server-rendered) and
observability/error-reporting(its rules are in the errors integration's
generated steering section). Starter folders take the backend pack names. - Pack declarations lose
includes,replaces,drops,clearsand
starter; saving one that has them is refused. - Operator steps after upgrading. A release never recommends a stock version
by itself: recommend the new versions ofrailsanddotnet(and of
frontend-only,conventions-only,video-gameandgodot-3d), then move
projects off the retired packs. Until then a project with a revision shows an
adoption drift note (display only). Moving a project drops its own guidance
additions. An uplift change opened before the upgrade and not landed cannot
settle: it is closed as superseded when the project moves; open it again after. An eval running across the
upgrade must be run again. - HTTP, MCP and CLI use pack lists.
POST /projects/{slug}/packtakes
{"names": [...]}({"name"}is refused) and answerspacks;
POST /projectstakespacks;POST /packs/interviewdecisions carry
packs;POST /projects/{slug}/pack/pullrequirespack. MCP
create_projecttakespacksandget_projectandlist_projectsanswer
packs. CLI:apptown pack -p <slug> <pack>...,apptown new --pack a,b,c,
andapptown pack versionsno longer prints inclusion. - A chat whose project guidance cannot be compiled is refused at open; it
used to open with the guidance silently left out.
Commands, containers and jobs:
- Docker settings are read one way.
apptown dev,apptown config validate
andapptown-workeruseDOCKER_HOST,DOCKER_CONTEXTand the saved context.
Atcp://orssh://Docker context now counts as another machine (before,
only atcp://DOCKER_HOST). A Docker setting that cannot be read is an error:
the worker refuses to start and the CLI refuses. apptown config validatesends the secrets file the contract declares
(secrets.spec), not alwayssecretspec.toml.- Step containers are named
apptown-step-<id>-<what>. Containers running
under the old names at upgrade are not stopped by an interrupt. - Jobs queued under the old narrative keys fail once at upgrade:
workflow-completion<run>/narrativeandworkflow-abandonment
run/<id>/narrative. The narrative refreshes on the next trigger; a "landing
ended" chat note queued before upgrade is lost. - Scanner health, connector health and the integration list say "could not be
read" when Docker cannot answer an image inspect, instead of "missing", and
no longer pull. - The agent's repository on a worker takes its base branch from the fork point
from main. A change with no history in common reads against its recorded base. - The
agent-reportedartifact kind is reserved: gates and artifact
requirements no longer see artifacts of that kind. The stored request gap holds
up to 700 bytes (was 400). - New small containers. AppTown starts one standing disk reader per Docker
host it reads (apptown-reader-disk-reader-*) and one readiness container per
Portainer-managed deployment (classreadiness-<deployment id>, removed with the
deployment). The capacity view counts them as AppTown's own. - A command given an unknown flag prints its usage lines from the help table.
scripts/chat-check.pyopens and abandons a change in the project it checks,
which must be repository-backed.
Records, roles and identifiers:
- Tables and records removed (migrations 182, 183, 185 to 191): allowed
authorization decisions (the decision object has noreceiptId; a denial is
still written to the activity log), one stored row per model call (usage reports
andapptown_inference_*telemetry are unchanged; the gateway no longer answers
503 "cannot record inference admission"), an integration's earlier
configurations, deployment need-fulfilment passes, the old integer ID table and
audit references, project address aliases, and unused delegation columns. The
tables are dropped with their contents. - Pre-1.0 integer links stop resolving. Links and API paths naming a change,
run, step, ADR or guidance block by its integer return 400 with no redirect. - A renamed project's old address resolves nowhere (pages, API, MCP, Git URLs,
slug#N, CLI inference from a folder name), and another project can take it.
PATCH /api/v1/projects/{slug}no longer usesrequestId. Backup and rebuild
jobs queued by an older build fail once and are asked again. - Roles removed:
integration-administrator,group-viewer,
group-project-creator,group-maintainerandgroup-auditor, and grants at
change, run or dimension scope, are refused and existing ones are deleted.
Release manager is granted at a release target. OAuth connection records drop
unused fields. - The worker qualification verdict is removed. Agent-step evidence no longer
hasprivateDocker; a release bundle's build record replacesqualification
withprofile, the worker's measured facts for that build. Earlier records keep
their old text, which nothing reads. External-worker test settings are now
APPTOWN_EXTERNAL_WORKER_*andAPPTOWN_EXTERNAL_WORKER_DISK(were
APPTOWN_QUAL_WORKER_*andAPPTOWN_QUAL_DISK). - CLI wording:
apptown changesandapptown showprint "in progress"
rather thanin_progress, and a change closed as a record reads "finished". Their
--jsonoutput gainsstateLabel.
New and improved
- Cleanup removes leftovers by default, so installs that never set a flag no
longer fill their disks. What each sweep selects is unchanged: only resources with
AppTown's labels or in its data folder, never deployments, and nothing in use or
whose owner cannot be read. - Chats on a worker keep their files. The worker's start-up cleanup keeps a
blob that any chat container, running or stopped, still mounts, and removes none
when Docker cannot say. Waiting for the chat terminal ends at once with its reason
on any failure other than "not started yet", instead of waiting ten minutes. - Backups of large files. Backup store files upload in parts with no
single-upload size limit, each part and the whole object checked, and nothing
left behind on failure. A whole-AppTown backup is possible again with
-no-local-dockeron a managed database. - Bucket-website targets have an inventory reader, so their pages and the
inventory job no longer fail with "has no inventory". - One rule each for five things that several places judged differently:
readiness, step spend ("Where the time goes" now sums each step's usage ledger
and says "at least" or "spend unknown"), change state words (the server sends
stateLabel), the app contract at a commit, and image builds. - Release process. A release is built once as a candidate before its version
tag exists and those bytes are qualified (an upgrade rehearsal, a native Mac
install and a chat on a worker) and then published. CI reuses Go test results from
main's fresh runs for identical inputs. The frozen RC11 upgrade fixture is
included, and the upgrade rehearsal is restored. - Superseded adoption changes close themselves. When a project's pack set
changes, its open uplift changes that take a pack the set no longer has (or an
older version) are abandoned in the same transaction, with the reason
"superseded: ...". A blocked change carries anabandonnext act, and the
change page and the Home "Needs you" row show "Close it" to a reader who may
abandon it. - Several packs per project. A project can adopt more than one pack, and the
stock packs are split into a sharedserver-baseplus one pack per language,
framework or database, so a project composes what it uses. - Guidance items can carry on-demand skills. An item's always-read part stays
short; its how-to moves to a named skill an agent loads when needed. MCP
get_project_guidancereturns the shortenedtextand a newskillslist, and
the HTTP project guidance sizes show what agents read up front.
build/container-imageanddata/networked-databasehave new stock versions. - Change summaries and refusals are more honest. A change summary reads the
whole request and diff, says what it did not read, and says what would satisfy
it. Refusals say what would satisfy them (text only; codes are unchanged).
request_change_landingtakes an optionalreportargument. - Quieter hosts. An idle toolchain-cache sweep starts no containers (it reads
volumes again only after a change closes or a run stops), disk readings use one
standing reader container per Docker host, and Portainer readiness samples start
no container each time. apptown waitsays "reworking" correctly. Run snapshots carry
sentBack {stepId, step, by, note}, so a person's send-back reads as reworking.
A Docker or Portainer release marker with surrounding white space is accepted.- Split installs with Docker. Compose files for AppTown and for the worker are
shipped indeploy/split-install/. - Release downloads. Each release archive is its own candidate artifact, and
the recovery rehearsal takes the candidate from a file on the target host.
Published bytes andSHA256SUMSare unchanged. - Backup guide and
apptownd backupdescribe restoring an archive taken from
an external database on a new host's built-in database.
Declaration changes
Packs can no longer declare resources, and no longer use includes, replaces,
drops, clears or starter (see Breaking changes). Guidance items may carry
skills. No other application-contract, workflow, check, scanner or pack
declaration fields are added.
HTTP API changes
These changes are relative to RC11. The HTTP API remains experimental. The
OpenAPI description
contains the available route definitions.
- Removed:
GETandPOST /api/v1/targets/{name}/provider-association,
.../deployments/{id}/address/observation,
GETandPOST /api/v1/projects/{slug}/deployments/{name}/storage-bindings,
POST /api/v1/projects/{slug}/release/default/setupand
PUT .../deployments/{id}/promotion-policy. - Removed: the integer-ID routes
/adrs/{id},/changes/{id}and
/guidance/{id}. GET /api/v1/instance-updatesandPOST /api/v1/instance-updates/checkno
longer returnsupervisorState,supervisorReason,supervisorPhase,
automaticReplacementorreplacementReason.- Deployment responses drop
requirePromotion,policyRevisionand
promoteAfter;release/defaultdropslegacySetup; address responses drop
verifiedandlegacyEvidence; target responses dropsecretsDelivery;
deployment, tier, target-page and MCP responses dropdeploymentPolicy, and
POST .../deploymentsrefuses it. - The authorization decision object has no
receiptId. - Agent-step evidence drops
privateDocker; release bundlebuiltFrom.build
dropsqualificationand addsprofile. - Change state responses (change detail, board and lists, chat changes, an
integration's wiring change) carrystateLabel. PATCH /api/v1/projects/{slug}no longer usesrequestId.- Pack lists replace the single pack name as described under Breaking changes;
GET /wowlosesnotOn,GET /packs/{name}losesfollowRefused,
includedPackandincludedVersion, and the current adoption view losespack. - Run snapshots gain
sentBack; activity run rows carrynext; project guidance
effective.textholds only the always-read part, with skills listed separately. - Target inventory reads report a target kind with no reader as unknown.
Deprecations
None.