A
hq.adatepe.dev

Changelog

Track the evolution of hq.adatepe.dev

v4.5.0

August 7, 2026

Two corrections you only see once you look

Two defects that were invisible in the code and obvious on the screen: simultaneous calendar events drawn exactly on top of each other, and every AI answer printing its own markdown syntax as literal asterisks.

Column layout for overlapping events

Every event card was absolutely positioned across the full column width, so two simultaneous events lay exactly on top of each other and the second hid the first completely. In a real week that hit 25 of 85 cards. The layout maths now lives in its own engine, computed in Berlin time, with the minimum card height in the engine rather than in CSS, and a day view on mobile.

Model prose renders as markdown

Every model in the hub writes markdown whether it was asked to or not. Through a bare paragraph a heading came out with its asterisks showing and a numbered plan collapsed into one grey block. A single Markdown component now turns that string into elements across 24 call sites, carrying no colour and no font size of its own so an answer still looks like the card it lives in.

Safe by construction, not by sanitising

The renderer produces React elements, never an HTML string, and the raw-HTML plugin is deliberately absent, so markup in model output is escaped instead of parsed. Links carry noopener and noreferrer and open in a new tab unless they point inside the hub.

Two deliberate carve-outs: the owner's own text stays a plain paragraph, because parsing his asterisks as emphasis would change what he wrote, and anything inside a line clamp stays a single block
The mail path forbids markdown in the prompt instead, because the daily brief is HTML email
Six redundant no-img-element suppressions removed across food, gym and fashion; the rule was already only a warning

v4.4.0

August 6, 2026

Fashion: menswear only, and fits you can see yourself in

The feed stops showing womenswear by reading the signal the shop actually carries instead of the product title, and a fit card can now show the owner wearing the outfit.

Gender read from the shop, not the title

Pegador sells a women's tee whose title says nothing about it, so the title is not the signal. The ingest reads Shopify's product type and tags into the product cache and the feed filters on that again as a second line of defence. Three details are load-bearing: one shop separates its women's tag with a non-breaking space, another joins tags with an underscore, and the same shop tags unisex pieces as both men's and women's, so a men's signal has to beat a women's one.

Try-on renders

A fit card can show him actually wearing the outfit, generated from his reference photo plus the real product images. It costs money and about forty seconds, so it is a claimed job with the same compare-and-swap as the food queue. The fit id is unique and that is the cost control rather than a limit in the UI: the id is a hash over the pieces, so the same combination always resolves to the image that already exists.

Private storage behind the page cookie

The reference photo and every render live in a private storage bucket and are served through their own routes, so the page password still gates them. Moving them into the public folder would have served them to anyone.

A fit is composed by rules, not by luck

The composer used to pick one random item per slot out of a pool tagged by shop, which produced a leather moto over a peach tee with blue shorts captioned as one coherent mood. Hard rules now reject a combination outright, everything else is points, and forty seeded combinations are scored per fit so the best one survives.

The colour a shop knows: eight of eleven shops keep colour out of the title, so it now comes from the shop's own colour option. Without it the palette rule read a knit polo as unremarkable and produced a pink polo captioned monochrome
One shop bills in yen but was configured as dollars, which turned an 11.000 yen cap into a 10.120 euro one and swamped every fit total. Each shop's currency now comes from its own metadata
Product images are fetched server-side from a client-supplied URL, so the renderer resolves them against the product cache and accepts only exact matches, with redirects disabled so one cannot lead past the list

v4.3.0

August 6, 2026

The food analysis survives leaving the tab

Photographing a meal used to hold the request open for a thirty-second vision call, so closing the tab threw the work away. The analysis is now a durable job, and three independent paths advance it.

Enqueue and return, never await

The analyze route enqueues and answers immediately instead of waiting for the model. The work is a row, so closing the tab, backgrounding the app or losing signal cannot discard a call that has already been paid for.

Three idempotent advancers

A background task on the enqueueing request, the hourly tick as a reaper for a function killed mid-flight, and a kick when the page loads. All three are safe to race because claiming a job is a compare-and-swap on its attempt count. A dead worker's job is reclaimed after five minutes, and past the attempt limit it fails visibly with a retry button rather than spinning forever.

An outbox for the upload itself

The upload cannot be made durable on the server, because there is no row yet. The payload is written to local storage before the request and cleared on acknowledgement, with an idempotency key so a replayed entry resolves to the existing job instead of logging the meal twice.

Corrections are the model's only ground truth

Editing a meal keeps the values from before the edit, and those pairs plus the owner's recurring dishes feed every later prompt. Deleting a wrong meal instead of correcting it throws that signal away.

A dedicated push channel for a finished analysis, at normal urgency with a one-hour lifetime
The analyze and job routes raised to the maximum function duration

v4.2.0

August 6, 2026

Month One

A 31-day training and nutrition programme inside the gym tab, built around the actual failure rather than a better split. The record showed eight sessions in a hundred days against six prescribed per week, so the problem was the dose, not the design.

A seven-day rotation at maintenance

Push, pull, legs, push, pull, shoulders, recovery at 2.850 kcal a day. Maintenance rather than a deficit, because a deficit is the first thing that breaks adherence and adherence was the diagnosis.

Cardio and abs are scheduled, not implied

Both appear explicitly per day instead of being left to whatever time is left at the end of a session.

Exercise guidance that resolves German names

The programme names its exercises in German and the guide knew thirty-five English ones, so most sessions linked to nothing. A four-stage lookup over 1.324 indexed exercises closes the gap.

Cost per session

The programme carries its own cost model, landing at roughly 0,83 euro per session, so the plan is answerable in money as well as in time.

