Project Info
Inspiration
We built Proof because we were tired of making promises we couldn’t keep. Everyone has goals—whether it’s reading more, eating better, or running regularly—but it’s easy to fall off track without accountability. We wanted a tool that not only helps you stay consistent but also makes your progress visible and real. Proof is our way of turning intention into action—because proof beats promises.
What it does
Proof is a visual habit tracker that helps users build better routines through photo check-ins and intelligent coaching. Users set personal goals and log their progress with images—whether it's a healthy meal, a completed workout, or a clean desk. An in-app chatbot, Letta, helps refine goals and suggests personalized, actionable check-in prompts. Gemini Vision verifies check-ins for goal relevance, while Claude (via Letta’s stateful backend) helps users brainstorm and stay motivated. All check-ins and chats are logged to Supabase, creating a secure, timeline-based system of visual accountability.
How we built it
We built Proof using React Native with Expo, using Supabase for authentication, database storage, and real-time data syncing. We implemented an in-app chatbot (Letta) using Claude via Letta’s hosted API and used Gemini Vision for image-based goal verification. The backend stores chats and check-ins using normalized Supabase tables (profiles, goals, chats, chat_messages, and proofs). Letta was designed as a goal brainstorming assistant, giving dynamic, context-aware suggestions to encourage meaningful, habit-forming behaviors.
Challenges we ran into
Integrating Letta’s stateful AI was a huge lift. Mapping structured goal data to unstructured chat input and interpreting user photos introduced edge cases that often broke expected behavior or resulted in irrelevant responses. React Native camera integration was buggy across platforms. From handling permission inconsistencies to properly formatting media for Supabase uploads, getting reliable, cross-platform behavior required a ton of trial and error. Managing chat memory and syncing with Supabase was fragile. We struggled with state persistence, real-time updates, and avoiding race conditions between user input, API inference, and Supabase logging.
Accomplishments we're proud of
Built a fully functional mobile app in just 24 hours. Seamlessly integrated Claude and Gemini into the user flow to power real-time conversations and image analysis. Launched a complete goal-check-in-verification pipeline: from photo input to AI interpretation to structured Supabase logging. Created a dynamic, personalized chatbot that helps users reflect and stay engaged with their goals.
What we learned
Learned how to implement stateful AI agents using Letta and Claude to guide users through adaptive, evolving goals. Gained experience using Supabase as a scalable mobile backend, including authentication, chat logs, and structured data. Built social graph structures and stored early-stage relationship data for features like friends, group goals, and check-in feeds. Developed reliable media upload pipelines from React Native to cloud storage, ensuring smooth user-generated content flows.
What's next
Support for video check-ins Group goals and collaborative progress Notifications prompting users for timed goals Private messaging and close-friend tracking Community features to discover and join shared goals More dynamic goals to fit the user's needs AI-powered smart nudges and reflections
Proof
Social accountability mobile app built with Expo Router and Supabase. Create challenges, check in to keep streaks alive, and share photo “proof” with friends who can like and cheer you on.
Repo layout
Proof/– the Expo app source..env– local environment secrets (kept out of git).
Quickstart
cd Proof # app source directory
npm install # install dependencies
npm run start # choose iOS / Android / web
If Metro cache acts up: npx expo start --clear.
Environment
Create a .env in the repo root (already ignored):
PUBLIC_SUPABASE_URL=...
ANON_PUBLIC_KEY=...
SERVICE_ROLE_KEY=...
LETTA_API_KEY=...
LETTA_CHATBOT_MODEL=...
LETTA_IMAGE_VERIFIER_MODEL=...
What’s inside
- Goal tracking: challenges with start/end dates, frequencies, streaks, and check‑ins.
- Social feed: photo proofs with captions, likes/unlikes.
- Friends: send/accept requests; view friends’ active goals.
- AI assistant: floating Letta chatbot for quick coaching.
Scripts (from Proof/)
npm run start– run Metro and select target.npm run ios/npm run android/npm run web– platform shortcuts.npm run lint– lint with Expo config.
Contributing
Keep secrets in .env. Document Supabase schema/policy changes. Prefer typed expo-router routes for new screens.
Analysis
View
Metric
- 20
- 19
- 9
- 8
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- JavaScriptIn code
- ReactIn code
- SupabaseIn code
- TypeScriptIn code
- AnthropicClaimed
- Google GeminiClaimed
4 of 6 appear in the indexed code. 2 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
225 KB
Source files
40
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
MaazDhalech/Proof
65 files · 2.8 MB · @ 54e15ce
Structure
Interface
27 files · 42%Screens, components and styles rendered to the user.
Application logic
8 files · 12%Domain rules, services and shared utilities.
Data & schema
5 files · 8%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript96%
- JavaScript2%
- Markdown2%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
Proof/package.json
npm · 52- @expo/vector-icons
- @react-native-community/datetimepicker
- @react-native-community/slider
- @react-native-picker/picker
- @react-navigation/bottom-tabs
- @react-navigation/elements
- @react-navigation/native
- @supabase/supabase-js
- axios
- bad-words
- dayjs
- dotenv
- expo
- expo-blur
- expo-camera
- expo-constants
- expo-dev-client
- expo-device
- +34 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.