Repository navigation
AppTown v1.0.0-rc.7
Pre-releaseFlokkit AppTown v1.0.0-rc.7
The seventh candidate for 1.0. It replaces RC6 as the candidate running in
production with the maintainers, and the two-week run before 1.0 starts on
it, on 24 October 2026.
RC6 was never run for its two weeks. The maintainers' production AppTown
left RC6 on its first day, 23 October, and ran builds of main until this
candidate. So RC7 is also the first candidate to run in production with
RC6's own changes, including its fixes.
RC7 gives the certificates of a company's TLS-inspecting proxy to every
container and build AppTown starts. It backs up and restores a whole
AppTown with one command each way. It removes the move from the names
things had before 1.0, which RC6 added. It fixes two defects that showed
up as intermittent test failures, clears the open dependency advisories,
and makes the shipped guides' links work on GitHub.
In short
- Behind a company's TLS-inspecting proxy, everything AppTown starts
trusts the company's certificate authority. Agent, script, test and
check steps, chats, screenshots, scanners, image builds, previews and
deployed apps get the certificates given with-trust-deployments. RC6
covered only AppTown's own connections. apptownd backupandapptownd restoreback up and restore a whole
AppTown. The archive is always encrypted with a passphrase. After a
restore, AppTown checks App Platform and Portainer deployments against
what their providers run and takes them over again.apptown move-namesand its route are removed. They came in RC6.
Every deployment must be named by its key before upgrading; migration 167
stops the upgrade otherwise and names each one.- Fixes: a landing's deploy is no longer cut short when its run is
abandoned, and a cancelled database statement now fails as cancelled
instead of as a network timeout. - Dependencies: the open Go and npm advisories are fixed, and CI fails
on a new high or critical npm advisory. - The WordPress starter's theme is
apptown-sitefor new projects. - The tour on apptown.dev is made by the release itself, from the
tagged source. - RC7 has two database migrations, 166 and 167.
What changed
Extra certificate authorities in containers and builds
RC6 let AppTown's own connections trust extra certificate authorities, with
-trust-inference, -trust-deployments and -trust-apptown. The
containers AppTown started did not trust them, so a step that downloaded a
package behind a TLS-inspecting proxy failed. Now the -trust-deployments
certificates go to everything AppTown starts. With -local-tls, AppTown's
own local authority goes too, but only to containers on that machine.
- One script,
APPTOWN_TRUST, adds the certificates beside the image's
own roots, never in place of them. It sets the variables programs read
(SSL_CERT_FILE,NODE_EXTRA_CA_CERTS,REQUESTS_CA_BUNDLEand
others), apt's setting, the JVM's trust store (through
JAVA_TOOL_OPTIONS), Chromium's store, and, as root outside a build, the
system store. With no certificates set, it does nothing. - Agent, script, tests and check steps, chats and screenshots run it
before their command, and again after installing the project's declared
toolchain, so a JVM thatmiseinstalls trusts the certificates too.
Scanners that use the network run it first. - The private Docker daemons of steps, chats and release builds, and
the builder inside them, trust the certificates for their own pulls. - Every image AppTown builds (previews, releases, check images and the
agent image, including a worker's at its first start) gets the
certificates as the build secretapptown-trust. The twelve starter
Dockerfiles mount it in eachRUNthat downloads. Building with the
secret needs buildx (Docker 23 or later). - Deployed apps and previews on Docker hosts, Portainer and App
Platform get the variableAPPTOWN_TRUST, and the starters' start
commands run it. Attached hosts, Portainer and App Platform never get the
local authority. Acommand:in.apptown/app.yamlreplaces the image's
CMD, so it must runeval "${APPTOWN_TRUST:-}"itself if the app calls
out. - An image with no shell cannot run the script and keeps only its own
roots. Thego-smallstarter's distroless runtime is one. - The
build/container-imageguidance says how a Dockerfile uses the
secret and the variable. Projects started before RC7 keep their
Dockerfiles, so they add the lines themselves. - Every
apptown-workerflag can also be set by itsAPPTOWN_variable,
asapptownd's already could.
Setting up a server
and the app contract
describe it.
Backing up and restoring a whole AppTown
apptownd backup [-store] <archive>asks the running AppTown for one
archive. First it backs up each app on AppTown's own Docker host, one at
a time, with that app's parts stopped and then started again. Then it
holds new jobs and steps for a moment, dumps the built-in database and
copies the data directory (withoutpgdataandcache).-storealso
copies the archive to the backup store that deployment backups use.- The archive is always encrypted with a passphrase (age). It holds
every secret AppTown has. The passphrase is asked on the terminal, or
read from the fileAPPTOWN_BACKUP_PASSPHRASE_FILEnames. Without it the
archive cannot be opened. An external secret store such as Infisical
keeps its own values, and the archive's manifest says so. apptownd restore <archive>runs on a host with no AppTown. It
refuses a host that already has an AppTown's database or deployment
containers, or a data directory that is not empty. It checks the files
and the dump against the manifest, loads the dump, compares each table's
rows with it, and opens the database as-verify-onlydoes.- Apps on AppTown's own Docker host are rebuilt from their last release
at the first start after a restore, with their data put back before any
part of the app runs. If a copy is missing or partial, nothing starts and
the deployment's card says so. - App Platform and Portainer deployments are checked against their
providers every minute after a restore. If the provider runs the
recorded release, AppTown carries on. If it runs a different one,
AppTown records it as a release "observed after restore", which AppTown
did not ship. The release AppTown last shipped there can still be
deployed again. If the app is gone, a person decides. If the provider
cannot be read, AppTown asks again. Until a deployment is checked,
AppTown does not release to it, restore into it or take it down,
including work queued before the backup. scripts/apptown-recovery-rehearsal.shnow uses the two commands.
AppTown's own backups
leads with them.
Fixes
- A landing's deploy runs to its end when its run is abandoned. Before,
stopping the run could cut the deploy short. AppTown then recorded its
outcome as uncertain, andmainrefused every release until a recovery
check decided it, usually as failed. A start stopped part way could leave
mainbetween two versions. What comes before the deploy starts still
stops. - A cancelled database statement fails as cancelled. When a
cancellation cut short a statement while it was being sent, the error
was a network timeout (write tcp ...: i/o timeout), which no caller
could tell from a real network fault. The error is now both the
cancellation and the timeout, over plain and TLS connections. - The
repo/no-build-artifactscheck says "could not assess" when it
cannot list or read a project's files, instead of passing. - RC6's fix for a step that finished just as its run ended (it was treated
as lost and cancelled) is in production for the first time, because RC6
never ran there.
Dependencies
- Go:
klauspost/compress1.18.7 andgrpc1.83.2. - The web interface: vite 6.4.4, vitest 4.1.12, react-router-dom 7.18.2,
mermaid 12.2.0 (with katex 0.18.2), dompurify 3.4.17, js-yaml 5.4.1,
undici 8.10.2, brace-expansion 5.0.12 and source-map-js 1.2.2. Each is
the smallest version that fixes its advisory. - The
frontend-onlyandvideo-gamestarters, which new projects of
those kinds start from, take vite 8.3.3 and 6.4.4 respectively, and
source-map-js 1.2.2. Existing projects keep their own lockfiles. - A new check,
make check-npm-audit, runs in CI. It fails on a high or
critical advisory in what the web interface ships, or in any starter's
lockfile, unlessscripts/npm-audit-exceptions.txtlists it with a date
and a reason. It fails too when npm cannot get the report.
Starters and guides
- The WordPress starter's theme is
apptown-site, with anapptown/
Composer package name and anapptown-S3 plugin name. Projects started
earlier keep the theme and files they were given, and the guidance says
so. - The shipped guides' links work on GitHub and on the Docs page. A
guide links another by its file (split-install.md), which GitHub
follows and the Docs page turns into its own route.make check-docs
checks every link in the guides and the release notes, and now runs in
CI.
Releases and CI
- The release workflow makes the tour on apptown.dev from the tag's
source, and publishes the site with it. The screenshots are no longer
kept in the repository. A test tag (-test.N) makes the tour and leaves
the site alone. - A release's images and archives are built only when
heavy.ymlpassed
on the commit at its first attempt. A run that passed only when re-run
does not count.heavy.ymlnow also runs on every pull request. - The repository runs AppTown's own
no-build-artifacts-trackedcheck over
itself. - The upgrade test now also upgrades an AppTown that RC6 recorded.
Removed
- Moving a deployment made before 1.0 to its new names. Every
deployment is now named by its key.apptown move-namesand its route
are gone, and so is everything that still read the names andforge.*
labels things had before 1.0: the start-up sweep of what an AppTown or a
worker before 1.0 left on its Docker, the old label reads, and the
forge-prefix in the readers of names on a host. - A built-in database container without this installation's
apptown.instancelabel is refused, as its volume already was. An
install made before 1.0 whose container has only the oldforge.instance
label must make the container again first.
Upgrading from RC6
Every deployment must be named by its key before the upgrade. Migration
167 stops the upgrade, changing nothing, while a deployment still holds a
container, a Portainer stack or anything else on a host under the names it
was made with, and names each one. Under RC6, move one on a Docker host
with apptown move-names <project> <deployment>. Take one on Portainer
down and release it again. Its data is not carried over, so copy it first.
Upgrading
says more. Upgrading from a release before RC6 is not supported.
Otherwise the upgrade is as the upgrading guide describes: check nothing
is executing, stop AppTown, take the two copies, replace the binaries and
start.
Database migrations
RC7 has two, 166 and 167. 166: each release records whether AppTown
shipped it or saw it after a restore, each deployment records whether its
provider has been checked since a restore, and a new table records putting
a built-in deployment's data back after a restore. 167: the recorded host
prefix of each deployment and the move flag on release requests are
dropped, once no deployment is still on its old names.
HTTP API changes
Routes removed:
POST /api/v1/projects/{slug}/deployments/{name}/move-names, added in
RC6 and not promised (apptown move-names).
Fields added:
Release.origin, always present:shipped, orobserved-after-restore
for a release AppTown recorded after a restore and did not ship.Deployment.restoreCheckandDeploymentView.restoreCheck: empty, or,
after a restore,unconfirmed(the provider has not been read yet),
gone(the app is not there) orfilling(the data is being put back).DeploymentView.dataAfterRestore: null, or aRestoreFillwithstate
(waiting,filledorfailed),detail, the backupsetand
updatedAt.ServiceSpec.appPart: true for one of the app's own parts, as opposed to
a need's service.
Deprecations
These are removals before 1.0, so no minor release comes first.
apptown move-namesand
POST /api/v1/projects/{slug}/deployments/{name}/move-namesare
removed. They shipped in RC6 to move a deployment made before 1.0 to
its new names. Nothing replaces them: every deployment is named by its
key, and migration 167 refuses an upgrade while one is not.- The names and labels from before 1.0 are no longer read: the
forge-prefix on a host, theforge.*Docker labels, and a built-in
database container labelled onlyforge.instance.