Skip to content

artsy/atelier

Repository files navigation

Atelier

Atelier is a static site hosting solution for use internally at Artsy and Artnet.

User experience demo

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.

Meta

Architecture

Architecture sketch via tldraw Source

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.


Serving site content

  • The artsy-atelier bucket 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:GetObject to 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.


Uploading site content

  • 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 UI
    • POST /upload — endpoint that takes a site name, a zip archive, and then unpacks and stores the zip content to the appropriately named subfolder inside the artsy-atelier S3 bucket
    • GET /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.


Access control for both site content and uploading

  • Cloudflare Access gates every *.artsy.dev subdomain 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.

Contributing

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.

About

Internal static site hosting for Artsy and Artnet

Resources

Security policy

Stars

Watchers

Forks

Used by

Contributors

Languages