feike.studio

Case study — own product · 2026, ongoing

Designing an AI companion
you can actually trust.

How do you design a personal AI companion that develops closeness, memory and initiative — without giving up control, privacy and honesty?

Project
Own initiative
Role
Product Designer & Product Owner
Period
2026 — ongoing
Platform
Web app · native macOS (Tauri)
Status
Nyx in daily use · Nadir in closed alpha
As of
17 August 2026
Nyx presence view: the companion centred in a lit room, a greeting in its own voice, and three re-entry cards below it.

The entry point is not an empty chat box. The companion and its current state sit in the centre; three re-entries — open thread, what's coming up, a way in — replace the blank canvas with prompt suggestions.

Interface in German — built for my own daily use · click a screen to enlarge

In short

Two editions, one product core

Nyx began as a personal AI companion for my own everyday life. It is now an operated product system with two clearly separated editions — and neither of them is a mockup or a chatbot skin.

Nyx
My private owner edition. Runs on my own infrastructure, knows my personal vault, tuned to my routines.
Nadir
The native macOS edition for other people. Same product core, but local backend, own data, own companions and a deliberately smaller capability surface.

The system combines a persistent persona with memory, focused work areas, local libraries, optional model providers and controlled automation. I use Nyx every day; two people run Nadir in their own everyday life.

The design task changed along the way. It started as making invisible AI decisions legible in the interface. In real operation it became clear that transparency alone does not create trust — trust needs boundaries the system actually holds.

The challenge

Four tensions, none of them a prompt problem

Closeness vs. Honesty
A companion should feel independent, recognisable and emotionally legible. It must never hide that models hallucinate, data is missing and automations fail.
Memory vs. Privacy
Continuity is what makes a companion personal. An unbounded transcript in the prompt is neither controllable nor safe. Remembering needs origin, scope, a lifecycle and real deletion.
Initiative vs. Control
Once a system researches, calls models or drafts messages on its own, an on/off switch is not enough. People need to see what was planned, run, blocked or retried.
One core vs. Two identities
Nyx holds very personal data and an exclusive persona. The same core had to become reusable for other people without carrying private content along as bundle baggage.

None of this is fixed by a better prompt. It touches information architecture, interaction design, data modelling, permissions and operations at the same time.

My contribution

Designer and product owner, sign-off included

I owned the product vision, the persona logic, the information architecture, UX and UI, the visual language, the specifications and the acceptance criteria — plus systems design, release decisions, alpha feedback and QA across frontend, backend and the native app.

The implementation was AI-assisted. Coding agents made the build faster; product decisions, scope, reviews and sign-off stayed with me. On an AI product that was a real part of the work: agent output was not treated as truth but checked against specs, actual code paths, negative cases and the state that was really built.

ProblemSpecSmall sliceReviewTestRelease gate

Approach

Seven decisions that shaped the product

01

Presence instead of a universal assistant

The most important product decision was not to press relationship and tool use into one universal chat.

Presence is the personal room. The companion answers with a stance of its own, carries one of twelve ambient moods and gives individual messages a matching expression. Earlier conversations stay findable without dominating the entry surface.

Focused areas take the deep work. Research, transcription, calendar, notes or media each have a clearly bounded context and exactly the tools they need. The encapsulation protects both sides: presence never becomes a command line, and a workspace never has to pretend to be a private conversation.

Presence — asked to imitate corporate speak, the companion does it in character. Persona badge next to the name; tone is designed, not accidental.
Orakel — the same companion, a scoped workspace. Depth, rounds, what leaves the machine and what the run costs are stated before it starts.

02

Trust as a system boundary, not a label

The first layer of trust still sits in the interface: the model actually used and where that choice came from are visible, proactive content carries a recognisable origin, research and meeting results declare sources, partial failures and incomplete runs, and anything with outside effect is prepared or confirmed rather than done in passing.

One formative example was a calendar answer in which the model invented an appointment. The consequence was not another warning banner but a harder product rule: calendar answers may only be built from the calendar data actually loaded. If an entry is missing, an honest “not found” is the correct answer.

In operation a second, more important layer appeared: the system must not do certain things at all when scope, consent or run state are missing. Providers are optional connections; a stored API key is not consent for background access. Visible automation has its own pause, target, budget and delivery limits. Run states are traceable as run, attempt, event, reservation and receipt, so a retry cannot repeat the same outside effect.

The new automation control plane is switched on in stages. Today only a persisting pilot runs, without visible delivery; broader autonomy stays closed until its operational and recovery gates are proven. That restraint is part of the design, not missing ambition.

Tribunal, the mechanism — advocates are chosen first, each with its own provider, model and brief. Disagreement is set up on purpose.
Tribunal, the verdict — several models argue a question out, then a decision is stated with its reasons. Trust through disclosed dissent instead of one confident answer.
Mitos — the operations surface. Scheduler health, automations, and cost recorded at the source and split by model role: accountability for what an agentic product spends.

03

One codebase, two editions

Nyx and Nadir share frontend, backend and product patterns, but they are not two skins on one account. Nyx runs as a private, self-hosted owner edition. Nadir ships as a macOS app with a bundled Python sidecar; the local service binds to the machine it runs on, and data, settings and the chosen vault stay with that installation.