v4.1.0

July 27, 2026

Typed push channels, real deep links, honest delivery

Three things were weak after the push layer shipped: every notification was delivered identically, the tap target was free text, and the UI promised a delivery time the scheduler cannot keep.

A delivery profile per kind

Urgency and lifetime are real Web Push fields that decide how hard iOS wakes the device and how long an undeliverable push is retained. Everything used to be high with a three-hour lifetime, which is the same as no priority at all. Each kind now carries its own profile, and the lifetime is an argument rather than a number: a morning nudge is worthless at 14:00 so it expires, while an overdue deadline stays true for hours. One table owns it and the notifications page renders the same rows, so behaviour and UI cannot drift.

A registry instead of a text field

The reminder target used to be free text, so a typo produced a notification that silently does nothing when tapped, which no test catches. A registry now lists every valid destination, the form is a native select, creating a reminder rejects an unknown target instead of storing it, and every outgoing link is hardened in one place. Verified both directions: every target resolves to a real page, and no authenticated route is missing from the list.

A delivery preview that tells the truth

The tick is hourly, so an 08:30 reminder arrives at 09:00, and the form and the list now say so from one shared function. It also names the two cases that cannot work at all. The first draft of that function promised 08:00 for a 00:30 reminder, which was a straight lie; it is now checked against the same occurrence logic that fires it, so preview and behaviour cannot disagree.

An app badge that counts something real

The badge was plumbed through the service worker but nothing ever set it, so the capability was dead. It now counts open items rather than notifications sent, computed once per tick so every push in a run agrees, and reconciled once per app launch, because a tick with nothing to send never updates it and a stale number teaches you to ignore the icon.

The five-minute tick became one entry per UTC hour: the Hobby plan rejects any cron running more than once a day and the deploy failed outright. One entry per hour from 06:00 to 21:00 UTC covers Berlin 08:00 to 22:00 in both seasons, because the handler gates on Berlin wall-clock time itself. A three-hour grace window is what makes hourly usable at all
iOS safe areas respected: with a translucent status bar and a cover viewport, the mobile header sat under the iOS clock and the home indicator lay directly on the sign-out row
A count of zero now actively clears the badge instead of leaving a stale number behind

v4.0.0

July 26, 2026

The hub becomes an app

A major bump: the hub stops being a site you visit and becomes an app on the home screen that reaches you. iOS delivers Web Push only to an installed PWA and has no local scheduling API, so this ships both halves, the install surface and the server that does the scheduling.

Installable PWA shell

A manifest that opens standalone on the dashboard, touch and maskable icons, the apple-prefixed metadata older iOS still reads, and a push-only service worker. The worker deliberately has no fetch handler: a stale cache sitting in front of server actions and the cookie gate breaks more than offline support buys.

Server-driven reminders in wall-clock time

Once, daily, weekdays or weekly, stored as Berlin wall-clock strings rather than timestamps, so an 08:30 reminder stays 08:30 across daylight saving and across six months abroad. The tick claims each occurrence through a unique key, so retries and overlapping runs cannot notify twice.

Delivery that prunes itself

Configuration fails loudly rather than deep inside a cron run, subscriptions the push service reports as gone are pruned on exactly those responses, and a device is disabled after eight consecutive failures instead of being retried forever.

The notifications control room

Install instructions gated on real standalone detection, enable and disable, a test push, the device list with its failure state, reminder editing, and a delivery log.

Contextual nudges across four daily windows, chosen from live state and validated against weak copy, plus a crew-review push
Restored voice transcription across every voice button: an earlier security pass replaced the uploaded file name with an extensionless temp name, and the transcriber picks its decoder from the extension alone, so every request returned a 400 that the UI swallowed into a dead button
The four-pass decision deepener that shipped alongside this release was retired shortly after: the crew and debate surfaces already covered it, and only its reframe step survives, inside the Decision Room

v3.12.0

July 19, 2026

The dashboard collapses to the exam

While an open exam sits inside a seven-day window, the dashboard answers what counts now with that exam instead of the usual cross-source mix.

Exam-week focus

Mission, the becoming band, the dimension grid, quick stats, finance, nudges, ops triage and the latest idea all step aside. The work feed, deadlines, habits and the calendar column stay, because those are what you actually use while studying.

A rule that changes by phase

The band shows the countdown, date and room plus one rule for the current phase. The eve of an exam is its own phase on purpose: starting something new the night before is the costliest mistake in the study plan, so that day says stop and sleep.

Derived, not duplicated

The derivation is a pure function over the modules the dashboard already fetches, so there is no new query and no second source of exam dates. Exam time and room move into one shared constant that the exam-prep view had been keeping its own copy of.

The expand toggle is deliberately not persisted, so a reload returns to focus and unhiding cannot quietly become the permanent state

v3.11.0

July 17, 2026

Cash Cockpit

A tile cluster at the top of the finance tab that answers why does it feel tight by separating the two different questions hiding inside it: the feeling, and the leak.

The feeling versus the leak

Two columns. On one side the payday countdown and a one-month buffer, on the other the discretionary cap, the recurring load, forward instalment commitments and an investment gate. Everything is computed on the server from raw rows, so no balance and no personal data leaves.

A discretionary gauge with history

Dining, shopping and entertainment against a hard cap, with a trailing six-month chart, plus a recurring-load ratio that alarms once it passes fifteen percent of income.

Commitments counted as already spent

Forward instalments are tracked so money that is already committed is never counted as spendable, and an investment gate locks broker transfers until three straight positive months.

Deliberately no euro runway figure, because the account balance is unknown to the app and an invented number would be worse than none

