Inspiration
Most people walk past a masterpiece, take a blurry photo, and forget it by the time they reach the gift shop. You can't buy the Mona Lisa — but you can keep the moment you stood in front of it. Pokémon GO got people to walk miles to "catch" digital creatures; we asked what if the rarest thing you could collect was being there, in front of the real Starry Night, with a record that can't be faked. The interesting part isn't the photo — it's the data model that makes where and when meaningful.
What it does
- Snap → identify → collect. Point your camera at an artwork; AI matches it and adds it to your personal art "Dex" with a rarity reveal.
- The database is the game. GPS finds your nearest museum → Amazon DynamoDB returns the works currently exhibited there today → the photo is matched against only those few candidates, which is what makes recognition reliable.
- Artworks travel — and the app shows it. Exhibitions are a time-bounded artwork↔museum relationship, so a piece's location is dynamic (The Starry Night: London → Paris → New York). Each artwork's detail view surfaces this exhibition history straight from DynamoDB, and meeting the same work again in a new city strings your encounters into one memory timeline.
- Location-gated legendaries. The rarest works can only be sealed when you're physically within 150 m of the holding museum — enforced server-side with a haversine check.
- Keepsakes. Each capture saves a selfie-with-the-art to Amazon S3 and a "moment" (with GPS coordinates) to DynamoDB; revisit a work and it becomes a reunion.
- World map + progress. Collected pieces pin to a living world map; per-artist progress ticks up.
How we built it
- Frontend: Next.js 15 (App Router) + React 19 + Tailwind 4 + TypeScript, deployed on
Vercel. Live camera via
getUserMedia; world map via react-leaflet + OpenStreetMap. - Database — Amazon DynamoDB (
@aws-sdk/client-dynamodb+lib-dynamodb), PAY_PER_REQUEST, regionus-east-1. Five tables —artdex_artworks,artdex_museums,artdex_artists,artdex_exhibitions,artdex_collections(per-user append-only "moments"). Catalog: 60 artworks · 14 museums · 26 artists · 66 exhibition rows, with several masterpieces touring three cities to exercise the temporal model. - Recognition — Amazon Bedrock,
claude-haiku-4-5vision. We send the photo plus the GPS-narrowed candidate list and ask for an id or "none." - Images — Amazon S3 presigned PUT/GET for selfie keepsakes.
- Auth: cookie-based anonymous id — one Dex per browser, zero friction for a demo.
- Pure domain layer: rarity, the 150 m location gate (haversine), candidate filtering, recognition parsing, and progress math are pure, fully unit-tested functions (56 tests).
Challenges we ran into
- Aurora → DynamoDB pivot. We specced on Aurora PostgreSQL + PostGIS, but the free AWS plan gates Aurora's Data API behind a paid tier. We moved the data layer to DynamoDB and pushed the geospatial work (nearest-museum, the 150 m gate) into a pure haversine in the app layer — the temporal + geospatial model stayed intact.
- Reliable recognition. Open-ended "what painting is this?" is unreliable; candidate-set narrowing (museum → today's exhibits → match against only those) is what makes it work.
- Demoing GPS from a desk. A
NEXT_PUBLIC_MOCK_LOCATIONoverride lets us demo the on-site legendary gate without traveling.
Accomplishments that we're proud of
A database schema that is the gameplay: time-bounded exhibitions and a 150 m geofence turn a CRUD app into a place-and-time game. End-to-end on real AWS — deployed and working.
What we learned
DynamoDB's single-table, append-only "moments" shape fits an event-sourced collection log cleanly, and narrowing the problem (candidate sets) beats reaching for a bigger model when you need reliability.
What's next for ArtDex
Friends and shared world-map footprints (aggregated in DynamoDB), a museum "passport" sub-goal, and museum B2B partnerships. (Achievements and a global collectors' leaderboard already ship.)
Built With
- amazon-bedrock
- amazon-dynamodb
- amazon-web-services
- claude
- next.js
- openstreetmap
- react
- react-leaflet
- tailwindcss
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.