✨ Inspiration
Provenance research is usually hidden in academic papers and catalogues, yet it’s full of mystery , forgeries, lost ownership chains, rediscovered masterpieces. We wanted to democratize that detective work and let Redditors experience the thrill of being an art sleuth, one daily case at a time.
🎮 What it does
RedStroke is a daily Reddit-native game:
- Each day presents 3 candidate artworks (1 authentic, 2 forgeries).
- Players investigate with tools like Signature Analyzer and Metadata Comparison.
- They submit their guess + rationale, and a daily leaderboard ranks top sleuths.
- Over time, players sharpen both their eyes and their art knowledge.
🛠 How we built it
- Artwork Sourcing: Pulled authentic artworks from the Internet Archive and other public-domain museum collections.
- Forgery Generation: Used Gemini Nano Banana to generate forged variants and short briefs (with historical plausibility).
- Backend (Flask): A Hugging Face-hosted Flask API that:
- Served curated cases (images + metadata).
- Exposed tools (
/tool/signature,/tool/metadata) to analyze image crops and metadata. - Implemented daily case rotation logic.
- Served curated cases (images + metadata).
- Game Logic:
- Randomized authentic index so the real artwork isn’t always first.
- Added “IP points” as currency to spend on tools.
- Timer countdown (90s per case).
- Randomized authentic index so the real artwork isn’t always first.
- Server Integration:
- Built a Node/Express server as middleware inside Devvit.
- Tried to proxy to the Flask API but due to whitelist approval for external domains, direct connection was blocked during the hackathon.
- Solution: created a MockProvider inside the Devvit server where we curate artworks and prompt Gemini for the forgery variants ourselves.
- Built a Node/Express server as middleware inside Devvit.
- Client (React + Devvit Webview):
- Grid of 3 artworks, with clear selection states.
- Full-size modal image view for accessibility.
- ToolTray with global tools affecting all images simultaneously.
- Submission flow → rationale input → leaderboard reveal.
- Grid of 3 artworks, with clear selection states.
🧩 Challenges we ran into
- During development, one of the most time-consuming rabbit holes we fell into was troubleshooting why our Hugging Face Flask API wouldn’t connect from inside Devvit. We cycled through every possibility , experimenting with different HTTP methods (GET vs POST), tweaking headers, reworking our proxy layer, even questioning JSON encoding. Each iteration seemed promising, but the connection kept failing with cryptic errors. After days of trial and error, we discovered the real issue wasn’t in our code at all: the external domain we were trying to reach was still sitting in “pending” status for whitelist approval. Once we realized this, it became clear that none of our method-level fixes could succeed until Reddit approved the domain itself.
- Time pressure: needed a reliable fallback (MockProvider) to ship a working demo for hackathon day.
- Game balance: ensuring tools were useful without giving away the answer instantly.
🏆 Accomplishments that we're proud of
- Built a dual-provider architecture (Flask + MockProvider) so the game runs both online and offline.
- Designed daily case logic that rotates through real artworks.
- Implemented interactive tools (signature crops + metadata flags) in a way that feels investigative.
- Created a clean, accessible UI with modals, timers, and responsive layout.
- Delivered a full art + tech fusion: education, AI forgeries, and Reddit-native gameplay.
📚 What we learned
- Fallbacks are essential: MockProvider saved the project when Flask couldn’t connect.
- How to work within Devvit’s sandbox constraints ,domain approvals, whitelisted requests, and limited headers.
- AI + archives can generate engaging educational games when combined thoughtfully.
- Importance of clear UX separation (viewing images vs selecting them).
- Hackathon strategy: get the game loop working first, then layer the magic which in this case was AI/forgeries.
🚀 What’s next for RedStroke
- Fix whitelist approvals and fully connect the Flask backend to Devvit.
- Scale beyond a handful of curated cases into a growing daily archive.
- Add community mechanics: players upvote best rationales, share insights in comments.
- Experiment with real-time forgery generation using diffusion + Gemini for endless replayability.
- Partner with museums/archives to highlight real-world provenance challenges and exhibitions.
Log in or sign up for Devpost to join the conversation.