v3.10.0

July 13, 2026

Sidebar regrouped by purpose

The archive drawer hid six tabs that were still in daily use. Every tab now lives in a themed group instead.

Themed groups that cannot hide the active route

Groups collapse individually and default to open, and the group holding the current route can never be collapsed away, subroutes included.

Editorial active state

The active marker moves from blue to the editorial charge palette, matching the rest of the redesign.

Copilot event descriptions made readable: Google renders descriptions as plain text, so the HTML signature leaked through as literal markup, and pasting a table buried the event body under the whole prompt. The footer is now two plain lines with the prompt trimmed to a short excerpt, cut on code points rather than UTF-16 units
Guarded the category label against an event with no category, matching the fallback the styles lookup already had

v3.9.0

July 12, 2026

Calendar declutter

The calendar moves toward Reclaim-style planning: less noise above the fold, and planner blocks that visibly admit they are flexible.

Capped rows with expanders

The all-day row and the conflict radar are capped and expandable rather than pushing the grid down the page, with category filter chips to narrow what is shown.

Flexible blocks look flexible

Planner blocks render dashed and pass through as mirrors, so a block the planner may still move is visually distinct from a commitment that will not move.

Plan the day from the header

A plan-the-day action with auto-build, the planner and the deadline rail side by side above the fold, and the rail grouped by time band.

A rolling event window from thirty days back to ninety days ahead instead of a fixed range
Header retokenized to the editorial palette

v3.8.0

July 12, 2026

Leantime-inspired ND layer

Three borrowings from Leantime's neurodivergent-friendly design: one feed of what to work on, a full-screen focus mode, and a deliberate reward on completion.

Work feed

Everything actionable merged into one band on the dashboard, so starting does not first require deciding which tab to open.

Focus overlay

A full-screen pomodoro overlay with persisted sessions, stats and preferences, so a focus block becomes a recorded thing rather than an intention.

Completion is celebrated

A confetti burst when the directive is completed. Small and deliberate: for this design the reward is the point, not decoration.

Server-render guard on the overlay portal and a transform-based progress bar, from a React review pass

v3.7.0

July 10, 2026

Intelligent planner and crew decisions

The calendar learns to plan itself, auto-placing deadlines into free slots by urgency and energy, and the crew stops merely commenting and starts helping you decide, with council votes that aggregate into a weighted recommendation and personas graded on how their calls actually turn out.

Intelligent calendar planner

Auto-plans open deadlines into free calendar slots with a deterministic scheduler: greedy by urgency, energy-window aware, buffer-safe, and front-loaded then spread across eligible days, never past the due day. Accepted blocks are written to Google as mirror events, each journaled with a delete inverse for one-tap undo, and deadlines gain effort, progress, subtasks, and an urgency score.

Free-slot finder, quick-add, and overbooking radar

Find where a given duration fits (finde mir 2h), add a block from natural language (morgen 2h Klausur lernen), and scan the week for overlaps, missing buffers, and overloaded days. Plus routines, recurring blocks, a day agenda, category analytics, and a weekly review.

Crew decision layer

A focused council of the most relevant personas each casts a structured vote, which aggregates into one weighted recommendation and a trade-off matrix. An options generator turns a fuzzy dilemma into concrete choices, and the whole decision plus votes is persisted.

Executable decisions with credibility feedback

Choosing an option can execute one attached write action (journaled and undoable) or capture the decision as a ticket or idea. Later you record the real outcome, which grades the personas who backed the chosen option and feeds their credibility, and pending decisions are surfaced proactively from live data.

Addressed the adversarial review findings on the planner and crew decisions
Compare-and-swap on decision status so two racing clicks cannot double-run an action or double-grade credibility
Option ids are always regenerated positionally so two options can never collide in aggregation
Auto-plan blocks are treated as free on a re-plan while committed and routine blocks still block

v3.6.0

July 10, 2026

One directive, sharper crew, configurable brief

The dashboard gets a single urgency-ranked directive hero above everything, the crew's reads stop paraphrasing each other and speak from their own domain data, and the daily brief becomes card-configurable. Plus a batch of brief and deadline fixes.

Directive hero on the dashboard

One urgency-ranked directive sits above everything: a serif Tagesziel and the top item with one-tap check-off, two runner-ups, and always-visible exam countdown chips. It runs the same priority engine as the brief over a slim gather (no FitX login or year-long calendar fetch) and records a per-day ziel and done flag.

Domain-grounded crew differentiation

Persona reads now speak from their own domain data instead of fourteen paraphrases of the same next step, with a convergence gate that suppresses near-duplicate and global-echo dossier notes. Adds a Stabschef synthesis, a live thinking line, a morale trend, and persona debates.

Configurable brief sections

Turn individual brief cards on or off from a panel on the /zeitkapsel page, persisted in settings, while the hero and footer stay fixed.

Brief send idempotency plus a dry-run mode
Exam and deadline mirrors filtered out of the calendar view and de-duplicated
Postponed-exam state handled in the deadline layer
Timezone and casing fixes across the brief

v3.5.0

July 8, 2026

Crew: mascots, living reads, morale

The coaching personas become a visible crew with animated SVG mascots, nightly data-grounded reads on you, a modal chat that remembers each persona's history, and a team morale meter that explains its own score.

SVG mascots with mood-driven faces

A parametric drop-body mascot family, recolored per persona with a role prop and a face driven by the persona's current mood. Idle bob, random blink, and cursor-tracking pupils all gate behind prefers-reduced-motion and a fine-pointer check.

Living, data-grounded reads