A static edition profile decides which backend modules, routes and surfaces exist at all. Build and bundle checks keep private Nyx content out of Nadir on top of that. And Nadir brings its own companion identities, Helios and Selene, instead of copying Nyx. That turned a private single-purpose product into a reusable core — without rebuilding the private edition into a multi-tenant system.

Developed together, separated at runtime and in the bundle: one core, two deployables, no shared data path between them.

04

Local-first as a product decision

Nadir should stay useful without a tracker account or a permanently connected AI provider. Local data is the primary path; external services are additions.

Bookmarks stores links, text and images durably first and enriches them afterwards. A network or model failure never costs the entry, image originals stay on the machine, and search combines FTS5 with local E5 embeddings and sqlite-vec instead of introducing a second external service. Pinakothek keeps a local media library searchable, ratable and annotatable with no provider at all. Horologion keeps calendar sources in the area responsible for them, so private iCal URLs are not passed on to the surface or to models.

The pattern across all of them: usable locally first, optionally smarter after.

Nadir's first screen makes the data promise the first decision: conversations, notes and profile live in a folder you choose, and an update replaces the app, not the folder.
Providers come later and stay optional. Connecting one is a deliberate act; a stored key is not standing consent for background use.
Bookmarks — saving comes first, enrichment second. The panel says so out loud: processing runs in the background after saving, image originals stay local. Entries carry a ready state, their source, a summary and tags.

05

Memory as a lifecycle

A personal companion needs more than a long prompt, so the memory layers are separated:

  • conversation context for the current exchange
  • structured memories in SQLite, scoped per companion and edition
  • human-readable content in the vault
  • hybrid search for exact terms and semantic proximity
  • promotion, decay and controlled reprojection instead of endless accumulation
  • a deletion closure that also covers derived indexes and projections

Xenia added another layer: a source-backed chronicle of the relationship. It points at evidenced moments from presence instead of inventing an emotional history. Candidates stay editable drafts, and the relationship is never gamified through message counts, streaks or productivity.

06

Many areas, one learnable pattern

The suite is grouped into chat, work, life and system. Not every area needs explaining — what matters is the recurring principle: area-specific settings live where their effect is visible, and shared components, states and design tokens hold the surface together without forcing every feature into the same layout.

Orakel
Sourced, agentic deep research
Tribunal
Opposing positions and a reasoned verdict
Echo
Local meeting capture and faithful summaries
Pergamon
Knowledge vault and retrieval
Mosaik
Notes and tasks
Horologion
Calendar, tasks and day context
Pinakothek
Local media library
Xenia
Source-backed chronicle of the relationship
Model roles with their own routing per role — not one model for everything, but an assignment per task, which is also what makes cost readable in Mitos.
Gnosis — generated text placed into a structure that can be worked with. Designing for generated content, not just around it.
Horologion interprets the day instead of listing it — “a quiet Monday, little schedule pressure, room for what matters to you”, plus a status for the day. One calendar entry is blurred: client meeting names stay confidential.

07

From concept to an operated product

The alpha forced the biggest change in process. A plausible UI was no longer enough: updates had to preserve local data, migrations could not be destructive, macOS permissions became part of the experience, and a green web build was not a released app. So I set clear gates:

  1. Check the actual state and the real code paths
  2. Specify behaviour and non-goals
  3. Build in small, reversible slices
  4. Review independently against code and spec
  5. Run tests on one exact source state
  6. Sign off commit, deployment, activation and real-world effect separately

Alpha feedback fed straight back in: persisted names were stabilised, an empty first start got a real way in, optional API errors were no longer allowed to hide content that had already loaded, and native document permissions became their own product state rather than an error.

Result

As of August 2026

596
commits in the current repository
2
separate deployables from one core
2
testers in the closed alpha
12+
focused product areas, one navigation system

A shared React / FastAPI / Tauri core with two separate deployables, local SQLite and vault storage, optional providers, provider-independent core functions, and automated edition, bundle-leak, migration, frontend, backend and native gates.

Presence and assistance can share an identity without sharing a room.

The companion stays recognisable while tools stay scoped.

Local-first prevents dependency, not intelligence.

Libraries and stored content stay useful while models and metadata providers add value on top.

Trust needs operational design.

Pause, consent, scope, receipt and recovery are as much UX as labels, dialogs and visual feedback.

An edition is more than feature gating.

Only data, runtime and build isolation together made Nadir a product of its own rather than a copy of my private install.

Where it stops

Current limits, stated on purpose

These limits belong in the case study, because they show where product responsibility ends and the roadmap begins.

What I take from it

Trust does not come from an AI system explaining its complexity. It comes from translating that complexity into boundaries you can check.

A model label can make a decision understandable. A scope prevents the wrong data from entering at all. A consent gate prevents an unexpected provider call. A receipt prevents a doubled outside effect. A local primary function prevents someone else's service from becoming the product's foundation.

The second lesson is about AI-assisted product development itself. Speed only pays off if decisions, reviews and sign-offs are allowed to be slower and more deliberate than the code production. Nyx and Nadir are a showcase for companion UX — and just as much for the question of how one person leads a complex AI-native product responsibly.