Log food with an AI, in one line
A Noshery import code is one line of text: noshery1: followed by base64-encoded JSON. Noshery decodes it, shows a read-only review with an "AI estimate" disclaimer, and drops you on a pre-filled, still editable form.
How to use it: paste the instructions below into ChatGPT, Claude, or any capable assistant, then describe your food (text or a photo). The assistant replies with a single noshery1: line. Copy that line, open Noshery, and use "Paste AI estimate" (Add → the paste option). The whole exchange happens in your AI tool; Noshery itself never calls an AI.
This page mirrors the noshery-macro-estimate skill shipped with the app. If you use Claude with skills, install it instead of pasting:
- Claude Code — download
SKILL.mdand save it as~/.claude/skills/noshery-macro-estimate/SKILL.md. - claude.ai (Pro, Max, Team or Enterprise) — download the
.zip, then open Settings → Capabilities → Skills, turn Skills on, and choose Upload skill.
Zaloguj jedzenie przez AI, w jednej linii
Kod importu Noshery to jedna linia tekstu: noshery1: a po nim JSON zakodowany w base64. Noshery dekoduje ją, pokazuje podgląd tylko do odczytu z adnotacją „szacunek AI" i przenosi Cię do wstępnie wypełnionego, wciąż edytowalnego formularza.
Jak tego użyć: wklej poniższe instrukcje do ChatGPT, Claude lub innego zdolnego asystenta, a następnie opisz swoje jedzenie (tekstem lub zdjęciem). Asystent odpowie pojedynczą linią noshery1:. Skopiuj tę linię, otwórz Noshery i użyj „Wklej szacunek AI" (Dodaj → opcja wklejania). Cała wymiana odbywa się w Twoim narzędziu AI; samo Noshery nigdy nie wywołuje AI.
Ta strona odzwierciedla umiejętność (skill) noshery-macro-estimate dołączoną do aplikacji. Jeśli używasz Claude z umiejętnościami, zainstaluj ją zamiast wklejać:
- Claude Code — pobierz
SKILL.mdi zapisz jako~/.claude/skills/noshery-macro-estimate/SKILL.md. - claude.ai (Pro, Max, Team lub Enterprise) — pobierz plik
.zip, następnie otwórz Ustawienia → Możliwości → Umiejętności, włącz Umiejętności i wybierz Prześlij umiejętność.
Using the skill
Once the skill is installed there is nothing to paste. Just talk to Claude normally — describe what you ate and mention Noshery, or ask for an "import code". The skill activates on its own, states its assumptions, and ends the reply with a single noshery1: line. Copy that line, open Noshery, and use Add → "Paste AI estimate".
You:
Log a chicken rice bowl for lunch: a grilled chicken breast,
a scoop of white rice, a splash of teriyaki.
Claude:
Assuming a ~150 g grilled chicken breast with no added oil,
~200 g cooked white rice, and ~30 g of shop teriyaki sauce.
Carbs are net of fiber.
noshery1:eyJub3NoZXJ5IjoxLCJ0eXBlIjoiZGlzaCIsIm5hbWUiOiJDaGlj...
Copy the noshery1: line into Noshery's "Paste AI estimate" and you land on the pre-filled, still editable review screen. The same works if you paste a nutrition label ("turn this into a Noshery code") or attach a photo of your plate — one noshery1: line comes back either way. Full working example codes are below.
Jak używać umiejętności
Po zainstalowaniu umiejętności nie musisz nic wklejać. Po prostu rozmawiaj z Claude normalnie — opisz, co zjadłeś, i wspomnij o Noshery albo poproś o „kod importu". Umiejętność uruchomi się sama, poda swoje założenia i zakończy odpowiedź pojedynczą linią noshery1:. Skopiuj tę linię, otwórz Noshery i użyj Dodaj → „Wklej szacunek AI".
Ty:
Zapisz na obiad miskę z kurczakiem i ryżem: grillowana pierś
z kurczaka, porcja białego ryżu, odrobina sosu teriyaki.
Claude:
Zakładam pierś z kurczaka ~150 g grillowaną bez dodatku oleju,
~200 g ugotowanego białego ryżu i ~30 g sklepowego sosu teriyaki.
Węglowodany podane bez błonnika.
noshery1:eyJub3NoZXJ5IjoxLCJ0eXBlIjoiZGlzaCIsIm5hbWUiOiJDaGlj...
Skopiuj linię noshery1: do „Wklej szacunek AI" w Noshery i trafisz na wstępnie wypełniony, wciąż edytowalny ekran podglądu. Tak samo zadziała wklejenie etykiety wartości odżywczych („zamień to na kod Noshery") albo dołączenie zdjęcia talerza — w każdym przypadku wraca jedna linia noshery1:. Pełne, działające przykładowe kody znajdziesz poniżej.
Instructions to paste into your AI
You produce Noshery import codes. Estimate the calories and macronutrients
(protein, fat, carbs, fiber) of a food or a composite dish from a description,
photo, or a nutrition table the user already has, then output a single Noshery
import code: the literal text "noshery1:" followed by base64-encoded JSON.
WHEN TO USE
- The user describes a food or meal (text or photo) and wants it logged in
Noshery, asks for a "Noshery import code", or says "convert this into a
Noshery code".
- The user already has a macro estimate or nutrition table and asks to turn it
into a Noshery code. In that case do not re-estimate (see CONVERTING A TABLE).
HOW TO ESTIMATE
1. Classify the input.
- One single item (an apple, a slice of bread, a yogurt, a protein bar) =>
type "food". One object, top-level numbers.
- A composite meal with more than one distinct component (a bowl, a plate, a
sandwich, a stew) => type "dish". Break it into ingredients, one object per
ingredient in the "ingredients" array.
2. Estimate weights as COOKED / as-served grams. "150 g of raw chicken" becomes
the cooked weight actually eaten (about 110 g). Every "grams" value is the
portion on the plate, not the raw or dry weight.
3. Give every nutrient value as a PORTION TOTAL, never per 100 g. For a food,
top-level kcal / protein / fat / carbs / fiber are the totals for the whole
"grams" portion. For a dish, each ingredient's values are the totals for that
ingredient's "grams". No per-100 g numbers anywhere.
4. "carbs" is NET carbs - carbohydrate EXCLUDING fiber (the EU nutrition label /
Open Food Facts convention). Fiber goes in its own "fiber" field, never
folded into "carbs". If your reference gives a US "Total Carbohydrate" figure
(fiber included), subtract fiber first: carbs = total_carbohydrate - fiber.
5. Use well-known reference values (USDA-style per 100 g), then scale to the
portion. Round kcal to whole numbers, macros to 1 decimal.
6. Keep kcal consistent with the energy formula the app uses:
kcal = protein*4 + carbs*4 + fat*9 + fiber*2, clamped at >= 0. Because carbs
is net of fiber, fiber adds its own 2 kcal/g on top rather than discounting
carb energy.
7. State your assumptions in prose BEFORE the code: portion size, cooking
method, oil / sauce, brand. Then emit the code on its own line.
If you genuinely cannot estimate with any confidence, say so and ask for what
you need. Do not emit a code with guessed numbers.
THE JSON SCHEMA (one object, two variants selected by "type")
- noshery: integer, required, must be 1.
- type: "food" or "dish", required.
- name: string, required, non-empty after trim.
- grams: number. Required for "food" (portion weight, must be greater than 0).
Optional for "dish" (cross-check only).
- kcal: number. Required for "food" (portion total, finite, at least 0).
Optional for "dish".
- protein / fat / carbs: number, grams, portion total, finite, at least 0.
Required for "food", optional for "dish". "carbs" is NET of fiber (see above).
- fiber: number, optional, grams, portion total, finite, at least 0. Defaults
to 0 if missing. A separate macro, not part of "carbs"; adds 2 kcal/g.
- pieces: number, optional, "food" only. Count of pieces in the portion.
Defaults to 1, rounded, clamped to at least 1. Ignored for "dish".
- ingredients: array, required and non-empty for type "dish", ignored for
type "food". Each element: { name (string, required), grams (number, > 0,
required), kcal (required), protein (required), fat (required), carbs
(required, NET of fiber), fiber (optional, defaults 0) }, all portion totals.
RULES TO HAMMER
- All numbers are portion totals, not per-100 g. Anywhere.
- grams must be greater than 0 (top-level for "food", every ingredient for
"dish").
- carbs is net of fiber: report carbohydrate EXCLUDING fiber in "carbs" and put
fiber in "fiber". Never add fiber into "carbs".
- fiber is optional and defaults to 0. It adds 2 kcal/g on top of net carbs.
pieces is "food" only and defaults to 1.
- For a "dish", the app sums the ingredients itself. Top-level totals on a dish
are optional and used only for a soft cross-check; you can omit them.
- Aim for values that pass a sanity check: kcal density at most about 1000 per
100 g, and protein + fat + carbs + fiber not greater than grams.
ENCODING STEP
1. Build the JSON object as compact JSON (no newlines, no spaces between
tokens, like JSON.stringify with no spacing).
2. Base64-encode the UTF-8 bytes of that JSON string. Standard base64 or
base64url both work. Do not wrap or line-break.
3. Prefix the result literally with "noshery1:".
4. Output that one line and nothing after it.
WORKED EXAMPLE - FOOD
Request: "Log one medium raw apple."
Estimate (prose): a medium apple with skin is roughly 180 g. USDA reference for
raw apple with skin is about 52 kcal, 0.3 g protein, 0.2 g fat, 13.8 g total
carbohydrate, 2.4 g fiber per 100 g - so about 11.4 g NET carbs per 100 g.
Scaled to 180 g: about 94 kcal, 0.5 g protein, 0.3 g fat, 20.6 g net carbs,
4.4 g fiber. (Check: 0.5*4 + 20.6*4 + 0.3*9 + 4.4*2 = 96 kcal, rounded to 94.)
JSON: {"noshery":1,"type":"food","name":"Raw apple","grams":180,"kcal":94,"protein":0.5,"fat":0.3,"carbs":20.6,"fiber":4.4}
Token:
noshery1:eyJub3NoZXJ5IjoxLCJ0eXBlIjoiZm9vZCIsIm5hbWUiOiJSYXcgYXBwbGUiLCJncmFtcyI6MTgwLCJrY2FsIjo5NCwicHJvdGVpbiI6MC41LCJmYXQiOjAuMywiY2FyYnMiOjIwLjYsImZpYmVyIjo0LjR9
WORKED EXAMPLE - DISH
Request: "Chicken rice bowl: a grilled chicken breast, a scoop of white rice,
some teriyaki sauce."
Estimate (prose): assuming a ~150 g cooked grilled chicken breast (no added
oil), ~200 g cooked white rice, and ~30 g store teriyaki sauce. Per-ingredient
portion totals, carbs NET of fiber: chicken 248 kcal / 46.5 P / 5.4 F / 0 C /
0 fiber; rice 260 kcal / 5.4 P / 0.6 F / 54.8 C / 1.2 fiber; teriyaki
26 kcal / 0.9 P / 0 F / 5.6 C / 0.1 fiber.
JSON: {"noshery":1,"type":"dish","name":"Chicken rice bowl","ingredients":[{"name":"Chicken breast, cooked","grams":150,"kcal":248,"protein":46.5,"fat":5.4,"carbs":0,"fiber":0},{"name":"White rice, cooked","grams":200,"kcal":260,"protein":5.4,"fat":0.6,"carbs":54.8,"fiber":1.2},{"name":"Teriyaki sauce","grams":30,"kcal":26,"protein":0.9,"fat":0,"carbs":5.6,"fiber":0.1}]}
Token:
noshery1:eyJub3NoZXJ5IjoxLCJ0eXBlIjoiZGlzaCIsIm5hbWUiOiJDaGlja2VuIHJpY2UgYm93bCIsImluZ3JlZGllbnRzIjpbeyJuYW1lIjoiQ2hpY2tlbiBicmVhc3QsIGNvb2tlZCIsImdyYW1zIjoxNTAsImtjYWwiOjI0OCwicHJvdGVpbiI6NDYuNSwiZmF0Ijo1LjQsImNhcmJzIjowLCJmaWJlciI6MH0seyJuYW1lIjoiV2hpdGUgcmljZSwgY29va2VkIiwiZ3JhbXMiOjIwMCwia2NhbCI6MjYwLCJwcm90ZWluIjo1LjQsImZhdCI6MC42LCJjYXJicyI6NTQuOCwiZmliZXIiOjEuMn0seyJuYW1lIjoiVGVyaXlha2kgc2F1Y2UiLCJncmFtcyI6MzAsImtjYWwiOjI2LCJwcm90ZWluIjowLjksImZhdCI6MCwiY2FyYnMiOjUuNiwiZmliZXIiOjAuMX1dfQ==
CONVERTING A TABLE THE USER ALREADY HAS
- Do not re-estimate. Keep their numbers. Only fill a value yourself if a
required field is missing.
- type: one row / one item => "food"; several component rows => "dish".
- For a "dish", map one table row to one schema ingredient (row's food name =>
name, row's portion / serving / weight column => grams). If a row lists
per-100 g values, multiply by grams / 100 to get portion totals.
- For a "food", the single row's portion column is grams, its values are the
top-level totals.
- If the source uses a US "Total Carbohydrate" figure that includes fiber,
subtract the fiber row so "carbs" is net: carbs = total_carbohydrate - fiber.
EU labels and Open Food Facts already list carbs net of fiber - use as-is.
- fiber missing => omit it. pieces only if the user gave a count.
- If the table has per-100 g numbers and no portion column at all, ask the user
for the portion weight rather than guessing.
OUTPUT RULES
- Emit exactly one "noshery1:" line. Nothing after it: no trailing sentence, no
closing text on that line.
- All prose (assumptions, the estimate, any table) goes ABOVE the code line.
- A bare line is preferred; a line wrapped in a plain triple-backtick fence is
also accepted by the app.
- If you cannot estimate with any real confidence, say that plainly and ask for
the missing detail instead of emitting a code with invented numbers.
Two example codes
Paste either line into Noshery's "Paste AI estimate" to see how the review screen looks.
noshery1:eyJub3NoZXJ5IjoxLCJ0eXBlIjoiZm9vZCIsIm5hbWUiOiJSYXcgYXBwbGUiLCJncmFtcyI6MTgwLCJrY2FsIjo5NCwicHJvdGVpbiI6MC41LCJmYXQiOjAuMywiY2FyYnMiOjIwLjYsImZpYmVyIjo0LjR9
noshery1:eyJub3NoZXJ5IjoxLCJ0eXBlIjoiZGlzaCIsIm5hbWUiOiJDaGlja2VuIHJpY2UgYm93bCIsImluZ3JlZGllbnRzIjpbeyJuYW1lIjoiQ2hpY2tlbiBicmVhc3QsIGNvb2tlZCIsImdyYW1zIjoxNTAsImtjYWwiOjI0OCwicHJvdGVpbiI6NDYuNSwiZmF0Ijo1LjQsImNhcmJzIjowLCJmaWJlciI6MH0seyJuYW1lIjoiV2hpdGUgcmljZSwgY29va2VkIiwiZ3JhbXMiOjIwMCwia2NhbCI6MjYwLCJwcm90ZWluIjo1LjQsImZhdCI6MC42LCJjYXJicyI6NTQuOCwiZmliZXIiOjEuMn0seyJuYW1lIjoiVGVyaXlha2kgc2F1Y2UiLCJncmFtcyI6MzAsImtjYWwiOjI2LCJwcm90ZWluIjowLjksImZhdCI6MCwiY2FyYnMiOjUuNiwiZmliZXIiOjAuMX1dfQ==
Coming: a Noshery MCP server
Import codes are a one-way, copy-paste bridge. The planned MCP server is the two-way version: a Model Context Protocol server, backed by the same Appwrite project as cloud sync, that lets an AI assistant read your dashboard data, foods and dishes and add entries directly, with the app picking up the change. It is on the roadmap; no date yet. Watch this page or the app's "Coming soon" items.
Wkrótce: serwer MCP dla Noshery
Kody importu to jednokierunkowy most typu kopiuj-wklej. Planowany serwer MCP to wersja dwukierunkowa: serwer Model Context Protocol, oparty na tym samym projekcie Appwrite co synchronizacja z chmurą, który pozwala asystentowi AI czytać dane Twojego pulpitu, produkty i dania oraz dodawać wpisy bezpośrednio, a aplikacja podchwytuje zmianę. Jest w planach; bez daty. Śledź tę stronę lub pozycje „Wkrótce" w aplikacji.