Each night every persona regenerates its own read on you (read, standup line, mood, and the one driving signal) from your real data, persisted with a history row so the crew's view of you evolves over time.

Modal persona chat with memory

Clicking a card opens a modal with the mascot and a mood sparkline beside a persisted per-persona chat thread. Each persona's background (its Flugbahn trend, last read, and dossier notes) is injected into the prompt, and after each exchange it re-reads you and auto-appends a durable dossier note, no manual remember button.

Team morale meter and voice

Averages the twelve doer personas' moods into a verdict and a count-up gauge with a mood-trend sparkline; observers comment but do not count. A per-persona text-to-speech control can read a persona's take aloud.

Morale meter now explains why this score, listing the biggest drags with each one's data lever and the point gain if that persona reached proud
Strip em and en dashes from generated persona reads to hold house style
Pin Europe/Berlin in date formatting to avoid a hydration mismatch
Read-only personas (Doubter, Chronist) get read tools only when summoned

v3.4.0

July 7, 2026

Agent-OS orchestrator and deadline layer

The hub gains a real agent: a server-side tool loop that reads live state and writes changes autonomously, every write journaled and undoable. Under it sits one central deadline layer that unifies every dated obligation and reconciles the calendar three ways.

Agent-OS orchestrator

A function-calling loop over the hub's tool registry: the model pulls live data with read tools, executes write tools directly without a confirmation dialog, and can consult the coach personas as sub-agents. Every step is traced so a run can be replayed, and the loop is bounded by iteration, time, and fail-streak guards.

Central deadline layer and rail

One read path merges exams, sheets, tickets, leads, goals, and manual deadlines into a normalized list with a deterministic urgency score and progress from subtasks. Overdue items now stay visible for seven days instead of silently vanishing, and the rail can re-sort by what to do first.

Three-way calendar reconciliation

Deadline dates reconcile against Google using an hqDay stamp of the last day both sides agreed on, so the reconciler can tell a manual drag in Google apart from an app-side move and resolve the conflict correctly.

Nightly nudges with journaled undo

A nightly agent round reads your real state and emits one to three concrete, signal-backed nudges, each able to carry a single one-tap write action. Every write across the agent stack logs an inverse so it can be undone from the journal.

Idempotent nightly round: a second run on the same day never regenerates the signed nudge links already embedded in the sent brief
Addressed the Gemini review findings on PR #16
LLM or tool failure produces zero nudges rather than fabricated ones

v3.3.0

July 5, 2026

Daily brief becomes a coach

The daily brief grows a deadline-first hero, a weekly AI read that remembers its own past advice, a browsable archive of every mail sent, and live external signals for trending repos and gym check-ins.

Deadline-first hero

The brief now leads with the single most urgent obligation, chosen by a shared priority engine across exams, sheets, tickets, leads, goals, and manual deadlines, so the mail opens on the one thing that matters most today.

Weekly AI analysis with self-continuity

Compares this week's real metrics against a stored snapshot from seven days ago and references its own last analysis, so it can tell you honestly whether its previous advice moved the numbers. Deltas are computed and the run is saved, degrading silently when the key or comparison data is missing.

Zeitkapsel brief archive

Every sent brief (daily, weekly close, week plan) is archived to a browsable time capsule, which doubles as the send-idempotency gate so a redeploy or second cron hit cannot re-mail the same day.

Trendshift and live FitX gym signal

Adds a Trendshift section of trending GitHub repos (daily, weekly, monthly) and a real gym-recency signal that reads your actual FitX check-ins from mein.fitx.de rather than only the manual log.

One-tap gym check-off straight from the mail via a signed HMAC token
Sunday Wochenplanung planning mail
Retired the LSF exam-registration nag now that registration is done
Payments mapped to the Berlin calendar day so a midnight check-in lands on the right date

v3.2.0

July 5, 2026

Fashion: infinite feed and auto-fits

A new Fashion tab with a style profile, a never-ending shuffled drop feed pulled live from real stores, and head-to-toe outfits composed entirely from in-stock products so every look is shoppable.

Fashion tab with style profile and live drops

Save your moods, sizes, budget tier, and color rule, then browse live drops ingested by a cron from open Shopify product feeds (Moonlight and others) plus Grailed. Fits can be saved or dismissed and persist with their own snapshot.

Infinite tabbed feed

A seeded-shuffle feed served through a Postgres RPC and split by category; when the client exhausts a page it bumps the seed and keeps scrolling, so the feed is effectively endless while staying deterministic within a session.

Auto-generated shoppable fits

Composes deterministic head-to-toe outfits from the live product cache, one real item per slot (top, bottom, shoes, optional outerwear and accessory), each tagged to a mood with an occasion, why, and styling rule. Every piece links to a buyable product.

Paginate Shopify and Grailed and add more stores for a larger pool
Menswear-only filter so no cross-chain or womenswear items leak in
Remove an auth bypass on the refresh cron route
Prune drops not seen in 21 days while keeping saved items intact

v3.1.0

July 3, 2026

Mission Deck, Der Spiegel, affirmations

Three self-direction surfaces land together: a hard-numbers tracker for the 10k business goal, a mirror that infers who you are from your own usage and proposes goals, and a daily identity-affirmation loop. The daily brief also gets its first overhaul pass.

Mission Deck (10k tracking)

A pure compute model that scores progress toward 10.000 euro by the best rolling 30-day window of paid invoices before year-end, with the funnel, an assumption-labeled pitch-to-deal quota per week, deal scenarios, and a live status. Only real paid business income counts, never salary.

Der Spiegel: usage-inferred personality mirror

