Tweetsie / Staging

[Collections as Data] for Apps — Tweetsie (Live Cursor Build)

Welcome to our collaborative vibe coding session—an experiment in turning collections as data into bespoke webapps. This is a new way of sharing collections big and small, made possible by the rise of vibe coding platforms like Cursor, Loveable, GitHub Copilot, and Replit. We're building on the strong foundation of the collections as data movement to create a new paradigm: collaborative, accessible, and engaging ways to bring cultural heritage to life through modern web development. Join us in this exciting frontier where archivists, developers, and AI assistants work together to build beautiful, functional collections interfaces.

We're starting from a playful HELLO WORLD and, in ~60 minutes, will see how far a small group can build: site structure, a minimal items list & details page, maybe an image wall or a simple timeline—audience-led.

Run of Show (60 min + optional 30)

  1. 10' Orientation: Review this Staging doc—goals, constraints, and how we got here (easy, cheap, reproducible).
    • Domain: tweetsie.app (Porkbun).
    • Repo: GitHub → small Astro + Tailwind scaffold (client-only).
    • Hosting: Netlify builds from GitHub and serves the static site over CDN.
    • Data & images pre-staged locally (/data, /public/images).
    • Costs: low now, predictable later (see Technology & Costs card).
    • Collection context: JMU finding aid for the Tweetsie Collection.
  2. 15' Data wiring: Fetch /data/items.json and render a minimal list (title + thumbnail).
  3. 25' Core features (audience chooses): navigation & site structure; an Items control panel with Subject, Start Year, End Year, Sort (Title A–Z/Z–A, Year ↑/↓), and keyword search; item details page.
  4. 10' Visual polish: apply the mid-century "Tweetsie" theme; optionally add an image wall or simple timeline by year_start/year_end.
  5. 5' Ship: commit → build on Netlify → verify at https://tweetsie.app.

Optional +30': open build for extras (lightbox zoom/pan, CSV export later, URL state, etc.).

🎯

What's pre-staged

  • Images in /public/images/; metadata JSON in /data/ (copied to /public/data/items.json on build).
  • Netlify: connected to GitHub; each push triggers npm run build, publishes dist/, serves via CDN with auto-HTTPS (free tier for now).
  • Data extraction: images + metadata harvested from JSTOR via Python; some records have multiple images—for this workshop we use the first image only; metadata normalized (subjects, years, basic cleanup).
  • Domain: https://tweetsie.app (Porkbun).
  • Repo: github.com/KevinHegg/tweetsie-app.
  • Template-ready: to adapt for another collection, swap /public/images/ + /data/items.json, update site text—everything else stays the same.
💻

Technology & Costs (static-first, client-only stack)

We're using a static-first, client-only stack: Astro + Tailwind on the frontend, no backend, no database, built from GitHub and deployed on Netlify.

  • Domain (Porkbun): tweetsie.app$5.99 first year, then $14.99/year.
  • Source (GitHub): tweetsie-app repofree.
  • Hosting (Netlify): static site build & CDN — free tier (sufficient for this project).
  • Assistant (Cursor): AI pair-programmer — $20/month.
  • ChatGPT+ (optional): For building Cursor prompts and learning the tech stack — $20/month.

How GitHub & Netlify work together

  1. We push changes to the GitHub repo (main branch).
  2. Netlify sees the push, runs our build (npm run build), and publishes dist/.
  3. Netlify serves the site globally over its CDN and auto-provisions HTTPS for tweetsie.app.
  4. Every commit creates a new deploy; rollbacks are one click.
🚀

Considerations for Larger Collections

For collections with thousands of items, you often need a fuller stack with a discovery layer and admin tools—which changes the vibe-coding constraints.

Complications

  • Search & discovery: facets, relevance, typo tolerance, pagination.
  • Write paths: editing, bulk ingest, authority control, audit trails.
  • Access: roles/permissions, embargoes, sensitive items, preservation copies.
  • Images: derivatives, IIIF manifests/tiling, storage and egress costs.
  • Performance: API limits, caching strategy, index refresh, batch jobs.
  • Governance: metadata quality, rights at scale, PII, backups/restore.

Practical paths

  • Search: Algolia or OpenSearch with incremental indexing and clear facets.
  • Assets: IIIF server (e.g., Cantaloupe) + object storage (S3/R2) for tiles/derivatives.
  • CMS/Admin: Sanity/Strapi/Directus—or a lightweight Rails/Django admin.
  • Auth: Netlify Identity or GitHub OIDC with role-based access control.
  • Architecture: keep public pages static; call APIs for search/details only.
  • Ops: background workers for ingest/derivatives; staging → prod promotion.

Today we stay static-first and client-only; this card is a roadmap if the prototype grows.

🎨

Feature ideas (pick together)

  • Navigation & site structure: Home · Items · Item details.
  • List + details page: link /items → /item/[id], render image + core metadata.
  • Filters: subject chips/select, year min/max, text search (title/description).
  • Image wall: grid respecting orientation/aspect_ratio.
  • Timeline: simple year band by year_start/year_end.

Guardrails & success

  • Replace the train animation landing page with an appropriate welcome message or introduction to the site.
  • Success: navigable items list, at least one working filter, a functional details page, something fun like a map, timeline, or wall of images, and a well-designed and engaging site look and feel.
🔨
Start Prompts in Build Order (reveal)
💡

Tip: When constructing prompts, modern LLMs like ChatGPT 5 and Copilot are very helpful—start simple, let them suggest steps, and refine with small follow-ups.

  1. Create an "Items" page that lists our collection (title + thumbnail from /data/items.json) with each item linking to its own page.
  2. When I click a title, show a details page with the large image, title, date, short description, rights note, subjects as tags, and a link back to the list.
  3. Add simple site navigation with links for Home, Items, and Welcome/Notes, keeping the design clean, readable, and mobile-first.
  4. Add a control panel at the top of the Items page with three filters (Subject, Start Year, End Year), a Sort selector (Title A–Z/Z–A and Year ↑/↓), and a keyword search across title, description, and subjects—everything client-side, fast, and debounced.
  5. Add a toggle on the Items page to switch between a simple list and a responsive wall of images that looks good with tall and wide photos.
  6. Add an accessible fullscreen lightbox for item images with zoom & pan (wheel/pinch to zoom, drag to pan), closing on ESC or backdrop click.
  7. Add a lightweight timeline control that lets me filter by year ranges using year_start/year_end (fall back to a parsed year if needed).
  8. Give the site a cohesive mid-century "Tweetsie" look (palette from our images, ticket-stub subject chips, subtle paper grain, "railroad track" dividers), mobile-first.
  9. Create a Welcome page that briefly introduces the Tweetsie Collection using and citing the JMU finding aid and the Artstor landing page (clear links, no verbatim copying).
🚀
One-shot Mega-Prompt (reveal)

Tip: click inside, Ctrl/Cmd-A to copy.