@crvouga/atlas 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,18 @@
1
1
  # Changelog: @crvouga/atlas
2
2
 
3
- ## 0.6.1 (2026-10-15)
3
+ ## 0.8.0 (2026-10-15)
4
+
5
+ ### Features
6
+
7
+ - add anonymous Atlas server image (#12) ([269d62d](https://github.com/crvouga/atlas/commit/269d62d74e08efd2ba473dd3629bddfd13670265))
8
+
9
+ ## 0.7.0 (2026-10-15)
10
+
11
+ ### Features
12
+
13
+ - publish the Atlas server image (#10) ([5cfb9b9](https://github.com/crvouga/atlas/commit/5cfb9b99a4a4f09180f371587704c447493b2f9f))
14
+
15
+ ## 0.6.1 (2026-10-14)
4
16
 
5
17
  ### Fixes and improvements
6
18
 
package/README.md CHANGED
@@ -68,6 +68,48 @@ live step logs and a Running status filter. Producers send heartbeats every
68
68
  configure `ATLAS_RUN_TIMEOUT_SECONDS` and `ATLAS_RUN_STALL_SECONDS` (0 disables the progress timeout),
69
69
  or edit these settings in the client. An interruption never turns missing outcomes into passes.
70
70
 
71
+ ## Deploy to Railway without code
72
+
73
+ Copy this image URI into **Railway → New service → Docker image**:
74
+
75
+ ```text
76
+ ghcr.io/crvouga/atlas:latest
77
+ ```
78
+
79
+ The image includes the Atlas server and viewer; hosting it needs no repository, Dockerfile, build command
80
+ or package installation. [`latest` on GHCR](https://github.com/users/crvouga/packages/container/atlas) follows
81
+ the newest checked `main` image, independently of npm releases.
82
+
83
+ 1. Leave the start command unset. Add a long random secret as `ATLAS_TOKEN` (at least 12 characters;
84
+ use 48 or more) and set `RAILWAY_RUN_UID=0` for [Railway volume permissions](https://docs.railway.com/volumes#permissions).
85
+ 2. Attach a persistent volume at `/data` and keep one replica so reports and server settings survive updates.
86
+ 3. Set the healthcheck path to `/readyz` and generate a public domain. Railway supplies `PORT`;
87
+ leave `ATLAS_PORT` unset. Open the domain and sign in with the token as the password (any username).
88
+ 4. Enable **Settings → Source → Configure Auto Updates → Anytime** to follow `latest`.
89
+ [Railway checks for image updates periodically](https://docs.railway.com/deployments/image-auto-updates);
90
+ detection can take a few hours.
91
+
92
+ For the exact image from a run, open **[CI](https://github.com/crvouga/atlas/actions/workflows/ci.yml) →
93
+ run → Summary → Atlas CI**. The summary includes a copyable full commit tag, the immutable registry digest,
94
+ whether that run updated `latest`, all job results, npm release details and artifact links. Use the commit
95
+ tag to pin or roll back a deployment. The [deployment guide](docs/deploying.md#run-it) covers optional reader
96
+ and publisher tokens, bucket storage and sending results from your projects.
97
+
98
+ ### Deploy without authentication
99
+
100
+ For anonymous access, use this image in Railway instead:
101
+
102
+ ```text
103
+ ghcr.io/crvouga/atlas-insecure:latest
104
+ ```
105
+
106
+ It contains the same server and viewer, with anonymous reading, uploads and administration enabled.
107
+ Follow the Railway steps above, leaving `ATLAS_TOKEN`, `ATLAS_PUBLISH_TOKEN`, `ATLAS_READ_TOKEN` and
108
+ configuration-file auth tokens unset. Open the generated domain directly; no sign-in is required.
109
+ Anyone who discovers the URL can read reports, upload results and change settings. An unlisted URL
110
+ is not access control. See the [anonymous deployment guide](docs/deploying.md#deploy-without-authentication)
111
+ for a token-free project configuration and verification commands.
112
+
71
113
  ## For AI agents
72
114
 
73
115
  Atlas is built to be integrated and operated by agents, with nothing to click and nothing to guess.
@@ -187,6 +229,9 @@ unless you choose a bucket. `atlas dev` runs the same server with the client's d
187
229
  development is one host too. See [the server](docs/server.md) and
188
230
  [running Atlas for a project](docs/deploying.md).
189
231
 
232
+ Deploy the server using the [Railway setup above](#deploy-to-railway-without-code), or follow the
233
+ [deployment guide](docs/deploying.md#run-it) for other hosts.
234
+
190
235
  ```sh
191
236
  atlas serve # the project's server, at :8080 (ATLAS_TOKEN says who may upload)
192
237
 
package/docs/deploying.md CHANGED
@@ -213,21 +213,108 @@ use a named `--store project=s3://… --write project` to put uploads in a share
213
213
 
214
214
  ### Run it
215
215
 
216
- **Docker.** [`examples/deploy/Dockerfile`](https://github.com/crvouga/atlas/blob/main/examples/deploy/Dockerfile)
217
- installs Atlas, builds the client once (it is the same for every project: the server tells the page where its
218
- data is) and starts the server, keeping results on the volume at `/data`:
216
+ **Railway (deploy an image, no repository or code changes).** Create a service from the Docker image
217
+ `ghcr.io/crvouga/atlas:latest`. Copy the URI below into Railway's image field:
218
+
219
+ ```text
220
+ ghcr.io/crvouga/atlas:latest
221
+ ```
222
+
223
+ For a specific revision, open a [CI run](https://github.com/crvouga/atlas/actions/workflows/ci.yml)'s
224
+ **Summary → Atlas CI**: it includes the published commit image URI, immutable digest and whether that run
225
+ updated `latest`. Pull request builds and failed publications are labelled accordingly.
226
+
227
+ 1. In Railway choose **New service → Docker image** and enter `ghcr.io/crvouga/atlas:latest`.
228
+ Leave the start command unset: the image includes the server and the prebuilt viewer.
229
+ 2. Add `ATLAS_TOKEN` with a long random value (generate one with `openssl rand -hex 24`). It grants admin
230
+ access; optionally add separate `ATLAS_PUBLISH_TOKEN` and `ATLAS_READ_TOKEN` for publishers and readers.
231
+ 3. Attach a volume at `/data` and set `RAILWAY_RUN_UID=0`: Railway mounts volumes as root, while the image
232
+ normally runs as `bun` ([Railway volume permissions](https://docs.railway.com/volumes#permissions)).
233
+ Keep one replica. The volume retains reports and server settings when the image is replaced.
234
+ 4. Set the healthcheck path to `/readyz` and generate a public domain. The image listens on `0.0.0.0` and
235
+ honors Railway's `PORT`; leave `ATLAS_PORT` unset. Open the domain and sign in with your token as the
236
+ password (any username), or use the viewer's token sign-in.
237
+ 5. Under **Settings → Source → Configure Auto Updates**, enable image updates and select **Anytime**.
238
+ Each successful `main` build publishes a new `latest`. Railway detects the changed digest and redeploys
239
+ within its update schedule; detection can be cached for a few hours, so publishing does not mean an
240
+ immediate deployment ([Railway image auto updates](https://docs.railway.com/deployments/image-auto-updates)).
241
+
242
+ Check the domain with `curl --fail https://YOUR-DOMAIN/readyz`: HTTP 200 means the server read its backend.
243
+ Projects publish to that domain with `ATLAS_STORE=https://YOUR-DOMAIN` and their `ATLAS_TOKEN`, as in
244
+ [sending results](#3-send-results-from-ci-and-from-laptops). Hosting Atlas needs no project checkout; publishing
245
+ your project's test results still needs the integration described there.
246
+
247
+ For bucket storage instead, set `ATLAS_STORE=project=s3://my-bucket/atlas/my-project`, `ATLAS_WRITE=project`,
248
+ and the bucket credentials. Keep the `/data` volume for server settings and local state.
249
+
250
+ ### Deploy without authentication
251
+
252
+ Use `ghcr.io/crvouga/atlas-insecure:latest` for a server that requires no sign-in or API token. It is built
253
+ from the same commit, server and viewer as `ghcr.io/crvouga/atlas:latest`, with `ATLAS_INSECURE=true`
254
+ to allow listening on the network without tokens. Anonymous callers have full read, publish and admin access.
255
+ Anyone who discovers an unlisted URL can read reports, upload results and change settings; the URL is
256
+ not access control.
257
+
258
+ In Railway, create a **Docker image** service with:
259
+
260
+ ```text
261
+ ghcr.io/crvouga/atlas-insecure:latest
262
+ ```
263
+
264
+ Leave the start command unset. Attach a persistent volume at `/data`, set `RAILWAY_RUN_UID=0`, keep one
265
+ replica, set the healthcheck to `/readyz` and generate a public domain. Leave `ATLAS_PORT` unset so Railway's
266
+ `PORT` is used. Enable **Settings → Source → Configure Auto Updates → Anytime** to follow `latest`.
267
+ Do not set `ATLAS_TOKEN`, `ATLAS_PUBLISH_TOKEN` or `ATLAS_READ_TOKEN`, or add `auth.tokens` to
268
+ `/data/atlas.server.json`: configured tokens still enable authentication. When reusing a volume from an
269
+ authenticated deployment, remove its saved auth tokens first. Open the domain directly, including `/admin`
270
+ for settings (leave the token field blank and choose **Load settings**).
271
+
272
+ Verify anonymous reads and uploads without an Authorization header:
273
+
274
+ ```sh
275
+ curl --fail https://YOUR-DOMAIN/readyz
276
+ curl --fail https://YOUR-DOMAIN/api/server
277
+ curl --fail 'https://YOUR-DOMAIN/api/checks?project=my-project' \
278
+ -H 'content-type: application/json' \
279
+ -d '{"producer":"smoke","checks":[{"id":"deployed","title":"Deployed","status":"passed"}]}'
280
+ ```
281
+
282
+ Readiness returns HTTP 200, `/api/server` reports `"open":true` and `"role":"admin"`, and the upload returns
283
+ HTTP 201. Configure a project with `ATLAS_STORE=https://YOUR-DOMAIN` and `ATLAS_PROJECT=my-project`;
284
+ leave its `ATLAS_TOKEN` unset. Use the same publishing commands described in
285
+ [sending results](#3-send-results-from-ci-and-from-laptops), omitting credentials.
286
+
287
+ For local Docker:
219
288
 
220
289
  ```sh
221
- docker build -t atlas examples/deploy
222
- docker run -p 8080:8080 -v atlas-data:/data -e ATLAS_TOKEN=$(openssl rand -hex 24) atlas
290
+ docker run --pull always -p 8080:8080 -v atlas-data:/data ghcr.io/crvouga/atlas-insecure:latest
223
291
  ```
224
292
 
293
+ Both images publish full commit tags for pinning or rollback. A new GHCR package must be made Public
294
+ once before Railway can pull without registry credentials; see
295
+ [image publication](https://github.com/crvouga/atlas/blob/main/docs/releasing.md#server-image).
296
+
297
+ ### Docker
298
+
299
+ The same published image works anywhere Docker runs. It already contains the client (the same
300
+ for every project: the server tells the page where its data is), and keeps results on the volume at `/data`:
301
+
302
+ ```sh
303
+ docker run --pull always -p 8080:8080 -v atlas-data:/data \
304
+ -e ATLAS_TOKEN=$(openssl rand -hex 24) ghcr.io/crvouga/atlas:latest
305
+ ```
306
+
307
+ The image is built from each checked commit, independently of npm releases. To pin a deployment or roll
308
+ back, replace `latest` with the full commit SHA. To build from this repository, use `docker build -t atlas .`;
309
+ [`examples/deploy/Dockerfile`](https://github.com/crvouga/atlas/blob/main/examples/deploy/Dockerfile) is the
310
+ alternative for building from an npm version or a local package tarball.
311
+
225
312
  For a bucket as the system of record add `-e ATLAS_STORE=project=s3://my-bucket/atlas/my-project -e ATLAS_WRITE=project -e AWS_REGION=us-east-1`.
226
313
  On ECS, EKS or EC2, attach the combined **both** policy (including `server/live/*` for producer leases) to the task, service account or
227
314
  instance and set no keys.
228
315
 
229
316
  **Try it on one machine.** [`examples/deploy/compose.yaml`](https://github.com/crvouga/atlas/blob/main/examples/deploy/compose.yaml)
230
- starts the server on a volume; `compose.s3.yaml` starts it with an S3 server and a bucket as its storage.
317
+ starts the published image on a volume; `compose.s3.yaml` starts it with an S3 server and a bucket as its storage.
231
318
  Publish to `http://localhost:8080` from your project and open it.
232
319
 
233
320
  **Kubernetes.** [`examples/deploy/kubernetes.yaml`](https://github.com/crvouga/atlas/blob/main/examples/deploy/kubernetes.yaml):
package/docs/server.md CHANGED
@@ -53,7 +53,11 @@ bunx atlas dev --data .atlas-data # http://127.0.0.1:5180
53
53
  ATLAS_STORE=http://127.0.0.1:5180 bunx atlas report publish --producer unit --junit out.xml
54
54
  ```
55
55
 
56
- For containers, Kubernetes and CI see [running Atlas for a project](deploying.md).
56
+ For Railway, deploy `ghcr.io/crvouga/atlas:latest` directly: the image contains the server and
57
+ viewer, and every green `main` push updates it. See [running Atlas for a project](deploying.md#run-it) for
58
+ Railway's volume, tokens, healthcheck and image auto updates, or for Docker, Kubernetes and CI.
59
+ For anonymous reading, uploads and administration, use `ghcr.io/crvouga/atlas-insecure:latest` with no tokens
60
+ configured; see [deploying without authentication](deploying.md#deploy-without-authentication).
57
61
 
58
62
  ## Configuration
59
63
 
package/llms-full.txt CHANGED
@@ -1005,7 +1005,11 @@ bunx atlas dev --data .atlas-data # http://127.0.0.1:5180
1005
1005
  ATLAS_STORE=http://127.0.0.1:5180 bunx atlas report publish --producer unit --junit out.xml
1006
1006
  ```
1007
1007
 
1008
- For containers, Kubernetes and CI see [running Atlas for a project](deploying.md).
1008
+ For Railway, deploy `ghcr.io/crvouga/atlas:latest` directly: the image contains the server and
1009
+ viewer, and every green `main` push updates it. See [running Atlas for a project](deploying.md#run-it) for
1010
+ Railway's volume, tokens, healthcheck and image auto updates, or for Docker, Kubernetes and CI.
1011
+ For anonymous reading, uploads and administration, use `ghcr.io/crvouga/atlas-insecure:latest` with no tokens
1012
+ configured; see [deploying without authentication](deploying.md#deploy-without-authentication).
1009
1013
 
1010
1014
  ## Configuration
1011
1015
 
@@ -1583,21 +1587,108 @@ use a named `--store project=s3://… --write project` to put uploads in a share
1583
1587
 
1584
1588
  ### Run it
1585
1589
 
1586
- **Docker.** [`examples/deploy/Dockerfile`](https://github.com/crvouga/atlas/blob/main/examples/deploy/Dockerfile)
1587
- installs Atlas, builds the client once (it is the same for every project: the server tells the page where its
1588
- data is) and starts the server, keeping results on the volume at `/data`:
1590
+ **Railway (deploy an image, no repository or code changes).** Create a service from the Docker image
1591
+ `ghcr.io/crvouga/atlas:latest`. Copy the URI below into Railway's image field:
1592
+
1593
+ ```text
1594
+ ghcr.io/crvouga/atlas:latest
1595
+ ```
1596
+
1597
+ For a specific revision, open a [CI run](https://github.com/crvouga/atlas/actions/workflows/ci.yml)'s
1598
+ **Summary → Atlas CI**: it includes the published commit image URI, immutable digest and whether that run
1599
+ updated `latest`. Pull request builds and failed publications are labelled accordingly.
1600
+
1601
+ 1. In Railway choose **New service → Docker image** and enter `ghcr.io/crvouga/atlas:latest`.
1602
+ Leave the start command unset: the image includes the server and the prebuilt viewer.
1603
+ 2. Add `ATLAS_TOKEN` with a long random value (generate one with `openssl rand -hex 24`). It grants admin
1604
+ access; optionally add separate `ATLAS_PUBLISH_TOKEN` and `ATLAS_READ_TOKEN` for publishers and readers.
1605
+ 3. Attach a volume at `/data` and set `RAILWAY_RUN_UID=0`: Railway mounts volumes as root, while the image
1606
+ normally runs as `bun` ([Railway volume permissions](https://docs.railway.com/volumes#permissions)).
1607
+ Keep one replica. The volume retains reports and server settings when the image is replaced.
1608
+ 4. Set the healthcheck path to `/readyz` and generate a public domain. The image listens on `0.0.0.0` and
1609
+ honors Railway's `PORT`; leave `ATLAS_PORT` unset. Open the domain and sign in with your token as the
1610
+ password (any username), or use the viewer's token sign-in.
1611
+ 5. Under **Settings → Source → Configure Auto Updates**, enable image updates and select **Anytime**.
1612
+ Each successful `main` build publishes a new `latest`. Railway detects the changed digest and redeploys
1613
+ within its update schedule; detection can be cached for a few hours, so publishing does not mean an
1614
+ immediate deployment ([Railway image auto updates](https://docs.railway.com/deployments/image-auto-updates)).
1615
+
1616
+ Check the domain with `curl --fail https://YOUR-DOMAIN/readyz`: HTTP 200 means the server read its backend.
1617
+ Projects publish to that domain with `ATLAS_STORE=https://YOUR-DOMAIN` and their `ATLAS_TOKEN`, as in
1618
+ [sending results](#3-send-results-from-ci-and-from-laptops). Hosting Atlas needs no project checkout; publishing
1619
+ your project's test results still needs the integration described there.
1620
+
1621
+ For bucket storage instead, set `ATLAS_STORE=project=s3://my-bucket/atlas/my-project`, `ATLAS_WRITE=project`,
1622
+ and the bucket credentials. Keep the `/data` volume for server settings and local state.
1623
+
1624
+ ### Deploy without authentication
1625
+
1626
+ Use `ghcr.io/crvouga/atlas-insecure:latest` for a server that requires no sign-in or API token. It is built
1627
+ from the same commit, server and viewer as `ghcr.io/crvouga/atlas:latest`, with `ATLAS_INSECURE=true`
1628
+ to allow listening on the network without tokens. Anonymous callers have full read, publish and admin access.
1629
+ Anyone who discovers an unlisted URL can read reports, upload results and change settings; the URL is
1630
+ not access control.
1631
+
1632
+ In Railway, create a **Docker image** service with:
1633
+
1634
+ ```text
1635
+ ghcr.io/crvouga/atlas-insecure:latest
1636
+ ```
1637
+
1638
+ Leave the start command unset. Attach a persistent volume at `/data`, set `RAILWAY_RUN_UID=0`, keep one
1639
+ replica, set the healthcheck to `/readyz` and generate a public domain. Leave `ATLAS_PORT` unset so Railway's
1640
+ `PORT` is used. Enable **Settings → Source → Configure Auto Updates → Anytime** to follow `latest`.
1641
+ Do not set `ATLAS_TOKEN`, `ATLAS_PUBLISH_TOKEN` or `ATLAS_READ_TOKEN`, or add `auth.tokens` to
1642
+ `/data/atlas.server.json`: configured tokens still enable authentication. When reusing a volume from an
1643
+ authenticated deployment, remove its saved auth tokens first. Open the domain directly, including `/admin`
1644
+ for settings (leave the token field blank and choose **Load settings**).
1645
+
1646
+ Verify anonymous reads and uploads without an Authorization header:
1589
1647
 
1590
1648
  ```sh
1591
- docker build -t atlas examples/deploy
1592
- docker run -p 8080:8080 -v atlas-data:/data -e ATLAS_TOKEN=$(openssl rand -hex 24) atlas
1649
+ curl --fail https://YOUR-DOMAIN/readyz
1650
+ curl --fail https://YOUR-DOMAIN/api/server
1651
+ curl --fail 'https://YOUR-DOMAIN/api/checks?project=my-project' \
1652
+ -H 'content-type: application/json' \
1653
+ -d '{"producer":"smoke","checks":[{"id":"deployed","title":"Deployed","status":"passed"}]}'
1593
1654
  ```
1594
1655
 
1656
+ Readiness returns HTTP 200, `/api/server` reports `"open":true` and `"role":"admin"`, and the upload returns
1657
+ HTTP 201. Configure a project with `ATLAS_STORE=https://YOUR-DOMAIN` and `ATLAS_PROJECT=my-project`;
1658
+ leave its `ATLAS_TOKEN` unset. Use the same publishing commands described in
1659
+ [sending results](#3-send-results-from-ci-and-from-laptops), omitting credentials.
1660
+
1661
+ For local Docker:
1662
+
1663
+ ```sh
1664
+ docker run --pull always -p 8080:8080 -v atlas-data:/data ghcr.io/crvouga/atlas-insecure:latest
1665
+ ```
1666
+
1667
+ Both images publish full commit tags for pinning or rollback. A new GHCR package must be made Public
1668
+ once before Railway can pull without registry credentials; see
1669
+ [image publication](https://github.com/crvouga/atlas/blob/main/docs/releasing.md#server-image).
1670
+
1671
+ ### Docker
1672
+
1673
+ The same published image works anywhere Docker runs. It already contains the client (the same
1674
+ for every project: the server tells the page where its data is), and keeps results on the volume at `/data`:
1675
+
1676
+ ```sh
1677
+ docker run --pull always -p 8080:8080 -v atlas-data:/data \
1678
+ -e ATLAS_TOKEN=$(openssl rand -hex 24) ghcr.io/crvouga/atlas:latest
1679
+ ```
1680
+
1681
+ The image is built from each checked commit, independently of npm releases. To pin a deployment or roll
1682
+ back, replace `latest` with the full commit SHA. To build from this repository, use `docker build -t atlas .`;
1683
+ [`examples/deploy/Dockerfile`](https://github.com/crvouga/atlas/blob/main/examples/deploy/Dockerfile) is the
1684
+ alternative for building from an npm version or a local package tarball.
1685
+
1595
1686
  For a bucket as the system of record add `-e ATLAS_STORE=project=s3://my-bucket/atlas/my-project -e ATLAS_WRITE=project -e AWS_REGION=us-east-1`.
1596
1687
  On ECS, EKS or EC2, attach the combined **both** policy (including `server/live/*` for producer leases) to the task, service account or
1597
1688
  instance and set no keys.
1598
1689
 
1599
1690
  **Try it on one machine.** [`examples/deploy/compose.yaml`](https://github.com/crvouga/atlas/blob/main/examples/deploy/compose.yaml)
1600
- starts the server on a volume; `compose.s3.yaml` starts it with an S3 server and a bucket as its storage.
1691
+ starts the published image on a volume; `compose.s3.yaml` starts it with an S3 server and a bucket as its storage.
1601
1692
  Publish to `http://localhost:8080` from your project and open it.
1602
1693
 
1603
1694
  **Kubernetes.** [`examples/deploy/kubernetes.yaml`](https://github.com/crvouga/atlas/blob/main/examples/deploy/kubernetes.yaml):
package/llms.txt CHANGED
@@ -47,4 +47,4 @@ Given only the repository link, start at docs/agents.md: install `@crvouga/atlas
47
47
 
48
48
  ## Optional
49
49
 
50
- - [Releasing](https://raw.githubusercontent.com/crvouga/atlas/main/docs/releasing.md): How @crvouga/atlas gets from main to npm.
50
+ - [Releasing](https://raw.githubusercontent.com/crvouga/atlas/main/docs/releasing.md): How Atlas gets from main to npm and to its server container image.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crvouga/atlas",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "Atlas: specs of any kind, reported as layered evidence. Publish checks from any runner (JUnit, CTRF, a script), combine them across nodes, branches, environments and backends, gate CI on the result, and run statecharts against the real app.",
5
5
  "license": "MIT",
6
6
  "type": "module",