Gathers evidence from your real hub data, has the model infer traits, gaps, and a projection with cited receipts, then proposes concrete goals. Accepting a proposal creates a real goal (guarded by a compare-and-swap so a double-accept cannot insert twice) and mirrors the inferred traits into the durable self-model.

Self-affirmations tracker

A rep counter for identity sentences with a rotating daily focus line, a suggestions library, and a completion streak that survives an unfinished today. Pure persistence, no LLM, plus a compact read for the daily brief.

Paid invoices edited directly in the DB fall back to invoice_date so paid revenue never silently drops out of the mission
Spiegel re-runs remember dismissed proposals so nothing already rejected is re-proposed

v3.0.0

July 2, 2026

Locked-down: edge auth on everything

A major bump: the hub stops being a render-gated dashboard and becomes a locked-down, connected system where every mutating request is authenticated before it runs. This is the security floor the later autonomous agent, planner, and write-tool layers are built on.

Middleware auth gate over every server action and API route

A single edge middleware now requires a valid page_access_v1 HMAC cookie for every Server Action POST and every non-public /api route, recomputing the signature with Web Crypto and comparing it in constant time. Previously the authenticated layout only decided what got rendered and left the underlying POST endpoints open.

Explicit allowlist for the few genuinely public endpoints

The login bootstrap, anonymous ticket intake, and the cron routes are whitelisted, with the crons self-authorizing via a Bearer CRON_SECRET and the one-tap mail actions via a signed HMAC token. Everything else is closed by default.

Server Action POSTs and API handlers, previously reachable without a cookie, now return 401 when unauthorized
Timing-safe cookie comparison to avoid leaking the secret through response timing

v2.9.0

June 30, 2026

Finance mirrors

Two honesty-first finance cards: a full-history bottom line that counters alarmist single-month framing, and a quarterly mirror of the save-then-splurge cycle.

Reality Check

The honest all-time bottom line across the entire record: net position, plus versus minus months, and average per month, counting money moved into savings and investments as kept rather than lost, so one mild negative month reads in context.

Consumption Rhythm

The save-then-splurge cycle made visible per quarter. Each bar shows consumption as a share of income against an income tick, turning red when a quarter spent more than it earned, so the oscillation between disciplined and splurge quarters is obvious.

v2.8.0

June 28, 2026

The Doubter

A deliberate anti-mentor at /doubter that generates hostile spite-fuel grounded in your real gaps, with a hard safety boundary that keeps it fuel instead of poison.

The anti-mentor taunt

An AI hater generates a short, cutting taunt grounded in your real trajectory gaps (weakest lever, Owner-Quote near zero, score and tier) plus your own logged doubts, so the contempt always points at something you can disprove by acting.

Doubt ledger

Log the doubts real people voiced or your own, then mark them proven wrong once you've disproved them. A beaten doubt lights up as a win in the ledger.

Hard safety boundary

The persona attacks only your record and standing, things you can overturn by acting, and never your core worth, protected traits, appearance, or anything self-harm-adjacent. The boundary lives in the persona prompt itself.

Voice playback of the generated taunt
Static fallback taunt when the model is unavailable

v2.7.0

June 27, 2026

Flugbahn: the Outlier-Index

An honest 0-100 behavior-mirror at /flugbahn that measures whether your tracked behavior is compounding toward outsized outcomes, never a prophecy and able to read low.

The Outlier-Index

A 0-100 trajectory score across five levers (Reach, Discipline, Output, Skill, Surface) mapped to tiers from Konsument through Operator, Builder, Owner, to Outlier. It is a feedback loop, not a probability.

Honest tracking model

Each lever reports both a value and whether it is tracked. An untracked lever reads no signal and is excluded from the composite instead of counting as a misleading zero, with weights re-normalized over the tracked set.

Real GitHub output + Owner-Quote

Output is driven by real commit cadence over the last 90 days, the truest shipping signal. Reach stays gated on real external traction (revenue, pitches, won clients) so it can't be faked with more internal tooling, and the Owner-Quote exposes the share of income from what you actually own.

Position vs momentum + AI read

The score splits into position (where you stand today) and momentum (the slope over recent snapshots, with an honest neu cold-start). An AI mentor read narrates the number, and weekly reads plus snapshots persist (migrations 047-048).

v2.6.0

June 27, 2026

The Becoming-Engine

One coach voice grades yesterday at dawn and withholds the dream machine until today's discipline is real. Ships ten growth ideas plus an editorial design refresh.

Earned Hub + Verdict at Dawn

A new /today surface where a single mentor voice grades the prior day at dawn and gates the motivation tooling until today's work is earned. Walk the Spine ridge and the Sigil wall make kept days visible.

The Debate + Letters Across the Gap

New /debate and /letters surfaces: a structured self-debate that argues both sides of a decision, and letters written between your present and future self.

Forfeit Ledger, Winter Mode, Annual Verdict

Consequences for broken contracts, a seasonal low-power mode, and a yearly season verdict, all driven by a nightly verdict/forfeit/season/letters cron pipeline (migrations 043-046).

Editorial design refresh

The Food tab and every new surface rebuilt on the PageHeader and ui-tokens primitives to match the Feelings tab's editorial look.

Talk Back interactive coach reply on /today
Fixed a Winter Mode dead-code path caught in review

v2.5.0

June 23, 2026

Becoming Spine + Self-Model

A connective layer that reads every tab into one live LifeState, adds a global data-grounded Hub-Agent, mirrors daily items into Google Calendar, and lets you capture by voice.

Cross-tab LifeState engine

