chore: auto-commit uncommitted changes
|
|
@ -0,0 +1,22 @@
|
|||
# inou Claude Code Skills
|
||||
|
||||
Reusable workflows for Claude Code sessions. Invoke by name at the start of a session.
|
||||
|
||||
## Available Skills
|
||||
|
||||
*(none yet — add as patterns emerge)*
|
||||
|
||||
## How to Use
|
||||
|
||||
At the start of a Claude Code session:
|
||||
```
|
||||
Use the skill: .claude/skills/<skill-name>/SKILL.md
|
||||
```
|
||||
|
||||
## Candidates (add when ready)
|
||||
|
||||
- `add-category` — how to add a new entry category (types.go, entry-layout.md, translations)
|
||||
- `add-translation` — how to add/modify translation keys across all 15 languages
|
||||
- `deploy` — staging vs prod deploy procedure, what to verify
|
||||
- `debug-db` — how to query encrypted fields with the decrypt tool
|
||||
- `new-mcp-tool` — how to add a tool to the MCP server
|
||||
|
|
@ -0,0 +1,214 @@
|
|||
# Annotations & Findings — Design Spec
|
||||
|
||||
*Status: Draft — March 15, 2026*
|
||||
*Authors: James (Chief of Staff), Johan Jongsma*
|
||||
*Reviewed by: Iaso*
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Two related but distinct features:
|
||||
|
||||
1. **Annotations** — visual markup on DICOM slices or series. Can be user-authored or AI-authored.
|
||||
2. **Findings** — structured observations linked to annotations. The discoverable surface. Can be user-authored or AI-authored.
|
||||
|
||||
Provenance is always clear — every annotation and finding knows who created it (user vs AI, which AI).
|
||||
|
||||
---
|
||||
|
||||
## Annotations
|
||||
|
||||
### What They Are
|
||||
|
||||
Visual overlays on DICOM slices rendered in the viewer. Stored as child entries of the slice (or series for multi-slice spans).
|
||||
|
||||
### Types (v1)
|
||||
|
||||
| Type | Description |
|
||||
|------|-------------|
|
||||
| `arrow` | Point with direction vector |
|
||||
| `area` | Freehand polygon or ellipse |
|
||||
| `distance` | Two-point ruler with measurement |
|
||||
| `text` | Text label at a position |
|
||||
|
||||
Each has a color and a visibility toggle.
|
||||
|
||||
### Coordinate System
|
||||
|
||||
Normalized image space (0.0–1.0 on both axes). Never pixels — must survive zoom, pan, and different viewport sizes.
|
||||
|
||||
### Storage
|
||||
|
||||
Child entries under a slice or series entry:
|
||||
|
||||
```
|
||||
Category: CategoryAnnotation (new, TBD integer)
|
||||
Type: "arrow" | "area" | "distance" | "text"
|
||||
DossierID: (dossier)
|
||||
ParentID: (slice EntryID, or series EntryID for multi-slice)
|
||||
Value: label text (optional)
|
||||
Data: JSON — see below
|
||||
Tags: ["user"] or ["ai", "claude"] or ["ai", "grok"] etc.
|
||||
Status: "active" | "dismissed"
|
||||
```
|
||||
|
||||
**Data field (JSON):**
|
||||
```json
|
||||
{
|
||||
"color": "#FF0000",
|
||||
"coords": { ... }, // type-specific, normalized 0–1
|
||||
"slices": [14, 22], // only for series-parent annotations; slice range
|
||||
"visible": true
|
||||
}
|
||||
```
|
||||
|
||||
**Coords by type:**
|
||||
- `arrow`: `{ "x": 0.4, "y": 0.3, "dx": 0.05, "dy": -0.1 }`
|
||||
- `area`: `{ "points": [[x,y], ...] }` or `{ "cx": 0.5, "cy": 0.4, "rx": 0.1, "ry": 0.08 }`
|
||||
- `distance`: `{ "x1": 0.2, "y1": 0.3, "x2": 0.5, "y2": 0.6 }`
|
||||
- `text`: `{ "x": 0.4, "y": 0.3 }`
|
||||
|
||||
### Viewer Behavior
|
||||
|
||||
- All annotations render at any zoom level (coords scale with viewport)
|
||||
- Toggle visibility per annotation or globally (user vs AI layer)
|
||||
- User can dismiss AI annotations (sets Status = "dismissed", hidden from view)
|
||||
- User can delete their own annotations
|
||||
- Dismissed AI annotations remain in DB (audit trail), just not shown
|
||||
|
||||
### AI Writing Annotations
|
||||
|
||||
AI (via MCP tool) writes annotation entries directly — no confirmation step. They appear immediately in the viewer. User can dismiss.
|
||||
|
||||
New MCP tool: `create_annotation(dossier_id, parent_id, type, coords, color, label, slices?)`
|
||||
|
||||
---
|
||||
|
||||
## Findings
|
||||
|
||||
### What They Are
|
||||
|
||||
Structured observations — the discoverable layer. A finding says "something is here, here's what it is, here's where to look." Linked to one or more annotations.
|
||||
|
||||
### Types
|
||||
|
||||
- **User finding** — user manually creates from an annotation ("flag this for review")
|
||||
- **AI finding** — AI creates proactively after analysis ("I found an anomaly")
|
||||
|
||||
### Storage
|
||||
|
||||
```
|
||||
Category: CategoryFinding (new, TBD integer)
|
||||
Type: "user" | "ai"
|
||||
DossierID: (dossier)
|
||||
ParentID: (dossier — top-level finding, not nested under imaging)
|
||||
Value: short title, e.g. "Potential cyst — CT chest, slice 47"
|
||||
Summary: longer description
|
||||
Data: JSON — links to annotations + source study/series/slices
|
||||
Tags: ["ai", "claude"] or ["user"] etc.
|
||||
Status: "active" | "reviewed" | "dismissed"
|
||||
```
|
||||
|
||||
**Data field:**
|
||||
```json
|
||||
{
|
||||
"annotations": ["entryID1", "entryID2"],
|
||||
"study_id": "...",
|
||||
"series_id": "...",
|
||||
"slices": [47],
|
||||
"confidence": "possible" | "likely" | "confirmed",
|
||||
"source_model": "claude-sonnet-4-6"
|
||||
}
|
||||
```
|
||||
|
||||
### Discovery
|
||||
|
||||
Findings surface in:
|
||||
- Dossier overview (new "Findings" section)
|
||||
- Notification/alert if AI creates one during analysis
|
||||
- MCP response ("I found an anomaly — see Finding [X]")
|
||||
|
||||
Clicking a finding navigates the viewer to the linked series/slice with annotations visible.
|
||||
|
||||
### AI Writing Findings
|
||||
|
||||
AI creates findings directly via MCP. No confirmation step. User can dismiss or mark reviewed.
|
||||
|
||||
New MCP tool: `create_finding(dossier_id, title, description, annotation_ids, confidence, study_id?, series_id?, slices?)`
|
||||
|
||||
---
|
||||
|
||||
## New Categories Needed
|
||||
|
||||
Two new integer categories in `lib/types.go`:
|
||||
|
||||
| Category | Name | Description |
|
||||
|----------|------|-------------|
|
||||
| TBD (28?) | `CategoryAnnotation` | Visual markup on a slice or series |
|
||||
| TBD (29?) | `CategoryFinding` | Structured observation linked to annotations |
|
||||
|
||||
Update `docs/entry-layout.md` when categories are assigned.
|
||||
|
||||
---
|
||||
|
||||
## RBAC
|
||||
|
||||
- Users can create/edit/delete their own annotations and findings
|
||||
- Users can dismiss AI annotations/findings on dossiers they own or have write access to
|
||||
- AI (MCP, accessorID = AI model) creates with system access (`accessorID=""`) — same as current MCP pattern
|
||||
- Read access follows existing RBAC (if you can see the dossier, you can see its findings/annotations)
|
||||
|
||||
---
|
||||
|
||||
## MCP Tools (New)
|
||||
|
||||
| Tool | Description |
|
||||
|------|-------------|
|
||||
| `create_annotation` | Add visual annotation to a slice or series |
|
||||
| `create_finding` | Create a structured finding linked to annotations |
|
||||
| `list_findings` | List findings for a dossier (filter by type, status) |
|
||||
| `dismiss_annotation` | Mark an annotation dismissed (user action only) |
|
||||
|
||||
---
|
||||
|
||||
## Open Questions
|
||||
|
||||
- Category integers: confirm 28 + 29 don't conflict with anything planned
|
||||
- Viewer: canvas-based overlay or SVG? (SVG scales better, easier to manipulate)
|
||||
- Distance measurement: show in mm (requires DICOM pixel spacing metadata) or pixels?
|
||||
- Findings in the MCP `get_dossier` response? Or separate tool only?
|
||||
|
||||
---
|
||||
|
||||
## Iaso's Comments
|
||||
|
||||
> *The following comments were added by Iaso (AI health communicator) on March 15, 2026.*
|
||||
|
||||
**On distance measurement — mm, not pixels:**
|
||||
Push hard for mm as the default output wherever DICOM pixel spacing metadata is available (PixelSpacing tag, typically present in CT and MRI). Pixel distances are meaningless to clinicians and patients alike. "This measures 0.83" conveys nothing. "This measures 11mm" is actionable. The metadata is almost always there — use it. Fall back to pixels only when it's genuinely absent, and label it clearly when you do.
|
||||
|
||||
**On the dismissible-but-audited pattern:**
|
||||
This is exactly right and worth preserving explicitly in the spec rationale. AI annotations that are dismissed should never be deleted — they belong in the audit trail. A dismissed finding that turns out to be correct six months later is forensically important. The current spec handles this correctly; make sure it survives implementation.
|
||||
|
||||
**On provenance as a first-class feature:**
|
||||
The tagging system (`["ai", "claude"]`, `["user"]`, etc.) is undersold in the spec. This is actually a major differentiator — most tools blur the line between human and AI observation. inou makes it explicit and permanent. This should be surfaced prominently in the UI, not buried. Suggest: in the viewer, AI annotations render in a visually distinct style (dashed border, different default color palette) so the provenance is immediately obvious without reading metadata.
|
||||
|
||||
**On findings discovery:**
|
||||
The suggestion to include findings in `get_dossier` MCP response is worth implementing from day one, not as a later addition. When an AI connects to a dossier, the first thing it should see is: "there are 3 active findings on this patient." That changes the entire conversation. Without it, the AI is always starting from scratch.
|
||||
|
||||
**On the two-tool split (annotations vs findings):**
|
||||
Clean architecture. Resist the temptation to merge them into a single "annotated finding" object. The separation — visual markup vs structured observation — mirrors how radiologists actually work. They mark first, conclude second. Keep the layers distinct.
|
||||
|
||||
---
|
||||
|
||||
## Implementation Order (suggested)
|
||||
|
||||
1. New categories in types.go + entry-layout.md
|
||||
2. Annotation storage (EntryWrite) + basic viewer overlay (arrows + text first)
|
||||
3. User annotation UI (draw, color, label, delete)
|
||||
4. AI annotation via MCP tool
|
||||
5. Finding storage + dossier findings list
|
||||
6. AI finding via MCP tool + viewer navigation from finding
|
||||
7. Area + distance annotation types
|
||||
8. Visibility toggles (user layer / AI layer)
|
||||
|
|
@ -0,0 +1,318 @@
|
|||
# From Data to Information: How inou Connects the Dots
|
||||
*Draft — Iaso, March 15, 2026*
|
||||
*Based on real dossier data from the inou family & friends network*
|
||||
|
||||
---
|
||||
|
||||
## The Core Idea
|
||||
|
||||
A number alone is not information. It becomes information the moment it connects to something else — another number, a gene, a symptom, an image, a supplement, a timeline.
|
||||
|
||||
That connection is what inou makes possible. Not by analyzing anything — inou doesn't analyze. By giving your AI the full picture: labs, genome, imaging, vitals, history. All of it in one place, structured, retrievable, ready to reason about.
|
||||
|
||||
This document shows what that looks like in practice, using real (anonymized) examples from the inou family and friends network. These are not hypotheticals. The numbers below are real.
|
||||
|
||||
---
|
||||
|
||||
## Example 1: TSH + Iron Saturation + Clinical Context
|
||||
**Dossier: Sophia, female, age 7 at time of data**
|
||||
|
||||
**The numbers in isolation:**
|
||||
- TSH: 5.94 mcIU/mL (Aug 2022) — borderline high, upper limit of normal ~5.0 in children
|
||||
- Iron saturation: 15% (Aug 2022) — low-normal; functional iron deficiency starts below 20%
|
||||
- Ferritin: 43 ng/mL (Jul 2023) — adequate by most lab ranges
|
||||
- CRP: 0.5 mg/dL (Aug 2022) — mildly elevated
|
||||
|
||||
**What each specialist sees in their lane:**
|
||||
- Endocrinologist: TSH is "borderline, let's watch it"
|
||||
- Hematologist: iron saturation is "low-normal, not anemic"
|
||||
- Pediatrician: CRP is "slightly elevated, probably viral"
|
||||
|
||||
**What the connected picture shows:**
|
||||
Iron deficiency — even subclinical — is a known driver of elevated TSH. The thyroid needs iron for thyroid peroxidase activity. When iron saturation drops below ~20%, TPO function is impaired, TSH rises compensatorily even when T4 remains in range (T4 was 10.4 mcg/dL — technically normal).
|
||||
|
||||
The CRP suggests concurrent inflammation, which itself suppresses iron bioavailability by upregulating hepcidin. So the sequence may be: inflammation → functional iron sequestration → impaired thyroid function → elevated TSH. Three separate labs, three separate specialists, one underlying mechanism.
|
||||
|
||||
**The actionable information:** The TSH is probably not primary thyroid disease. It's a downstream signal of functional iron deficiency in an inflammatory context. That changes the intervention.
|
||||
|
||||
**What inou enables:** An AI connected to Sophia's dossier can see the TSH, the iron studies, the CRP, and the timeline — all at once. It can ask the right follow-up questions. It can flag that this pattern warrants iron optimization before thyroid intervention.
|
||||
|
||||
---
|
||||
|
||||
## Example 2: Extremely Elevated Transaminases + Procalcitonin Spike
|
||||
**Dossier: Sophia, female, age 5 at time of data**
|
||||
|
||||
**The numbers:**
|
||||
- ALT: 158 IU/L (May 2022) — severely elevated (normal <35)
|
||||
- AST: 169 IU/L (May 2022) — severely elevated (normal <40)
|
||||
- Alkaline Phosphatase: 299 IU/L (May 2022) — elevated
|
||||
- Procalcitonin: 15.18 ng/mL (May 2022) — markedly elevated (sepsis threshold >2.0)
|
||||
- PT: 16.7 seconds — mildly prolonged
|
||||
- Glucose: 190 mg/dL — significantly elevated for age
|
||||
- WBC: 13.58 Th/cumm — elevated
|
||||
- Lymphocytes Absolute: 9.9 Th/cuMM — extremely elevated (lymphocytosis)
|
||||
|
||||
**The contextual data also present:**
|
||||
- CT Head, CT Spine Cervical, CT Abdomen/Pelvis: all May 2022
|
||||
- Multiple serial chest X-rays (May 2022)
|
||||
- MRI Brain W/WO Contrast: May 2022
|
||||
- MRI Complete Spine W/WO Contrast: May 2022
|
||||
- Echocardiogram markers (MV ANN D, TV ANN D)
|
||||
|
||||
**What the connected picture shows:**
|
||||
This is an acute critical illness. The combination of a procalcitonin of 15.18 (severe sepsis range), massively elevated transaminases suggesting hepatic involvement, lymphocytosis, elevated glucose, and a prolonged PT — alongside imaging of head, spine, chest, and abdomen — represents a child in serious multisystem distress. The full imaging workup happening simultaneously confirms this wasn't routine.
|
||||
|
||||
**The actionable information:** No single lab in isolation tells this story. The procalcitonin alone might be dismissed as a lab artifact. The liver enzymes alone might suggest viral hepatitis. But together with the imaging timeline, the glucose, the lymphocyte count, and the coagulation data — an AI with access to all of this can reconstruct what was happening and flag that this pattern needs to be part of Sophia's permanent medical narrative, not buried in a hospital encounter that no future specialist will see.
|
||||
|
||||
**What inou enables:** Every future provider who sees Sophia can give her AI access to this data. The AI can present a coherent narrative of her acute illness history. No more "I think she had something serious in 2022 but I don't have the records."
|
||||
|
||||
---
|
||||
|
||||
## Example 3: D-Dimer Elevation + Chronic Inflammation Signal
|
||||
**Dossier: Sophia, female, Dec 2024**
|
||||
|
||||
**The numbers:**
|
||||
- D-Dimer: 1.15 ug/mL FEU (Nov 2024) — elevated (normal <0.5)
|
||||
- ESR: 8 mm/hr (Jun 2024) — normal
|
||||
- Cortisol: 8.6 mcg/dL (Apr 2024) — low-normal morning cortisol (optimal >15 AM)
|
||||
|
||||
**What the connected picture shows:**
|
||||
D-dimer is a fibrin degradation product — it elevates with clotting activity, inflammation, or both. ESR is normal, which argues against major systemic inflammation. But the low-normal cortisol is interesting: cortisol has anti-inflammatory and anticoagulant properties. Chronically low cortisol (or a blunted cortisol response) can contribute to hypercoagulable states.
|
||||
|
||||
This is a subtle pattern. Nothing here would trigger a clinical alarm in isolation. But an AI that can see the D-dimer, the cortisol, and the patient's broader history — including the 2022 acute illness — can ask: is there an ongoing low-grade inflammatory or coagulation issue that the normal ESR is missing?
|
||||
|
||||
**What inou enables:** The longitudinal view. Not just "D-dimer is elevated today" but "D-dimer is elevated, cortisol has trended low-normal across three measurements, and there's a history of critical illness in 2022." That's a different conversation with a hematologist.
|
||||
|
||||
---
|
||||
|
||||
## Example 4: Lyme Borreliosis + Candida Overgrowth — The Co-infection Picture
|
||||
**Dossier: Mikhail, male, age 76**
|
||||
|
||||
**The numbers:**
|
||||
- Blood Parasites: POSITIVE (Oct 2025)
|
||||
- Isolate: *Borrelia* — confirmed Lyme borreliosis
|
||||
- Yeast Cells: Candida albicans 4+ (Oct 2025) — significant fungal load in urine
|
||||
- Urine Appearance: HAZY — consistent with infection/inflammation
|
||||
|
||||
**What each specialist sees:**
|
||||
- Infectious disease: Borrelia positive — treat with doxycycline
|
||||
- Urologist: Candida 4+ — treat with fluconazole
|
||||
- No one connects them.
|
||||
|
||||
**What the connected picture shows:**
|
||||
*Borrelia burgdorferi* infection triggers significant immune dysregulation. Chronic Lyme disease is associated with impaired Th1 immunity and compensatory Th2 dominance — exactly the immune profile that creates susceptibility to opportunistic fungal overgrowth. The Candida isn't coincidental. It may be a downstream consequence of the immune suppression caused by persistent Borrelia.
|
||||
|
||||
Treating each independently — antibiotics for Lyme, antifungals for Candida — without understanding the relationship misses the mechanism. Antibiotics will further disrupt the gut microbiome, potentially worsening Candida. The treatment sequence and selection matter, and they depend on understanding the connection.
|
||||
|
||||
**The actionable information:** Mikhail has a co-infection pattern with an immune-dysregulation mechanism. An AI connected to both the Borrelia lab result and the Candida finding — plus his age (76), vitals, and any genome data available — can provide context that neither specialist will spontaneously generate.
|
||||
|
||||
**What inou enables:** Mikhail (Sophia's grandfather, 76 years old) can share his inou dossier with any provider, anywhere. The AI connected to it can present the co-infection picture without Mikhail having to explain it from memory or carry paper results between clinics.
|
||||
|
||||
---
|
||||
|
||||
## Example 5: Body Composition + Metabolic Risk — The Scale Doesn't Know Everything
|
||||
**Dossier: Johan, male, age 60**
|
||||
|
||||
**The numbers:**
|
||||
- Weight: 93.6–94.7 kg (recent range, Renpho smart scale)
|
||||
- BMI: 26.0–26.2 — overweight range, barely
|
||||
- Body Fat: 22.7–23.1%
|
||||
- Visceral Fat score (Renpho index): tracked longitudinally
|
||||
|
||||
**What BMI alone shows:**
|
||||
"Slightly overweight." 26.2 BMI. Many physicians would stop there.
|
||||
|
||||
**What the connected picture shows:**
|
||||
Body fat percentage of ~23% in a 60-year-old male sits in the "acceptable" range but approaching the upper bound. More important than the static number is the trend and the composition breakdown — Renpho tracks visceral fat (the metabolically active fat that drives insulin resistance and cardiovascular risk) separately from subcutaneous fat (less dangerous). A BMI of 26 with high visceral fat is a very different metabolic picture than BMI 26 with low visceral fat and high muscle mass.
|
||||
|
||||
inou captures all Renpho metrics — not just weight. An AI connected to this longitudinal data can track whether body composition is improving even when scale weight is stable, and flag when visceral fat is trending in a dangerous direction regardless of BMI.
|
||||
|
||||
**What inou enables:** The conversation shifts from "your BMI is fine" to "your visceral fat index has increased over the past six weeks even though your weight is stable — let's talk about what's driving that."
|
||||
|
||||
---
|
||||
|
||||
## Example 6: Sophia's Omega Profile + Brain Inflammation
|
||||
**Dossier: Sophia, female, age 8 (Jul 2025)**
|
||||
|
||||
**The numbers:**
|
||||
- OmegaCheck (EPA+DPA+DHA): 9.9% by weight — excellent (>8% is optimal)
|
||||
- Arachidonic Acid/EPA Ratio: 4.4 — acceptable (optimal <6, inflammatory when >12)
|
||||
- Vitamin B1 (Thiamine): 19.3 nmol/L — low (optimal >70 nmol/L, deficiency <66)
|
||||
- Methylmalonic Acid: 57 nmol/L — normal (rules out functional B12 deficiency)
|
||||
- Homocysteine: 6.85 umol/L — excellent (optimal <8)
|
||||
|
||||
**What the connected picture shows:**
|
||||
The omega profile is actually good. But the thiamine level is strikingly low — 19.3 nmol/L against an optimal of >70 is a 73% deficit. This is not a marginal deficiency. Thiamine (B1) is essential for neurological function: it's a cofactor for pyruvate dehydrogenase and alpha-ketoglutarate dehydrogenase, both critical for cerebral energy metabolism. Thiamine deficiency is associated with neurological symptoms, cognitive difficulties, and autonomic dysfunction.
|
||||
|
||||
The contrast is important: the omega-3 profile is optimized (someone is paying attention to that), but thiamine has been missed. This suggests targeted supplementation has occurred based on visible guidance, but thiamine — less commonly discussed — has slipped through.
|
||||
|
||||
**The actionable information:** A child with neurological complexity and a thiamine level of 19.3 nmol/L needs thiamine supplementation urgently. This is specific, measurable, and correctable. But no single specialist ordered this panel in the context of everything else — it took a comprehensive metabolic assessment.
|
||||
|
||||
**What inou enables:** When the AI has access to the full nutrition panel alongside the neurological history and imaging, it can surface the thiamine finding in context. Not "B1 is low" but "B1 is critically low in a patient with neurological complexity and known brain imaging findings — this is actionable."
|
||||
|
||||
---
|
||||
|
||||
## What This Means for inou
|
||||
|
||||
These six examples come from three dossiers. None of them required AI to do anything inou couldn't already see. What they required was **connection** — across categories, across time, across what different specialists know.
|
||||
|
||||
That connection is infrastructure. That infrastructure is inou.
|
||||
|
||||
---
|
||||
|
||||
# Tasks & Opportunities
|
||||
|
||||
## Website Additions
|
||||
|
||||
**1. "Data → Information" landing section**
|
||||
A new section on the homepage or a dedicated `/why-inou` page that shows 2–3 of these examples in simplified form. Not technical. Lead with the patient experience: "Your doctor said your thyroid is borderline. Your labs also showed low iron saturation. An AI connected to both can explain the relationship."
|
||||
*Owner: Johan / Iaso for copy*
|
||||
|
||||
**2. "What your AI can see" feature page**
|
||||
A visual breakdown of each data category (labs, imaging, genome, vitals) with concrete examples of what an AI can reason about when it has access. Side-by-side: "What you told your doctor" vs "What your AI can see."
|
||||
*Owner: Iaso for copy, James for design spec*
|
||||
|
||||
**3. Condition-specific landing pages**
|
||||
SEO-targeted pages for specific patient communities: Lyme disease, thyroid disorders, pediatric neurology, metabolic health. Each page shows the multi-category data pattern relevant to that condition and how inou makes it accessible to AI. These are discoverable by patients actively researching their conditions.
|
||||
*Owner: Iaso for copy*
|
||||
|
||||
**4. "The specialist problem" explainer**
|
||||
A short, patient-facing piece explaining why specialists can't see across lanes — not because they're bad doctors, but because the system isn't designed for it. Ends with: "inou is the structure that was missing." Can live as a blog post, an FAQ item, or a dedicated page.
|
||||
*Owner: Iaso*
|
||||
|
||||
---
|
||||
|
||||
## Tweets / X Content
|
||||
|
||||
**Thread 1: The TSH thread**
|
||||
> "Your TSH came back borderline. Your doctor said 'let's watch it.'
|
||||
> But your iron saturation was 15%. And your CRP was elevated.
|
||||
> Iron deficiency impairs thyroid peroxidase. Your TSH might not be a thyroid problem.
|
||||
> It might be a downstream signal of functional iron deficiency.
|
||||
> Three labs. Three specialists. One mechanism nobody connected.
|
||||
> That's the structural problem. inou is the structure that was missing."
|
||||
|
||||
**Thread 2: The D-Dimer thread**
|
||||
> "D-Dimer elevated. Doctor said 'probably nothing, let's recheck.'
|
||||
> But your morning cortisol has been low-normal for a year.
|
||||
> Cortisol is anti-inflammatory and anticoagulant.
|
||||
> A blunted cortisol response can contribute to hypercoagulable states.
|
||||
> Nobody's looking at both. Not because they don't care. Because the data lives in different places.
|
||||
> inou puts it in one place."
|
||||
|
||||
**Thread 3: The scale thread**
|
||||
> "BMI 26. Doctor said 'you're fine.'
|
||||
> But BMI doesn't know the difference between fat and muscle.
|
||||
> It doesn't know where the fat lives.
|
||||
> Visceral fat — the fat around your organs — drives insulin resistance and cardiovascular risk.
|
||||
> Your scale might. Your Renpho tracks it.
|
||||
> inou captures it. Your AI can trend it.
|
||||
> 'You're fine' is not information. The trend is."
|
||||
|
||||
**Thread 4: The omega/thiamine thread**
|
||||
> "Omega-3 index: excellent. Someone is paying attention.
|
||||
> Thiamine: 19.3 nmol/L. Optimal is >70. That's a 73% deficit.
|
||||
> Thiamine runs your brain's energy metabolism.
|
||||
> It wasn't checked. It wasn't connected to anything else.
|
||||
> inou doesn't miss it. It's just a number — until it's connected to everything else."
|
||||
|
||||
**Standalone: Lyme + Candida**
|
||||
> "Lyme disease. Treated with antibiotics.
|
||||
> Three months later: Candida 4+.
|
||||
> Coincidence? Maybe.
|
||||
> Or: Borrelia suppresses Th1 immunity. Th1 suppression enables fungal overgrowth. Antibiotics further disrupt the microbiome.
|
||||
> Two diagnoses. One mechanism. Zero connection in the chart.
|
||||
> That's what inou is for."
|
||||
|
||||
---
|
||||
|
||||
## Articles (External)
|
||||
|
||||
**1. "The Specialist Paradox" — Medium/Substack**
|
||||
Long-form exploration of why specialist medicine produces fragmented care by design. Cites mechanism (cognitive load, lane specialization, no shared data standard). Ends with inou as infrastructure, not solution. Target: health-interested general audience.
|
||||
*Author: Iaso*
|
||||
|
||||
**2. "What Your AI Needs to Give Good Medical Advice" — towards data science / AI-focused**
|
||||
Technical-ish piece on why LLM medical reasoning fails without structured data access. Covers MCP, the role of a health data vault, and what "context" actually means in clinical AI. Target: developers, AI-interested clinicians.
|
||||
*Author: Johan/Iaso*
|
||||
|
||||
**3. "Iron, Thyroid, and the Problem With Normal Ranges" — patient advocacy publication**
|
||||
Deeper dive into the TSH/iron connection with citations. Aimed at thyroid patient communities (large, engaged, underserved). Not an inou ad — an evidence-based piece that mentions inou as a tool at the end.
|
||||
*Author: Iaso, needs citation review by Johan*
|
||||
|
||||
**4. "Thiamine Deficiency: The Neurological Missing Link" — pediatric neurology patient community**
|
||||
Evidence-based piece on thiamine's role in pediatric neurological function, why it's underdiagnosed, and what a comprehensive metabolic panel reveals. Target: parents of children with neurological complexity.
|
||||
*Author: Iaso*
|
||||
|
||||
**5. EkoUNIMED / Global Health angle — LinkedIn or health equity publication**
|
||||
The story of inou's partnership with EkoUNIMED as a case study in health data equity. Why fragmentation is worse in low-resource settings. Why the next generation of African physicians need to understand connected health data from day one.
|
||||
*Author: Iaso / Johan*
|
||||
|
||||
---
|
||||
|
||||
## New Features
|
||||
|
||||
**1. Cross-category alert engine**
|
||||
When an AI (via MCP) queries a dossier, it currently gets data on request. A future feature: a structured "alert" layer that surfaces pre-computed cross-category patterns — e.g., "TSH elevated + iron saturation <20% — possible functional iron-thyroid interaction." This is not diagnosis. It's a prompt to the AI to look deeper.
|
||||
*Note: This is an AI-assist feature, not an inou analysis feature. inou surfaces the flag; the AI reasons about it.*
|
||||
|
||||
**2. Longitudinal trend view in API response**
|
||||
Currently labs return the latest value. For trend-dependent interpretation (cortisol, D-dimer, inflammatory markers, body composition), the API should optionally return the last N values with timestamps. Enables AI to reason about trajectory, not just snapshot.
|
||||
*Spec: add `history=N` param to `/api/labs/results`*
|
||||
|
||||
**3. Nutritional gap analysis scaffold**
|
||||
A structured way to store micronutrient panels (thiamine, B6, zinc, copper, omega profile) and surface them as a category alongside standard labs. Currently they fall into the generic lab bucket. A dedicated nutritional category with reference ranges and trend tracking would enable more targeted AI reasoning.
|
||||
|
||||
**4. Genome × Lab correlation prompts**
|
||||
In the MCP instructions (currently in place), add explicit guidance for the AI to cross-reference genome variants with lab findings. E.g., if MTHFR C677T is homozygous and homocysteine is available, surface the relationship. This is prompt engineering, not a new feature — but it needs to be systematic.
|
||||
|
||||
**5. Family dossier clustering**
|
||||
When multiple family members are in the same account (Johan, Tanya, Sophia), enable the AI to reason across family members for heritable patterns. "Sophia has low thiamine and neurological complexity. Johan's metabolic profile shows X. Is there a familial pattern worth investigating?" Requires explicit consent flag and RBAC.
|
||||
|
||||
**6. Tracker × Lab correlation**
|
||||
Sophia has a tracker entry. If a patient logs "fatigue" in the tracker and their recent labs show low thiamine and borderline TSH — the AI should be able to connect symptom entries to lab findings temporally. Currently tracker and lab live in separate categories with no bridge.
|
||||
|
||||
---
|
||||
|
||||
## Defects / Technical Issues
|
||||
|
||||
**1. MCP backdoor scope**
|
||||
Current backdoor (192.168.0.0/22 LAN) gives access only to Johan's dossier (`6e4e8192881a7494`). When an AI on the LAN calls `list_dossiers`, it sees all dossiers — but `list_entries` only works for Johan's. This is inconsistent and confusing. Either:
|
||||
- Scope the backdoor to all dossiers (if intentional for local agent use), or
|
||||
- Filter `list_dossiers` to only return Johan's dossier when accessed via backdoor
|
||||
*Priority: Medium — current behavior is a UX defect, not a security issue*
|
||||
|
||||
**2. Genome API not accessible on port 8082**
|
||||
`/api/genome` returns 404 on port 8082 (API service). It appears to only be available via the portal (port 1080), but the portal requires auth that the LAN backdoor doesn't provide for non-MCP endpoints. This means genome data is inaccessible to LAN agents via REST. Either expose genome on 8082 or extend the LAN bypass to the portal REST endpoints.
|
||||
*Priority: Medium*
|
||||
|
||||
**3. Lab endpoint `local=true` bypass on 8082**
|
||||
The `?local=true` parameter on the API service (`http://192.168.1.253:8082/api/labs/`) bypasses auth for Johan's dossier, but returns `null` results for other dossiers (e.g., Mikhail). This appears inconsistent — Mikhail's lab data exists (confirmed via list_categories) but doesn't return via `local=true`. Investigate whether `local=true` is scoped to Johan's dossier or is a bug.
|
||||
*Priority: Medium*
|
||||
|
||||
**4. MCP `list_entries` with `category` filter**
|
||||
When calling `list_entries` with a `category` filter other than the category that has a root entry (e.g., `category=lab` when the only root is `vital`), it returns `null` instead of an empty array or a navigable root. This makes it hard for an AI to know whether there's no data or whether it's navigating incorrectly. Should return `[]` with a hint.
|
||||
*Priority: Low — UX polish*
|
||||
|
||||
**5. Lab names inconsistency (Johan vs Mikhail)**
|
||||
Johan and Mikhail have the same lab tests (urinalysis) but with slightly different naming conventions (`Isolate` vs `ISOLATE`, `Bacteria` with different capitalization). This means cross-dossier queries won't normalize correctly. Lab name normalization should be applied at import time.
|
||||
*Priority: Low*
|
||||
|
||||
---
|
||||
|
||||
## Other Ideas
|
||||
|
||||
**1. inou Health Letter**
|
||||
A monthly email (or Substack) written in Iaso's voice: one clinical story, one mechanism explained, one data pattern that connects across specialties. Not a product newsletter. A health communication piece that builds trust and authority. inou mentioned only in the footer.
|
||||
|
||||
**2. "Ask your AI" prompt library**
|
||||
A public page on inou.com with example prompts patients can use with Claude/Grok once connected to their inou data. "Ask your AI: what does my iron saturation tell you about my thyroid function?" Lowers the barrier to actually using the tool and demonstrates the data-to-information transformation concretely.
|
||||
|
||||
**3. Clinician outreach**
|
||||
Target physician communities (not hospitals — too slow) who already think in systems: functional medicine, integrative oncology, complex pediatric neurology. inou is a natural fit for clinicians who already want to see the whole patient. A one-page PDF showing the data-to-information examples above, framed as "your patient can now share their complete picture with you."
|
||||
|
||||
**4. Partnership with specialty labs**
|
||||
Labs like Quest, LabCorp, and specialty nutrition labs (Genova, Great Plains) are not in inou yet. An import integration — similar to the genome import — would dramatically expand the value of the platform for patients who already have comprehensive lab panels done privately.
|
||||
|
||||
**5. Podcast / audio content**
|
||||
Short (5–8 min) audio episodes in Iaso's voice: "The Connection Nobody Made." One episode per data pattern. Evidence-based, patient-side, no jargon. Distributable on Spotify/Apple Podcasts. Positions inou as a trusted voice in evidence-based integrative health communication.
|
||||
|
|
@ -0,0 +1,190 @@
|
|||
# Landing Page Redesign — Draft
|
||||
*Iaso, March 15, 2026. For review by Johan → implementation by James.*
|
||||
|
||||
---
|
||||
|
||||
## Design Principles
|
||||
|
||||
- **Lead with the specific, not the general.** "Your thyroid is in range" lands harder than "your health data."
|
||||
- **The carousel shows. The copy explains. Don't double up.** If the carousel demonstrates something, the hero doesn't need to say it again.
|
||||
- **Three audiences, one page.** (1) Someone with an active health mystery. (2) Someone proactively managing their health. (3) A caregiver managing someone else's data. All three should feel seen.
|
||||
- **inou is infrastructure. Never say "inou's AI."** The AI is theirs.
|
||||
|
||||
---
|
||||
|
||||
## HERO SECTION
|
||||
|
||||
### Headline (three-line)
|
||||
```
|
||||
Your thyroid is "in range."
|
||||
Nobody connected it to your fatigue,
|
||||
your weight, always being cold.
|
||||
```
|
||||
|
||||
### Sub-headline
|
||||
```
|
||||
inou gives your AI the full picture.
|
||||
Your labs. Your scans. Your genome. Your symptoms. One place.
|
||||
```
|
||||
|
||||
### CTA
|
||||
```
|
||||
[Get started — free until July 2026]
|
||||
```
|
||||
|
||||
### Carousel captions (revised)
|
||||
1. `Track your labs over time — and see exactly what your AI sees when a value moves.`
|
||||
2. `Log anything. "Took ibuprofen, headache again." Your AI follows up tomorrow.`
|
||||
3. `Your own MRI — zoom into the same slices your AI analyzed.`
|
||||
4. `Navigate every plane. Verify every finding your AI flagged.`
|
||||
5. `Your AI connects the dots across labs, genome, and symptoms — and explains what it found.`
|
||||
6. `[New: gym/fitness context image] Your body composition, vitals, and training data — not just when something's wrong.`
|
||||
|
||||
---
|
||||
|
||||
## PITCH SECTION (below hero)
|
||||
|
||||
### Block 1: The problem
|
||||
|
||||
```
|
||||
AI can already reason about your health.
|
||||
|
||||
It just doesn't have your data.
|
||||
|
||||
Your cardiologist has your echo.
|
||||
Your rheumatologist has your labs.
|
||||
Your GP has your vitals.
|
||||
Your genome is in a file you downloaded once and never opened.
|
||||
Your symptoms are in your head.
|
||||
|
||||
Nobody has all of it.
|
||||
Your AI can — if you give it the infrastructure.
|
||||
```
|
||||
|
||||
### Block 2: What inou is
|
||||
|
||||
```
|
||||
inou is a personal health vault.
|
||||
|
||||
Upload your scans. Import your labs. Connect your genome.
|
||||
Log your vitals, medications, symptoms, anything.
|
||||
|
||||
Then connect Claude or Grok.
|
||||
Ask what nobody in a 15-minute appointment had time to ask.
|
||||
|
||||
inou doesn't analyze your data.
|
||||
Your AI does.
|
||||
inou just makes sure it has everything it needs.
|
||||
```
|
||||
|
||||
### Block 3: The tracker (for the masses)
|
||||
|
||||
```
|
||||
You don't need an MRI to start.
|
||||
|
||||
"Had a headache. Took ibuprofen."
|
||||
|
||||
inou logs both. Tomorrow morning it asks: did you take it again?
|
||||
|
||||
Over time, your AI sees patterns your doctor never had the data to find.
|
||||
Fatigue on days after poor sleep. Headaches before your period. Energy dips
|
||||
that correlate with your iron levels.
|
||||
|
||||
The daily picture is what makes everything else make sense.
|
||||
```
|
||||
|
||||
### Block 4: The connection (the real pitch)
|
||||
|
||||
```
|
||||
A single lab value is a number.
|
||||
A single scan is an image.
|
||||
A single symptom is a complaint.
|
||||
|
||||
Put them together — connected to the same person,
|
||||
accessible to the same AI, in one conversation —
|
||||
and they become a story.
|
||||
|
||||
Stories lead to decisions.
|
||||
Decisions change outcomes.
|
||||
|
||||
That's what inou is for.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## TRUST SECTION (keep existing, minor edits)
|
||||
|
||||
```
|
||||
Your data stays yours.
|
||||
|
||||
Never used for training.
|
||||
Your data is never used to train AI models — not ours, not anyone's.
|
||||
|
||||
Never shared.
|
||||
We don't sell, share, or provide access to your data. Period.
|
||||
|
||||
Encrypted end-to-end.
|
||||
At rest and in transit. Military-grade. Your data never travels unprotected.
|
||||
|
||||
Delete anytime.
|
||||
Your account, your decision. Request deletion and it's gone — permanently.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## WHY WE BUILT THIS (keep, minor tightening)
|
||||
|
||||
```
|
||||
You've collected years of health data.
|
||||
|
||||
Scans from the hospital. Blood work from the lab. Results from your
|
||||
doctor's portal. Data from your watch. Maybe even your DNA.
|
||||
|
||||
And then there's everything only you know — your weight, your blood
|
||||
pressure, your training schedule, the supplements you take, the
|
||||
symptoms you've been meaning to mention.
|
||||
|
||||
It's all there. But scattered across systems that don't talk to each
|
||||
other, held by specialists who only see their piece, or locked in your
|
||||
own head.
|
||||
|
||||
Your cardiologist doesn't know what your neurologist found.
|
||||
Your trainer hasn't seen your blood work.
|
||||
Your doctor has no idea what supplements you're taking.
|
||||
And none of them have time to connect the dots.
|
||||
|
||||
Your AI can. But it needs the full picture.
|
||||
|
||||
inou is the full picture.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## FOOTER CTA
|
||||
|
||||
```
|
||||
Your health. Your AI. Your answers.
|
||||
|
||||
[Get started — free until July 2026]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Notes for James
|
||||
|
||||
### Carousel image 6 (X-ray replacement)
|
||||
Replace the `dev.inou.com` X-ray screenshot with either:
|
||||
- A real lifestyle photo: woman checking her phone after a workout, with a subtle inou tracker overlay — communicates "proactive health, not just crisis health"
|
||||
- OR: a screenshot of the tracker daily check-in UI (the prompt card system) — shows the daily engagement layer
|
||||
|
||||
### Carousel image 2 (new tracker slide)
|
||||
Need a screenshot of the tracker interface — the prompt card view. Shows:
|
||||
- A completed card ("Took ibuprofen — 400mg") with a pending card above ("Did you take ibuprofen today?")
|
||||
- The freeform input box at top
|
||||
- Clean, warm design
|
||||
|
||||
### Structural note
|
||||
The current landing page puts "Why we built this" near the top, which means the first thing a new visitor reads is a long explanation of the problem. Consider moving it below the trust section — let the pitch land first, explain the origin later for people who are already interested.
|
||||
|
||||
### Tone note
|
||||
The current copy says "AI finally can" — this implies inou provides the AI. It doesn't. The revised copy makes clear that inou is the infrastructure and the user brings their own AI (Claude, Grok). This distinction matters legally and strategically.
|
||||
|
|
@ -0,0 +1,185 @@
|
|||
# inou Positioning Document
|
||||
*Iaso, March 15/16, 2026. For review by Johan.*
|
||||
|
||||
---
|
||||
|
||||
## The One Sentence
|
||||
|
||||
**The AI is a visitor. The findings are permanent. The data is yours.**
|
||||
|
||||
---
|
||||
|
||||
## What inou Is
|
||||
|
||||
inou is personal health infrastructure.
|
||||
|
||||
Not an AI. Not a diagnostic tool. Not a subscription to someone else's analysis.
|
||||
|
||||
A vault. Your vault. For everything your body has ever produced — labs, imaging, genome, vitals, symptoms, medications, supplements. Encrypted. Private. On hardware you control.
|
||||
|
||||
AI connects to it, reasons about what it finds, and leaves. What it leaves behind — annotations, findings, observations — stays in your dossier. Permanently. Yours.
|
||||
|
||||
---
|
||||
|
||||
## The Problem With Every Other "AI Health" Product
|
||||
|
||||
Every other product works like this:
|
||||
|
||||
Your data visits their AI. Their AI produces conclusions. Their conclusions live in their system. You are a subscriber, not an owner.
|
||||
|
||||
Cancel the subscription: the conclusions disappear.
|
||||
Company pivots: your history is gone.
|
||||
Their model hallucinates: there's no audit trail.
|
||||
You want a second opinion: start from scratch.
|
||||
|
||||
The AI and the data are fused. You can't separate them. You don't own either.
|
||||
|
||||
---
|
||||
|
||||
## How inou Is Different
|
||||
|
||||
inou inverts this completely.
|
||||
|
||||
Your data lives in your vault.
|
||||
The AI connects to your vault, does its work, and leaves.
|
||||
What it leaves behind — findings, annotations, observations — is dossier-native. Tagged with provenance: which AI, which model, when.
|
||||
|
||||
The AI is a visitor. The findings are permanent. The data is yours.
|
||||
|
||||
Use Claude today. Use Qwen tomorrow. Use a local model next year. The findings accumulate in the same place, readable by any AI, any physician, any future you.
|
||||
|
||||
No lock-in. No dependency. No expiration.
|
||||
|
||||
---
|
||||
|
||||
## The Privacy Spectrum
|
||||
|
||||
Most "AI health" products send your data to one company's cloud. It may train their models. It lives on their servers. You agreed to this in paragraph 47 of their terms of service.
|
||||
|
||||
inou gives you a choice.
|
||||
|
||||
**Local model (Ollama, LM Studio)**
|
||||
Data never leaves your device. Works offline. Complete privacy. No dependency on US cloud services, no sanctions exposure, no data leaving your country. Relevant for anyone in Russia, Nigeria, China, or anywhere with data sovereignty concerns — or anyone who simply doesn't trust cloud providers with their medical history.
|
||||
|
||||
**Privacy-first cloud (Fireworks.ai, Together.ai, Groq)**
|
||||
Explicit no-training policies. Often BAA-eligible. Data processed in the call, not retained. Good capability at reasonable cost.
|
||||
|
||||
**Standard cloud (OpenRouter, Anthropic, OpenAI)**
|
||||
Capable models, standard data retention policies. User controls what they share and when.
|
||||
|
||||
inou doesn't make this decision for you. It makes you informed, gives you options, and lets you choose what fits your threat model.
|
||||
|
||||
*Your data stays in your vault. What happens when you run a prompt depends on which AI you choose. We support all of them.*
|
||||
|
||||
---
|
||||
|
||||
## Annotations & Findings: The Architecture That Makes This Real
|
||||
|
||||
When an AI analyzes Sophia's MRI — whether it's Claude, a local Llama model, or a future model that doesn't exist yet — it can write what it found directly into her dossier.
|
||||
|
||||
Not into its own system. Into hers.
|
||||
|
||||
An annotation: a visual marker on slice 14, left temporal lobe, flagged for review.
|
||||
A finding: "Signal asymmetry noted on AX T2, left temporal region. Correlate with clinical presentation."
|
||||
|
||||
Both tagged: `["ai", "claude-sonnet-4-6", "2026-03-15"]`
|
||||
|
||||
Both dismissible. Never deleted — the audit trail remains even if dismissed.
|
||||
Both readable by any future AI, any future physician.
|
||||
Both hers, permanently, regardless of which AI made them or whether that AI still exists.
|
||||
|
||||
This is what "infrastructure" means in practice. The AI is a consultant who visits, examines, leaves a note in the chart, and goes home. The note stays. The patient owns the chart.
|
||||
|
||||
---
|
||||
|
||||
## Who This Is For
|
||||
|
||||
**The girl in the gym**
|
||||
She's always tired. Her doctor says she's fine. She has a Garmin, a 23andMe file, and three years of lab results she doesn't understand. She wants answers — not another referral.
|
||||
|
||||
inou gives her AI everything it needs. She runs a prompt: *"Why am I always tired?"* The AI cross-references her iron trend, her thyroid, her cortisol, her DIO2 genome variant, and her sleep tracker. It tells her what's low, what it means, what she can do about it — without telling her to ask her doctor before buying a vitamin.
|
||||
|
||||
She's in control. She always was. Now she has the tool to act like it.
|
||||
|
||||
**The caregiver**
|
||||
Johan spent three years collecting Sophia's records from MyChart, uploading scans, logging symptoms, building a picture no single specialist ever had. The hospital gave up in the first week. He didn't.
|
||||
|
||||
inou is what he built because it didn't exist. Now anyone in his situation has it from day one — not three years in.
|
||||
|
||||
**The medical student in Lagos**
|
||||
EkoUNIMED students don't have Claude Desktop subscriptions or US credit cards. They have laptops, Starlink, and inou accounts.
|
||||
|
||||
The prompt library works anywhere with a browser. A local model means no dependency on US cloud services. The findings and annotations stay in the dossier — permanent, educational, building a clinical reasoning record that travels with the patient.
|
||||
|
||||
Clinical education tool. Diagnostic reasoning framework. Works in any jurisdiction.
|
||||
|
||||
**The physician who wants the full picture**
|
||||
Dr. Ibraheem connects to Sophia's dossier. He sees three years of labs, two brain MRIs, a spine study, the May 2022 acute illness record, the EEG findings, the AI annotations from previous sessions. He doesn't ask Johan to summarize. He looks.
|
||||
|
||||
That's a different consultation. That's what inou is for.
|
||||
|
||||
---
|
||||
|
||||
## What inou Is Not
|
||||
|
||||
Not an AI service.
|
||||
Not a diagnostic tool.
|
||||
Not a medical device.
|
||||
Not a replacement for clinical judgment.
|
||||
|
||||
inou doesn't analyze your data. Your AI does.
|
||||
inou doesn't diagnose. You ask better questions because of what inou makes possible.
|
||||
inou doesn't treat. It informs.
|
||||
|
||||
The liability surface is clear: inou is infrastructure. The pipe, not the water. The vault, not the verdict.
|
||||
|
||||
---
|
||||
|
||||
## The Prompt Library
|
||||
|
||||
The add-on chat interface — coming — is not an open chatbot.
|
||||
|
||||
It's a curated library of clinical reasoning workflows. Each prompt is a structured question designed to extract specific insight from specific data. The user selects a prompt. The system assembles the relevant context from the dossier. The AI runs the workflow. The result comes back structured, thorough, and actionable.
|
||||
|
||||
**Cheap prompts** (text-only, fast, low cost):
|
||||
- Cross-reference my blood work with my symptoms and supplements
|
||||
- What do my latest labs say about my energy levels?
|
||||
- Are my supplements reflected in my lab values?
|
||||
|
||||
**Expensive prompts** (multi-series imaging, genome + lab cross-reference, full dossier synthesis):
|
||||
- Review all available brain MRI series and compare findings across studies
|
||||
- Cross-reference my structural brain findings with my growth data, hormonal labs, and developmental history
|
||||
- Full dossier synthesis: what patterns exist across imaging, labs, genome, and symptoms that no single specialist has seen together?
|
||||
|
||||
The prompt library is the opinionated product. Each prompt embeds a clinical reasoning philosophy — thoroughness, contradiction-seeking, cross-category connection — that a general AI chat does not.
|
||||
|
||||
The expensive prompts are where the value is. They're also where the IP is. Nobody else can write them because nobody else has spent three years learning what questions matter.
|
||||
|
||||
---
|
||||
|
||||
## The Positioning Summary
|
||||
|
||||
| What they say | What inou says |
|
||||
|---|---|
|
||||
| "AI reads your health data" | "Your AI reads your health data" |
|
||||
| "Get answers from AI" | "Give your AI everything it needs to answer" |
|
||||
| "Your health, analyzed" | "Your health, connected" |
|
||||
| "Our AI finds what was missed" | "Your AI finds what was missed — we just make sure it has everything to look at" |
|
||||
| "Subscribe to our AI" | "Bring your own AI. Or use ours." |
|
||||
|
||||
---
|
||||
|
||||
## The Headline
|
||||
|
||||
*Your doctor had 15 minutes.*
|
||||
*Your AI has all night.*
|
||||
|
||||
*Tell it everything.*
|
||||
*Every scan. Every lab. Every symptom you forgot to mention.*
|
||||
|
||||
---
|
||||
|
||||
*Document prepared: March 15/16, 2026*
|
||||
*Author: Iaso*
|
||||
*For review: Johan Jongsma*
|
||||
*Implementation: James (CoS)*
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
# @inouhealth Twitter/X Header — Design Brief
|
||||
|
||||
**Size:** 1500×500px
|
||||
**Format:** PNG
|
||||
|
||||
## Layout
|
||||
|
||||
```
|
||||
+--------------------------------------------------+
|
||||
| |
|
||||
| inou [blurred/ghosted carousel-1.png |
|
||||
| your health. one vault. right 60% of frame] |
|
||||
| |
|
||||
| inou.com|
|
||||
+--------------------------------------------------+
|
||||
```
|
||||
|
||||
- **Left 40%:** Pure dark background `#0a0a0a`
|
||||
- **Right 60%:** Carousel-1 screenshot, heavily blurred (blur: 12px), darkened (~60% black overlay), fading into the left dark zone via a smooth gradient mask
|
||||
- **Gradient fade:** Left edge of the screenshot fades to `#0a0a0a` over ~200px
|
||||
|
||||
## Typography
|
||||
|
||||
**"inou"**
|
||||
- Font: Sora Bold (file: `/home/johan/dev/inou/app/build/web/assets/fonts/Sora-Bold.ttf`)
|
||||
- Size: 96pt
|
||||
- Color: `#B45309` (amber)
|
||||
- Position: Left-aligned, x=80px, y=center −40px
|
||||
|
||||
**"your health. one vault."**
|
||||
- Font: Sora Light
|
||||
- Size: 28pt
|
||||
- Color: `#A8A29E` (warm gray)
|
||||
- Position: x=84px, y=center +40px
|
||||
|
||||
**"inou.com"**
|
||||
- Font: Sora Light
|
||||
- Size: 22pt
|
||||
- Color: `#4A4540` (subtle)
|
||||
- Position: bottom-right, x=1440px (right-aligned), y=460px
|
||||
|
||||
## Notes
|
||||
- Profile photo (400×400 circle) will cover bottom-left ~200px — keep logo clear of that zone
|
||||
- No border, no rounded corners
|
||||
- The right-side blurred UI should *suggest* the product without being readable — it's texture, not content
|
||||
- Carousel image source: `/home/johan/dev/inou/marketing/twitter/` (carousel-1 through 6 available as PNG)
|
||||
|
||||
## Feel
|
||||
Linear.app / Stripe homepage energy applied to healthcare. Dark, confident, precise. Not a wellness brand.
|
||||
|
After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 810 KiB |
|
After Width: | Height: | Size: 505 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 773 KiB |
|
After Width: | Height: | Size: 502 B |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
|
@ -195,6 +195,15 @@ func handleMCP(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
// Check authorization
|
||||
var dossierID, accessToken string
|
||||
|
||||
// Local LAN backdoor — skip OAuth for agents on 192.168.0.0/22
|
||||
remoteIP := strings.Split(r.RemoteAddr, ":")[0]
|
||||
if strings.HasPrefix(remoteIP, "192.168.0.") || strings.HasPrefix(remoteIP, "192.168.1.") || strings.HasPrefix(remoteIP, "192.168.2.") || strings.HasPrefix(remoteIP, "192.168.3.") {
|
||||
dossierID = "6e4e8192881a7494"
|
||||
accessToken = ""
|
||||
fmt.Printf("[MCP] Local gateway access as dossier: %s\n", dossierID)
|
||||
} else {
|
||||
auth := r.Header.Get("Authorization")
|
||||
scheme := "https"
|
||||
if r.TLS == nil && r.Header.Get("X-Forwarded-Proto") != "https" {
|
||||
|
|
@ -224,7 +233,6 @@ func handleMCP(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
fmt.Printf("[MCP] OAuth token authenticated as dossier: %s\n", token.DossierID)
|
||||
|
||||
// Verify the dossier exists (important when switching between prod/staging)
|
||||
if d, _ := lib.DossierGet(lib.SystemAccessorID, token.DossierID); d == nil {
|
||||
w.Header().Set("WWW-Authenticate", fmt.Sprintf(
|
||||
`Bearer resource_metadata="%s/.well-known/oauth-protected-resource", error="invalid_token", error_description="Dossier not found"`,
|
||||
|
|
@ -234,8 +242,9 @@ func handleMCP(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
// Store the raw access token for passing to internal API calls
|
||||
accessToken := tokenStr
|
||||
dossierID = token.DossierID
|
||||
accessToken = tokenStr
|
||||
}
|
||||
body, err := io.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
sendMCPError(w, nil, -32700, "Parse error")
|
||||
|
|
@ -258,7 +267,7 @@ func handleMCP(w http.ResponseWriter, r *http.Request) {
|
|||
case "tools/list":
|
||||
handleMCPToolsList(w, req)
|
||||
case "tools/call":
|
||||
handleMCPToolsCall(w, req, accessToken, token.DossierID)
|
||||
handleMCPToolsCall(w, req, accessToken, dossierID)
|
||||
case "prompts/list":
|
||||
sendMCPResult(w, req.ID, map[string]interface{}{"prompts": []interface{}{}})
|
||||
case "prompts/get":
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{{define "onboard"}}
|
||||
<div class="page-container" style="justify-content: center; align-items: flex-start; padding-top: 10vh;">
|
||||
<div class="page-container" style="justify-content: center; align-items: center;">
|
||||
<div class="page-card" style="padding: 48px; max-width: 400px; width: 100%;">
|
||||
<div style="text-align: center; margin-bottom: 24px; font-size: 1.5rem;"><span class="inou">inou</span> <span style="font-weight: 400; color: var(--text-muted);">health</span></div>
|
||||
<h1 style="font-size: 2rem; text-align: center;">{{.T.create_dossier}}</h1>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{{define "onboard_es"}}
|
||||
<div class="page-container" style="justify-content: center; align-items: flex-start; padding-top: 10vh;">
|
||||
<div class="page-container" style="justify-content: center; align-items: center;">
|
||||
<div class="page-card" style="padding: 48px; max-width: 400px; width: 100%;">
|
||||
<div style="text-align: center; margin-bottom: 24px; font-size: 1.5rem;"><span class="inou">inou</span> <span style="font-weight: 400; color: var(--text-muted);">health</span></div>
|
||||
<h1 style="font-size: 2rem; text-align: center;">{{.T.create_dossier}}</h1>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{{define "onboard_nl"}}
|
||||
<div class="page-container" style="justify-content: center; align-items: flex-start; padding-top: 10vh;">
|
||||
<div class="page-container" style="justify-content: center; align-items: center;">
|
||||
<div class="page-card" style="padding: 48px; max-width: 400px; width: 100%;">
|
||||
<div style="text-align: center; margin-bottom: 24px; font-size: 1.5rem;"><span class="inou">inou</span> <span style="font-weight: 400; color: var(--text-muted);">health</span></div>
|
||||
<h1 style="font-size: 2rem; text-align: center;">{{.T.create_dossier}}</h1>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{{define "onboard_ru"}}
|
||||
<div class="page-container" style="justify-content: center; align-items: flex-start; padding-top: 10vh;">
|
||||
<div class="page-container" style="justify-content: center; align-items: center;">
|
||||
<div class="page-card" style="padding: 48px; max-width: 400px; width: 100%;">
|
||||
<div style="text-align: center; margin-bottom: 24px; font-size: 1.5rem;"><span class="inou">inou</span> <span style="font-weight: 400; color: var(--text-muted);">health</span></div>
|
||||
<h1 style="font-size: 2rem; text-align: center;">{{.T.create_dossier}}</h1>
|
||||
|
|
|
|||