22- Backend: TypeScript with Hono framework
23- AI Vision: Llama 4 Maverick via Groq API
24- Database: SQLite for data storage
25- Frontend: HTML, CSS (Tailwind), and JavaScript with HTMX
26
29```
30โโโ backend/
31โ โโโ database/
32โ โ โโโ schema.ts # Database schema
33โ โ โโโ queries.ts # Database queries
34โ โโโ services/
35โ โ โโโ vision.ts # Groq API integration
8 getFoodEntries,
9 getStats,
10 setupDatabase
11} from "./backend/database/queries.ts";
12
13// Initialize the app
28app.use("*", cors());
29
30// Initialize database on startup
31app.use("*", async (c, next) => {
32 await setupDatabase();
33 await next();
34});
60 const analysis = await analyzeImage(imageBase64);
61
62 // Store the analysis in the database
63 const userId = formData.get("userId") || "anonymous";
64 const entry = await createFoodEntry({
10
11- `FoodAnalysisResult`: The result of analyzing a food image
12- `FoodEntryData`: Data structure for a food entry in the database
13- `StatsData`: Data structure for calorie statistics
303. The AI analyzes the image and returns information about the food
314. The results are displayed to the user
325. The entry is saved to the database for future reference
336. Statistics and history are updated automatically
5## Structure
6
7- `database/`: Database schema and queries
8 - `schema.ts`: Defines the database tables and types
9 - `queries.ts`: Contains functions for interacting with the database
10- `services/`: External service integrations
11 - `vision.ts`: Integration with Groq API for Llama 4 Maverick vision
9} from "./schema.ts";
10
11// Initialize the database
12export async function setupDatabase() {
13 // Create tables if they don't exist
14 await sqlite.execute(CREATE_USERS_TABLE);
1// Database schema for the food tracking app
2
3// Table names - use versioning to handle schema changes
30`;
31
32// Types for database entities
33export interface User {
34 id: string;
1// Script to set up the telegram_chats table in SQLite
2// Run this script manually to create the database table
3
4export default async function setupTelegramChatDb() {
25 `);
26
27 return "Telegram chat database table created successfully.";
28 } catch (error) {
29 console.error("Error setting up telegram_chats table:", error);
13## Technical Architecture
14
15**โ ๏ธ important caveat: the admin dashboard doesn't have auth! currently it just relies on security by obscurity of people not knowing the url to a private val. this is not very secure. if you fork this project and put sensitive data in a database you should think carefully about how to secure it.**
16
17Stevens has been designed with the utmost simplicity and extensibility, much like a well-organized household. At the heart of his operation lies a single "memories" table - a digital equivalent of a butler's meticulous records. This table serves as the foundation for all of Stevens' operations.
45- `dashboard`: the admin view for showing the memories notebook + visualizing imports
46- `dailyBriefing`: stuff related to sending a daily update via telegram
47- `dbUtils`: little one-off scripts for database stuff
48
49## Hiring your own Stevens
57- For the Google Calendar integration you'll need `GOOGLE_CALENDAR_ACCOUNT_ID` and `GOOGLE_CALENDAR_CALENDAR_ID`. See [these instuctions](https://www.val.town/v/stevekrouse/pipedream) for details.
58
59**important caveat: the admin dashboard doesn't have auth! currently it just relies on security by obscurity of people not knowing the url to a private val. this is not very secure, if you put sensitive data in a database you should think carefully about how to secure it.**
60
61Overall it's a simple enough project that I encourage you to just copy the ideas and run in your own direction rather than try to use it as-is.
4
5* `index.ts` - this is the **entrypoint** for this whole project
6* `database/` - this contains the code for interfacing with the app's SQLite database table
7
8## Hono
26## CRUD API Routes
27
28This app has two CRUD API routes: for reading and inserting into the messages table. They both speak JSON, which is standard. They import their functions from `/backend/database/queries.ts`. These routes are called from the React app to refresh and update data.
29
30## Errors