getLifeState pulls gym, food, finance, BMW, entrepreneur, LMU, LeetCode, habits, quests, and goals into seven becoming dimensions, each with signals, deep links, and one leverage move for today. Surfaced as the BecomingBand and DimensionGrid widgets.

Global Hub-Agent

A site-wide agent that reads live LifeState and your self-model, answers grounded in real numbers, and returns interactive widgets with deep links. Coach-skill routing pulls in the right specialist persona when depth is needed.

Self-Model + daily ask-back

A persistent store of facts about the owner (migration 042, hq-self-model) that a single daily question keeps growing. It feeds gatherLifeContext so every AI surface reasons about who you actually are.

Calendar mirror + voice brain-dump

Mirrors the daily step, quest, and goals into Google Calendar idempotently with drag-safe upsert, so a manual move is never clobbered. Voice capture drops a spoken brain-dump into the hub with confirm-before-write.

SWR client cache plus site-wide loading states
Daily small step computed once per day and cached
Weekly entrepreneur summary mail via Resend

v2.4.0

June 22, 2026

Entrepreneur Path

Turns /entrepreneur into an outreach-first path to the first paid invoice, backed by a real lead pipeline and Kleinunternehmer invoicing.

Festgemeißelter Pfad

A fixed, sequential milestone chain from the first three pitches to the first paid invoice. Deadlines are computed once on start, and outreach is pulled to week one instead of hiding behind weeks of prep.

Truthful pitch loop + pipeline

Milestones gate on real pipeline data (leads counted, and pitches counted only when actually recorded as sent), never free-text proof. The lead board tracks each contact through idea, contacted, in talks, offer, won, or lost.

Invoices + CRM

Section 19 Kleinunternehmer invoices generated from your own stored letterhead, with the 25k ceiling tracked against money actually received and the top-client income share surfaced as the pension-insurance trap.

Pitch counts now come from recorded sends, not the generated-pitch proxy
Revenue summary separates invoiced-this-year from received-this-year for the legal limit test

v2.3.0

June 10, 2026

Entrepreneur tab

A new /entrepreneur tab pairing a researched Kleingewerbe launch roadmap with an offer explorer tuned to the owner's real skills.

Kleingewerbe roadmap

A 17-step roadmap across four phases (Klarheit, Anmeldung, Go-live, Betrieb) with per-step done-tracking and notes, built on verified 2026 numbers: KVR registration fee, the Kleinunternehmer 25k/100k thresholds, KVdS, the RV one-client trap, and the Grundfreibetrag.

Angebot (offer) explorer

Ranks five concrete service offers derived from an analysis of adatepe.dev, alongside nine website quick-wins to act on first.

Spielregeln (rules)

Lays out the eight legal and tax limits that actually matter for a Kleingewerbe, each shown with its source.

hq-entrepreneur-steps table added (migration 038, RLS re-asserted)
Entrepreneur entry added to the sidebar

v2.2.0

June 9, 2026

Food tracker

A new /food tab where a photo of a meal is analyzed by GPT vision into full nutrition and a health verdict, backed by day and week views, an AI coach, and body-mind correlations.

Photo-to-nutrition capture

Photograph a meal (or several photos of the same occasion, with iOS Photos upload supported) and GPT vision returns the item list, calories, macros, sodium, sugar and fiber, a 0-100 health score and a healthy/moderate/unhealthy verdict.

Explanatory feedback + Insights

Every meal gets a WHY: an assessment of what drove the score, genuine positives, concrete improvement swaps, and eight sub-factor scores (protein, carb and fat quality, fiber, sugar, sodium, processing, portion). The Insights view charts day and week trends.

Targets, budget & quick-log

Set daily calorie and macro targets with a running budget, log meals by text description when there is no photo, and favorite or one-tap re-log recent meals.

AI coach + body-mind correlations

A coach report and meal suggestions over the last N days, plus correlations linking food (health score, sugar) to mood, energy, and bodyweight from the mood and bodyweight trackers.

Multiple photos of one meal now analyzed as a single eating occasion
iOS Photos upload supported in the capture flow
MotivationStudio restored at /motivation

v2.1.0

June 8, 2026

Becoming: Jim Rohn discipline re-anchor

Re-anchors the Manifest mentor from a pure hype voice to a Jim Rohn discipline philosophy where affirmation is earned, not given. Adds an always-on identity layer and Rohn-register modes for whys, disciplines, a daily check-in, journaling, and seasons.

Identity Header

An always-on header across the Manifest tab shows the owner's "person I am becoming" statement (AI-seedable and lockable) plus the current season, keeping every mode anchored to who they are becoming.

Whys mode

The four editable "whys" that act as the engine; the mentor returns the owner to them by name, and a deepen action sharpens any why into a stronger personal line. Goal inflation is now grounded to a chosen why.

Disciplines mode

Designate core disciplines (mapped to real habits) as the slight edge. The mentor gates fuel and affirmation on whether today's disciplines are kept, so hype is only handed out once the work is done.

Journal + Season review

A "book of your life" journal aggregates check-ins, lessons, and reframes into a dated feed, and a season review (winter/spring/summer/fall) names what the owner became this stretch and the one focus for the next.

Mentor re-registered to Jim Rohn's calm, declarative, discipline-first voice
Today check-in now withholds fuel until the day's disciplines are kept
Inflated goals now link to a specific why (migration)

v2.0.0

June 3, 2026

Manifest + Daily Quest

Major release: the hub grows beyond ops tools into a self-development platform. It ships its first two "becoming" surfaces, an AI delusion-mentor and a daily quest engine, both grounded in a new shared cross-tab life-context layer that lets every AI feature speak from the owner's real data.

