Atelier is a static site hosting solution for use internally at Artsy and Artnet.
The goal is to provide a dead-simple, low-friction, drag-and-drop solution for colleagues to share their html creations.
While the motivation was to accommodate the increasing number of vibecoded creations generated by non-engineers, it works just as well for artisanally created html, static site generator output, or any other method that results in a folder containing static html/css/js/etc.
- State: production
- Production: https://atelier.artsy.dev
- Staging: https://atelier-staging.artsy.dev
- GitHub: https://github.com/artsy/atelier/
- Point People: @anandaroop, @artsyjian
- CI/Deploys: CircleCI; PRs merged into
mainare automatically deployed to staging; PRs merged fromstagingintoreleaseare automatically deployed to production. Start a deploy...
Every static site managed by atelier lives inside a designated S3 bucket called artsy-atelier.
# S3
├── artsy-atelier
│ ├── braze-dash # https://braze-dash.artsy.dev
│ ├── dbt-docs # https://dbt-docs.artsy.dev
│ ├── price-game # https://price-game.artsy.dev
│ └── art-quiz # https://art-quiz.artsy.dev
│
other-buckets…Apart from S3 storage, the remaining components are:
- Serving site content: handled by Cloudfront
- Uploading site content: handled by this project,
artsy/atelier - Access control: handled by Cloudflare Access
Each piece is described below.
-
The
artsy-atelierbucket itself has no public access, instead… -
The bucket is fronted by a Cloudfront distribution (
E22U9CWUDKPZP6) -
The distribution is permitted to reach into the bucket and serve up Atelier content via a CloudFront Origin Access Control (OAC) paired with an S3 bucket policy that scopes
s3:GetObjectto that specific distribution -
The subdomain-to-subfolder routing is handled by a Cloudfront function (
atelier-poc-router) which is associated to that distribution
Note that this setup is actually all it takes to serve content out of that bucket to a custom *.artsy.dev subdomain. The remaining pieces are what make it easy and safe and for non-engineering users to interact with Atelier.
-
This repo provides a simple drop-zone based UI that allows anyone to take some html/etc content, zip it up into an archive and drop it into Atelier
-
It is set up as a vanilla Express (v5) app, deployed to Artsy's k8s cluster via Hokusai, that serves up:
GET /— a vanilla html page with the hero image and drop zone UIPOST /upload— endpoint that takes a site name, a zip archive, and then unpacks and stores the zip content to the appropriately named subfolder inside theartsy-atelierS3 bucketGET /check— endpoint that checks for subfolder existence to allow confirming of overwrites
This is currently a prototype-y Claude-crafted app with no build process and thus no ability to accommodate a more sophisticated React UI. If we want to evolve in that direction, we should feel free to completely replace the current upload app with something more suitable.
-
Cloudflare Access gates every
*.artsy.devsubdomain behind single sign-on, covering both the static sites and the upload app. -
This ensures that Atelier remains a purely internally facing system, for both reads and writes.
TODO — perhaps after a KS where we decide which quirky Hackathon-esque development practices to leave in place, and which ones to jettison in favor of standard practices.