[{"data":1,"prerenderedAt":123},["ShallowReactive",2],{"portfolio-noshera":3},{"id":4,"title":5,"banner":6,"body":7,"client":96,"description":97,"extension":98,"image":33,"keywords":99,"meta":105,"navigation":106,"path":107,"seo":108,"slug":109,"stem":110,"tags":111,"technologies":115,"thumbnail":33,"url":83,"__hash__":122},"projects/projects/noshera.md","Noshera","space_pnkchk",{"type":8,"value":9,"toc":88},"minimark",[10,15,19,27,34,38,41,52,58,64,67,73,77],[11,12,14],"h3",{"id":13},"why-im-building-it","Why I'm Building It",[16,17,18],"p",{},"I've been logging every meal in a food tracker for months — it's a big part of how I turned my health numbers around. But living inside these apps daily makes their rough edges impossible to ignore. Noshera is my answer: a consumer-first nutrition diary where you log food, track calories, macros, weight, and water, and build recipes — with a practitioner layer planned on top so coaches and dietitians can get visibility into their clients' logs.",[16,20,21,22,26],{},"That lived experience drives the design. Real life doesn't fit neatly into breakfast/lunch/dinner, so meal types are user-defined. Sometimes you just know you ate about 1,400 calories at a sushi buffet, so there's a quick log that takes a description and a number without forcing you to fake a food entry. Late-night snacks can be logged to yesterday, because the day you ",[23,24,25],"em",{},"lived"," doesn't always end at midnight.",[16,28,29],{},[30,31],"img",{"alt":32,"src":33},"The Today dashboard — calories, macros, water, and streak at a glance","/img/projects/noshera/today.png",[11,35,37],{"id":36},"how-it-works","How It Works",[16,39,40],{},"The stack is Nuxt 4 and Vue 3 with Tailwind for the UI and Pinia for state, backed by Supabase — Postgres with row-level security on every table, plus Supabase Auth. The whole thing deploys to Cloudflare Pages.",[16,42,43,44,47,48,51],{},"The data model was the most interesting part. Food lives in three tiers: a public database (USDA and Open Food Facts), each user's private custom foods, and a restaurant database. Nutrition is stored per 100g as a calculation base, and every diary entry snapshots its nutrition at log time — so if a food's data changes later, your history stays accurate. Recipes and custom meals are deliberately separate concepts: a recipe ",[23,45,46],{},"creates"," a food from raw ingredients, while a custom meal ",[23,49,50],{},"assembles"," a plate from things that already exist.",[16,53,54],{},[30,55],{"alt":56,"src":57},"The day board — meals as columns, each with its own calorie budget","/img/projects/noshera/board.png",[16,59,60],{},[30,61],{"alt":62,"src":63},"The journal view — a classic diary table with per-meal totals","/img/projects/noshera/journal.png",[16,65,66],{},"Logging happens in a drawer with three modes: search, quick log, and barcode scanning — with a community contribution pipeline planned for products the database doesn't know yet.",[16,68,69],{},[30,70],{"alt":71,"src":72},"Barcode scanning in the log-food drawer","/img/projects/noshera/barcode.png",[11,74,76],{"id":75},"whats-next","What's Next",[16,78,79,80,87],{},"Noshera is live at ",[81,82,86],"a",{"href":83,"rel":84},"https://noshera.com",[85],"nofollow","noshera.com"," and under active development. On the roadmap: the practitioner dashboard for coaches and dietitians, an MCP server so AI agents can log and query on your behalf (the API is meant to be a first-class client, not an afterthought), and a mobile app. I use it as my own daily tracker, which is the best bug reporter I've ever had.",{"title":89,"searchDepth":90,"depth":90,"links":91},"",2,[92,94,95],{"id":13,"depth":93,"text":14},3,{"id":36,"depth":93,"text":37},{"id":75,"depth":93,"text":76},null,"A nutrition diary app for logging food, tracking calories and macros, and building recipes — with a practitioner layer on the roadmap.","md",[100,101,102,103,104],"nutrition","health","saas","full-stack","vue",{},true,"/projects/noshera",{"title":5,"description":97},"noshera","projects/noshera",[112,113,114],"Personal","SaaS","Active Project",[116,117,118,119,120,121],"Nuxt 4","Vue 3","Supabase","Tailwind CSS","Pinia","Cloudflare Pages","51WWc62e6JMlNu3EgcycAzyrBEmlEuUeIuTzQ1WbhhQ",1782966433426]