Manifest tab (delusion mentor)

A new /manifest tab with a five-mode mentor that teaches 10x thinking: daily check-in drills, a goal-inflation machine that blows a realistic goal up 10-100x and argues why it is reachable, a reframe machine for doubts, and a receipts ledger of real wins the mentor cites as proof. Everything is grounded in the owner's live context.

Daily Quest

A new /daily-quest tab that generates one small, doable-today quest from the owner's live context, with a daily theme that rotates so it never feels repetitive. Includes complete, skip, and reroll (once per day) plus a completion streak and history.

Mantra line + earned fuel

A repeatable daily "line" in the mentor's voice, playable via text-to-speech, plus an Inject button that hands out a charged affirmation. The mentor refuses to inflate feelings the day's work has not earned.

Shared life-context spine

A new gatherLifeContext() layer pulls signals from across the hub (goals, habits, deadlines, finances and more) into one string every AI feature reads from, backed by cron infrastructure for daily generation.

Manifest drills expanded to 14 types, with unlimited off-streak practice drills
Quest and mentor generation simplified to pure LLM + owner context (Firecrawl dependency removed)
First-domino action added to the daily check-in

v1.11.0

May 31, 2026

Protocol Odin motivation studio

A motivation studio (Protocol Odin) that generates an AI motivational speech from a prompt and plays it back as spoken audio, optionally grounded in your real hub data.

AI motivational speech with voice

Type a prompt, pick a persona, and gpt-4o writes a script that is immediately synthesized to speech and played back through the Web Audio API. A one-tap panic prompt is there for when you need it now, and finished speeches download as WAV.

Personas, voices, durations + languages

Five personas (Aggressive/Goggins, Stoic/Aurelius, Balanced/Jocko, Future Self, Doubter) each with a default voice, eight selectable voices, four length presets from Short to Podcast, and German, English or Turkish output.

Life-context grounding + session history

Toggle 'use context' to feed the script your real life context so the speech references your actual situation. Every session is saved with its transcript, can be favorited, replayed, or deleted.

v1.10.0

May 26, 2026

BMW shift planner

The BMW Fastlane tab grows a working shift planner: log shifts individually or in bulk, group them by department, verify completed ones, and read work-pattern analytics over your history.

Shift journal, bulk entry + verification

Add shifts one at a time or in bulk, attach per-shift journal notes, tag department and role, and mark a shift verified (with who verified it). Departments and locations autocomplete from what you have already entered.

Department grouping + semester progress

Shifts group under a per-department tab view with upcoming vs past splits, and a progress track counts verified net hours toward the 360-hour semester target.

Work-pattern analytics + search

Analytics over completed shifts surface heaviest weekday, average start/end times, average net hours per week and per shift, average break length, and net earnings, all searchable across your shift history.

v1.9.0

May 18, 2026

Finance tab

A full personal-finance surface: import raw Sparkasse CSV exports, auto-categorize every transaction, and read a deep single-scroll analysis of spending, saving, earning and investing. German date format rolled out across the whole app.

Sparkasse CSV import + auto-categorization

Drop a Sparkasse CSV export and it decodes, dedupes by content hash, resolves merchant names, and categorizes each transaction via rules with an AI fallback (capped per import). Everything lands in a filterable transaction table you can hand-correct.

Deep money analytics

One scrollable dashboard covering spending (biggest expenses, category trends, heatmap), saving (savings-rate by month, habits, goal projector), earning (income by source and stability), efficiency (fixed vs variable, subscription bloat detector), and investing. Cash-flow waterfall, balance trajectory, year-over-year and a runway card round it out.

AI insights + Monte-Carlo prognosis

A weekly narrative read plus an ask-anything box, both fed an aggregate-only context (totals and ratios, never raw transactions, IBANs or references). The forecast panel runs a Monte-Carlo wealth prognosis, and every plot carries a footer with its interpretation and raw data points.

Investment portfolio + dashboard widget

A portfolio panel tracks holdings by asset class (ETF, stock, metal, crypto, bond, cash) with a last-updated timestamp and auto-detected Trade Republic transfers, plus persisted savings goals. A finance summary widget now sits on the dashboard overview.

German date format applied site-wide (dashboard, finance, mood, goals, bmw, calendar, tickets, leetcode, LMU)
Signed chart axes so negative flows render correctly
Heatmap now shows earning days in green
Compact sidebar spacing
Final security hardening on finance server actions

v1.8.0

April 28, 2026

Jira-grade ticket triage + LMU exercise tracking

A Jira-style overhaul of the ticket desk with a full detail drawer and workflow tooling, plus per-module LMU exercise and assignment tracking.

Jira-grade ticket detail drawer

A detail drawer with inline edit, threaded comments, and a per-ticket activity log, backed by six workflow statuses (TODO, PLANNED, ONGOING, IN_REVIEW, BLOCKED, DONE). Adds sub-tasks with parent/child rollup, sprint field, watchers, URL attachments, and time tracking against an estimate.

Auto-prioritize heuristic

Suggests a ticket priority from due-date proximity, blocker status, and keyword scanning: overdue or blocked-and-due-soon go CRITICAL, security/outage/p0 keywords escalate, and stale no-due TODOs are demoted to LOW, each with a visible reason.

LMU exercise tracker

Per-module exercise tracking with eight statuses, notes, open and due datetimes, score, time spent, difficulty, partners, and attachments. A predict-next action infers submission cadence from the median gap between existing due dates and seeds upcoming rows.

Ticket power tools

Keyboard shortcuts (c, /, 1-6, Esc, ?), sortable columns, bulk select and bulk actions, server-persisted saved filter views, and filtered CSV export/import with a preview modal.

Per-module assignments checklist with release-gated Übungsblatt checkboxes and a done/total counter.
Mark modules ineligible (default WP 18, already done in the bachelor) and filter the module list by SoSe or WiSe.
Fixed gym sessions silently failing to persist: a missing updated_at column made every insert throw and get swallowed, leaving zero rows.

v1.7.0

April 26, 2026

Comprehensive hub sync

Wires the hub to its external sources: a Puppeteer LSF course scraper, an idempotent Google Calendar push for LMU modules, and a server-side settings store, plus a mobile pass across every page.

LSF course sync

A Puppeteer scraper logs into LMU's LSF portal and pulls full module details (type, SWS, instructors, schedule slots, comments) into the hub. It runs as an async background job that reports live progress through fetching, login, scraping, and saving steps.

Google Calendar push

Pushes a module's weekly lecture and seminar blocks to Google Calendar in correct Munich wall-clock time. Writes are idempotent via tagged extended properties, deleting prior copies before re-inserting, with a one-click remove.

Server-side settings store

A generic scope/key JSONB settings table that replaces per-feature browser localStorage, so preferences persist server-side and follow the owner across devices.

Mobile-responsive hub

Every dashboard page reworked for a 375px phone target: rescaled padding, single-column grids, larger tap targets, stacked flex layouts, and hover-only actions made tappable.

Gym arrival/leave card expanded to 12 metrics: median duration, total gym time, consistency score, drift trend, time-of-day split, and a per-weekday breakdown.
Gym plan rebalanced to the September 1 goal with novice starting weights and de-DE 24-hour formatting throughout.
Weather now uses a 09:00-18:00 midday median temperature and adds sunrise/sunset times.
Mood entries can be edited and backdated, carry a did-gym toggle, and auto-compute sleep hours from bedtime and wake time.

v1.6.0

March 30, 2026

Gym analytics suite

A full analytics layer for the gym tracker, turning raw FitX check-in logs into rankings, charts, heatmaps, and a computed stats dashboard.

Personal records board

Ranks every logged exercise by the heaviest weight lifted, with gold/silver/bronze trophies for the top three and the date each PR was set.

Three-tier stats dashboard

Computes a layered stats view from check-in history: hero numbers (total sessions, average and longest duration, sessions per week), pattern cards for current and best streak, and trend pills, all with inline SVG mini bar charts.

Duration chart with four views

A hover-tooltip chart that switches between duration over the last 20 sessions, monthly frequency across 12 months, time-of-day distribution, and year-over-year comparison.

12-month activity heatmap

A GitHub-style check-in heatmap, Monday-aligned with de-DE month and day labels, a FitX-orange intensity scale, future-date dimming, and a fixed-position hover tooltip.

WorkoutLogger quick-log bar: a camera button plus a text input that AI-parses free-text like "Squat 3x5 at 100kg" into structured sets, reps, and weight.
SessionList cards enriched with colored duration badges, ISO calendar week, nth-this-week rank, and a vs-average delta bar.

v1.5.0

January 7, 2026

FitX gym auto check-in

Your FitX gym visits now flow into the hub on their own. The gym tracker authenticates against mein.fitx.de, pulls your real check-in history, and imports attended sessions without manual logging.

FitX check-in auto-import

The gym tracker logs into your FitX account, fetches the check-in history report, and imports every attended visit so the gym log reflects real attendance instead of hand-typed entries.

Headless Chromium login on Vercel

FitX authentication runs inside the serverless function via Puppeteer and @sparticuz/chromium-min against a self-hosted Chromium pack. The session cookie is cached with a 30-minute TTL and login retries with exponential backoff over three attempts.

Stepped sync feedback in the tracker

The import shows live progress through login, fetching, and processing steps with per-step icons, and surfaces authentication or connection errors instead of failing silently.

Tuned the FitX Vercel function to 2 GB memory and 60s duration so the Chromium run fits inside serverless limits.
Adopted the official Vercel Puppeteer pattern for chromium-min compatibility.
Cached the session cookie across lambda instances, with FITX_SESSION env var and x-fitx-session header as fallbacks.
Bumped next, typescript, and @types/node.

v1.4.0

December 25, 2025

Visual Overhaul & Productivity Boost

Major efficiency updates including full-width calendar layout, drag-and-drop rescheduling, and a fully collapsible sidebar for focused work.

Calendar 2.0

Drag and drop events to reschedule instantly. Multi-select with Shift+Click for bulk deletion. Cleaner header with optimized controls.

Focus Mode

Collapse the sidebar (Cmd/Ctrl+Shift+B) to reclaim screen real estate. The main layout adapts fluidly to use 95% of available width.

Time Tracker link now opens in a new tab.
New Event button is now a sleek, single-line icon.
Sidebar toggle button repositioned for better access.

v0.1.0

December 20, 2025

Foundations & Calendar Integration

Initialized the complete web app structure and integrated the Google Calendar API, with AI-powered event creation.

Calendar API Integration

Full read/write integration with the Google Calendar API. Events sync between the Hub and the personal calendar.

AI Calendar Copilot

Smart event creation from natural language, with a Recent Actions card to quickly undo or edit AI-created events.

Smart Categorization

Category taxonomy mapped to Google color IDs, with keyword prediction (Training is labeled Exercise).

Web App Structure

Core layouts, sidebar navigation, and dashboard routing for the Ops Hub architecture, behind a page password.

Misclassifications for Bus Travel and Training resolved.
All-Day events now span correctly across columns.
Reordered sidebar navigation for a better workflow.