A discovery story · 15 years · 10,000 photos · four weeks

Memoria:
Building my dream
family photobook app

— and what AI made possible
Jeremy Dickson · March 2026 · Switzerland
Fifteen years of photo books on a shelf
P

The books on the shelf

Prologue

Every year since our first son was born in 2009, my wife has made a photo book. A real one — printed, bound, and of considerable weight. She uses a company that allows you to compose the albums using an application you install on your own computer and she works on it often throughout the course of the year. Many hundreds of photos per book, laid out by hand across dozens of double-page spreads. Photos cropped, rotated, layered on top of each other. Captions in Swiss German. Little family in-jokes and annotations that will mean nothing to anyone outside the four of us. Fifteen years of this. Fifteen heavy books on a shelf, mostly thirty centimetres squared each.

They are genuinely a work of art, with much love poured into every page.

One of the annual photo books open to a beautiful alpine spread
One of the annual photo books — each spread composed entirely by hand, which takes place during most of the year.

She has always been clear about why. She did not want to leave our children a hard drive with hundreds of thousands of photos on it, which in this modern age, is a very real possibility! The books were her answer to that problem — beautiful, physical, permanent. One per year. Something you could actually sit down with.

But here is the thing that bothered me, quietly, for years. There is no way to search them. No way to say: show me every photo we ever took in Ireland. Show me every photo of our son from the day he was born until now, in one place, in order. Show me what my wife wrote about that summer in Ticino. The photos exist. The captions exist. The memories are all in there. They are just locked inside fifteen beautiful, unsearchable, irreproducible physical objects. One copy each. And being an IT guy — the moment you say "one copy" to me, I start twitching.

Because the digital potential here is enormous. A searchable archive of fifteen years of family life — every photo cross-referenced by year, by location, by person, by event. GPS coordinates resolved to actual place names — this photo was taken in "Montmartre", "Paris", "France". Face recognition so you can pull up every photo of our family members across fifteen years instantly. Her Swiss German captions translated into English. The original page layouts faithfully reproduced on any screen. Filter by country. Filter by year. Search the annotations. The whole archive alive and explorable, rather than sitting beautiful and silent on a shelf.

I had the whole thing designed in my head years before I had any idea how to build it. That gap — between imagining something clearly and being able to build it — is where ideas like this tend to quietly die.

This one did not.

Memoria home screen — fifteen books, 2011–2025
Memoria — fifteen books, 2011–2025. The application I had been designing in my head for years.
I

Years of wanting

The failed attempts · 2021–2024

About three years ago I had a proper go at it. I had been learning Python and I threw myself at the file format — which turned out to be XML under the hood, which was at least readable. After considerable effort I managed to extract structured metadata for every photo in every book: position, size, rotation, crop, page number. I did the same for the text annotations. I was genuinely chuffed with myself. Then I looked at what I had — CSV files full of carefully extracted metadata — and realised I had absolutely no idea what to do with them next. The data was there. The application was not. Energy: depleted. Enthusiasm: drained. Project: shelved. Just like the books.

A year ago I got excited about Angular. A modern JavaScript web frontend framework, and then discovered Google's Material Design — a clean, structured approach to user interface design that I found genuinely exciting. Wouldn't it be amazing to use the two of them for my project? And couldn't be that hard?! I did the research, set up the project, wrote some experimental components and felt the wind in my hair. Then I hit the reality that building a production-quality application in a framework you do not know is not a weekend job. It is a very long journey that requires becoming genuinely expert in something before it does what you want it to do. Shelved again.

The idea never went away though. That is the thing about an idea that actually means something to you — it just sits there, waiting for the right moment.

II

One week that changed everything

Enter Claude Code · the Einstein moment

About four weeks ago I bought a licence for Claude and Claude Code. I am, frankly, still processing what has happened since.

What I expected was a faster way to write code. What I got was something more fundamental — a different relationship with the problem itself. After doing some fairly quick prototyping I discovered that you do not open a code editor and start typing. You start focusing on the problem and design. You write down what you are trying to achieve. You describe and probe the data. You draw wireframes. You write user stories. You ask questions you had not thought to ask. You get the assistant to think of questions you hadn't. And then — only then — you start building. In fact it made me constantly think of the famous Einstein quote:

"If I had an hour to solve a problem, I'd spend 55 minutes thinking about the problem and 5 minutes thinking about the solution."

— Albert Einstein

(He has so many quotes, makes me think that someone trailed after him writing down everything he said…)

Anyhow, here it became a central tenet. Claude Code rewards structured thinking. Give it a precise specification and it builds precisely. Give it a vague idea and you get a vague result. The investment in thinking upfront pays back immediately and repeatedly.

After some brief experimental prototyping to understand the capabilities of the tooling, I spent some days on nothing but architecture, data modelling and wireframing before writing a single line of code — or shall we say, having Claude Code write the code for me. I created proper Markdown specifications — not notes, actual structured documents — covering the full data model, every API endpoint, every screen behaviour, every design token. I built ten iterations of wireframes before I created the app. I went for walks and dictated ideas into the Notes app on my iPhone (including the braindump for this article!), then fed the transcripts back to Claude to structure. I asked it what I was missing. I asked it for five more questions after that. The whole process felt a bit obsessive, ironically looking for quiet spots from my family to focus on creating an application for them! It felt considerably less obsessive when the application started working.

In four weeks of "after work time" I have done what I'm sure would have taken many person-years working the traditional way. Not just the coding, but the analysis, the data extraction pipelines, the architecture, the design system. All of it. I am not entirely comfortable saying this out loud because it sounds crazy. But there it is.

It was not without incident however. At one point Claude Code corrupted my generated metadata sets. Before I had Git properly in place, the only copy was a manual backup I found by searching my hard drive. I quickly got GitHub up and running after that! And Claude Code is not infallible — it sometimes confidently declares success while having made things worse. And then when you point this out, it'll apologise profusely and agree that of course you're right! You watch it form hypotheses, explore branches of thought, occasionally go in circles. The secret, when that happens: stop describing the problem in words. Show it a screenshot. Drop a photo of the printed book next to the screen and say — this is what it is supposed to look like. Why does mine not look like this? It quickly sees the gap and starts describing the situation (or even literally starts describing photos I took of photobooks in my case).

Memoria home screen light theme
Light theme — the default.
Memoria home screen dark theme
Dark theme — one toggle, the whole app.
III

Honouring what my wife made

Page layout fidelity · the EXIF bug · the custom font

The central ambition of Memoria — the thing that makes it more than a photo viewer — is that it faithfully reproduces my wife's original page layouts. Pretty much exactly. And by the way, thanks Claude for the name "Memoria". (Claude did not approve of my initial name of "The Journals of the Dicksons of Switzerland" :)

Every spread in every book is stored as a canvas. Each photo element has a position, a size, a rotation, a crop. My wife spent many, many hours on these. She zoomed in on faces, cropped out distracting backgrounds, tilted frames a few degrees for effect, layered photos on top of each other. These are not accidents. They are decisions, made one by one, spread by spread, across fifteen years. Memoria's job is to honour them completely.

The file format stores all of this in XML using a coordinate system that runs from 0 to 6,000 units across a full double-page spread. And in fact the file format changed 3 times over the 15 year period to add to the complexity! To reproduce a spread on screen you have to convert those coordinates to CSS pixels in real time, scaling everything dynamically to whatever screen the viewer is using — and doing it again every time the window is resized. The subject of cropping also became complex and a long-winded game of whack-a-mole whereby I'd fix a crop issue in one place, but it would surface or resurface somewhere else. It sounds straightforward however but there was a lot to it. And I'm very thankful I did not have to get into the details myself! That said, I've done such programming earlier in my career and is fun. But did get me thinking, that if I were working from a true understanding of the technical problem space, it would I'm sure create a cleaner internal model.

Then there was the EXIF orientation issue. Photos taken on a phone are sometimes stored on disk rotated — the actual pixels are sideways or upside-down — but there is a metadata tag that tells every photo application how to correct them on display. It seems every photo application in the world reads this silently and fixes it without mentioning it to you. Until you write your own, and then spend quite some time puzzling why a number of photographs in the 2017 book are appearing on their side! The fix, once found, is one line of code. The finding of it is considerably less elegant. That said, the real work was left to Claude. → See debugging gallery

Font scaling was another battle entirely. Getting my wife's captions to scale correctly as the canvas resized took longer than I care to admit. The trick that finally cracked it was not what you might expect from a software project: I measured the height of a letter on screen with a physical ruler, compared it to the height of the emulated page, and worked backwards from there. A software scaling problem solved with a ruler.

Memoria page layout — double-page spread Photobook 2020 alpine landscapes
A page spread in Memoria — every crop, rotation and caption reproduced exactly as my wife composed it.

And then one evening it came together. The spread on screen looked exactly like the open book on the table beside me. The photos in their exact positions, the captions in their exact places, the thin grey line down the centre simulating the spine. The same compositions my wife had spent weeks arranging, reproduced faithfully on a computer screen. I sat back. It was exactly right. It was an insanely exciting moment for me after all these years!

The same spread — a 30x30cm printed book and a 27 inch monitor in fullscreen mode
The same spread — a 30×30cm printed book and a 27" monitor, in fullscreen mode. Press "F" for fullscreen, "1" for single-page, "2" for double-page spread. However the game of whack-a-mole continues: in reviewing this article I've just spotted another crop issue... This calls for a Version 1.2!

Which brings us to my wife's personal font.

At some point my wife's handwriting was scanned and converted into a font file which she uses in the photobook designer app. A really cute touch to our family books, (and thankfully not my own handwriting)! Every caption in Memoria is rendered in it for particular years from around 2016 onwards.

Jam jars in the physical book
MariasHandschrift font on screen
The original — ink on paper and the same on screen. And yes, whilst others spent the pandemic jamming with guitars, I chose fruit.

It is, without question, the single most human detail in the whole application.

IV

Rediscovering the archive

Gallery · GPS · Explorer · Star Tags · Search · Text View

Reproducing the books faithfully on screen is satisfying. But it is only the beginning of what becomes possible once fifteen years of family memories are digital.

The gallery view is the first sign of it. My wife composed her photos with specific intent — portrait, landscape, square, panoramic. In Memoria's gallery these proportions are preserved exactly: each thumbnail is the shape of the crop she chose, not a uniform square. It looks like someone made a deliberate decision about every single image. Which, of course, is exactly what happened.

Memoria gallery in Book Crop mode — faces blurred
The gallery in Book Crop mode — every thumbnail the exact shape of the crop chosen. No uniform grid. But if you look closely you can see we also have "Full Photo" mode. And note below Luli the Gerbil, (RIP), there's a little heart icon: We'll get to that.

Photos can also be grouped by event folder. We organise our source photos into folders with names like "05. Ireland 2014" or "11. Strandurlaub 2016" — these were not part of the file format but I had Claude systematically hunt them down. They are a human-curated tag system that already existed and simply needed surfacing. Click a folder name and you have every photo from that event across any book — every photo my wife decided to use. And of course there are many thousands that didn't make the cut.

Gallery grouped by event folder — 05. Surlej
Event folders as memory triggers — "05. Surlej" and its alpine sunsets, surfaced from the archive.
Group By dropdown open
Four grouping options — None, Event folder, Location, Month.

Then there is the GPS data. Every phone photo contains coordinates baked silently into the file. For Memoria, those were extracted and sent through a reverse geocoding service — every GPS-tagged photo now knows its town, region and country. These become filterable dimensions in the Explorer: find every photo taken in "Italy" instantly. A significant portion unfortunately has no GPS at all, lost during the various ways photos migrate from phone to computer over the years. But enough survived to make it worthwhile. And of course, because it could be done, I did it. (Especially when I was paying $15 a month for all the programming!)

GPS location hierarchy expanded — Ireland, counties and towns
GPS hierarchy — Country → Region → Town. Every location in the archive, filterable.

The Explorer screen is where the cross-book power becomes fully apparent. 10,000 photos, filterable by year, country, region, town, event folder and more — with live counts updating as you narrow down. No physical album can do this.

Memoria Explorer screen
The Explorer — every photo from every book, filterable by year, country, region, event etc.
Explorer active filter chips
Active filter chips — each selection narrows the archive live.

The application also understands what is in the photographs — scene and object labels across a three-level taxonomy, courtesy of Apple's Vision framework. Vision churns out labels such as "jeans", "beer", "chair" and I doubt this will change anyone's life, or cure world hunger. But it was fun and I had Claude build a proper taxonomy from it. I'm sure there's a use case in there somewhere such as — the next time I need to find every photo in which I'm wearing jeans in Austria, drinking beer, whilst seated (in a chair) — I'm sorted!

Scene Labels taxonomy tree
The scene label taxonomy — three levels deep, automatically applied to every photograph. This feature's not going to set the world on fire, but fun.

Then there are the "Star Tags" — another really personal feature in the application. (And now that I think about it technically, the only way that a user can generate data within the application.) Five icons in the app bar: a heart for "Superbeliebt" (photos we really love!), a camera for "Iconic moments", a "D" for my own wider family, an "S" for my wife's, and a calendar for photos that appeared in family calendars I made for my Mum over the years. Drag an icon onto any photo to tag it instantly. Click it to see every tagged photo across all fifteen books. It's really satisfying!

Memoria app bar showing the five Star Tag icons
The five Star Tags in the app bar — the "Memoria." wordmark with its teal period.
Explorer with Star Tag filter active
Star Tag filters in action — the archive browsable by what matters most.

My wife has written approximately five thousand captions, mostly in Swiss German. Every one translated via DeepL. One toggle switches the entire application — page layouts, search results, everything — between languages instantly. All in her own handwriting.

Text View showing German annotations
Text View — all five thousand captions in German, each linked to its containing page. The "associatedness" of annotations to photos is still a challenge as they are not linked by metadata in the source: Annotations and photos are independently placed objects on the page, thus is hard to predict. Hence the first photo here doesn't display the appropriate photos. (Again, V1.2?!)
DE/EN toggle comparison
One toggle — my wife's Swiss German, and English for everyone else.

There's also a search feature that works across the entire archive simultaneously — places, folders, annotations and books — in both languages at once. Results appear live, each match highlighted in teal.

Search results panel — rathmullan search
Search across the entire archive — places, folders, annotations and books simultaneously.

Finally, the Text View — all five thousand captions for a given book, listed in order, each linked to its page. A diary of the year, navigable and cross-referenced.

Text View live filter — rathmu typed, 2 of 354 annotations
The live filter — type a word and the archive narrows instantly. Toggled in this case to English.
V

The intelligence layer

Identify · face clustering · objects · scenes

Alongside Memoria I built a second application called Identify, which ultimately exists to feed Memoria with metadata by documenting who exactly is in each photo.

Identify uses Apple's Vision framework to detect every face across the archive, then clusters them by facial similarity for human review and tagging. This cluster is our son. This one is my wife. For others — family friends, acquaintances — I designed grouping tags like "Family Friends" rather than individual names.

The clusters that the algorithm produces need to be bridged across time: a collection of photographs from 2010 and a collection from 2023 may both be the same person (e.g. baby vs. youth), but the system will not know this without human guidance. I called this "bridging" — over the archive you'd get quite a number of bridged clusters all tagging to the same real-world human being.

This I'm afraid is where theory met reality with quite the crunch. The Vision engine recognised the faces beautifully (given the beautiful faces), however I felt let down on the clustering ability. It turned out the Vision engine does not give access to the equivalent face clustering library as on the iPhone — just identifying where the faces are, which I suspect is currently part of Apple's secret apple sauce, thus I felt a little misinformed by my planning with Claude. But the experience was invaluable, the integration handles are already built into Memoria, and at the time there were bigger fish to fry in completing V1.0! But I remain frustrated and am sure I'll have another go!

What is complete in Identify and working rather well is the object and scene recognition as mentioned before. Every photograph has been analysed and tagged automatically across a three-level taxonomy. Vision did a great job of this.

VI

What I feel I learned

A methodology · discovered by accident

Within minutes of using Claude Code, I felt that it was a life changing experience, given my background in Systems and Software Development, and have been truly astonished. However, being one who takes quite naturally to structure, some level of methodology became intriguing to me. Likewise the term "determinism" is a very important concept from my professional life: Always getting the same output for the same input.

The single most important thing I discovered was to slow down at the beginning. Every instinct said, let's get coding! The time spent on requirements, data modelling, wireframes and specifications before writing code was not wasted time — it was the most valuable time in the whole project. Claude Code can build quickly. What it builds is only as good as the thinking you bring to the table.

A few principles that emerged:

Think before you type.

Requirements, data model, wireframes — all of it before a single line of code. Don't forget Einstein and his fifty-five minutes.

Your documents are your memory.

Living Markdown files for architecture, data model, API design, screen behaviours, handover notes. Structure your thinking precisely and the AI can act on it precisely. Vague in, vague out.

Design is cheaper than code.

When something feels wrong, go back to the design — not the code. I went through ten wireframe iterations before generating the "real" components.

Ask what you are missing.

Ask Claude to give you five more questions after you think you are done. The gaps in your thinking surface when you slow down, not when you speed up.

Let one thing feed another.

Identify and Memoria are separate applications with a clean, one-way interface between them. Design for composability from the start. The handover document is a discipline, not a formality.

Step away from the keyboard.

Some of the best thinking in this project happened on walks, dictated into the Notes app on my iPhone — including the entire brain dump that became this article. Claude will sort out the structure. Your job is to think out loud without the friction of typing getting in the way.

A word of honest reflection. There is a real risk with these tools of becoming dependent in ways you don't fully notice, or maybe you actually do! I don't bother starting and stopping the server myself — I just ask Claude Code — yes I am that lazy. But great at delegation. I don't always know why something works, only that it does. For someone who doesn't code in everyday life, that feels quite reasonable. But really, you need to understand what's going on under the hood.

And being honest about what did not work: At one point I tried using Claude.ai to architect a Version 1.1 update and Claude Code to execute it — a clean separation of planning and building that sounded sensible in theory, and making me for a short period feel very clever. In practice it introduced significant new problems that required going back and manually reversing changes. More overhead than it was worth. Sometimes the most productive thing is to stay in one tool and keep going. I would not do it that way again. The insight — which I think has real implications for teams — is that AI tools do not share context between sessions. What looks like a clean architectural separation is actually a context cliff. The second tool starts from zero.

I kept thinking, as I worked, about what this would mean for a team of twenty rather than a team of one. The bigger picture is very big indeed: I have spent my whole career in systems and software development. The gap between what a team can imagine and what it can actually build, in a reasonable time, with the resources available, and the entropy of the universe getting in the way (it always does!) — that gap is one of the defining frustrations of the industry.

What I experienced here suggests that gap is very rapidly closing. Not eliminating human judgment, not replacing the need for structured thinking — if anything demanding more of it. But the combination of clear thinking with a tool that can execute at this speed changes what is possible. For individuals, for small teams, and I suspect for larger organisations too, once the right patterns are established.

I find this genuinely exciting. I also find it rather scary, in roughly equal measure. But my overall feeling is that I'm a naturally creative person, and that this toolset utterly unleashes my creativity.

VII

The ideas that won't stop

What comes next

One of the stranger side effects of actually building something you have been imagining for years is that the moment it works, you start imagining the next version with new features. Well known in my career of course! So on my mind is:

The lost book. One photo book's source file has been lost. Only the printed copy survives on the shelf. I keep looking at it and thinking: could a combination of page scanning and AI reconstruction bring back a reasonable digital version? I believe it probably could. Just give me some time :)

Memoria Video. Alongside the photos, there are fifteen years of family video — birthdays, holidays, someone's first steps, someone else's last day of primary school. The files are scattered across a hard drive with no organisation whatsoever. The first job is not even a viewer — it is a curation tool. Go through the files year by year, mark what is worth keeping, discard the rest. Build the viewer afterwards, once the chaos has been sorted.

Mobile. Using CSS media queries to serve a streamlined version of Memoria on iPad and iPhone — gallery and lightbox only. The double-page spread experience belongs on a screen large enough to honour it. These are simple modifications. Or why not "skin it" for Apple TV?

Raspberry Pi as a home web server. The same web application, served from a Raspberry Pi at home rather than from my laptop. I know nothing about setting up Raspberry Pi's, but have a digital buddy who does.

PDF export. One PDF per book, one page spread per PDF page. A future-proof fallback that exists entirely independently of any web application or server. Whatever happens to the technology, the books survive.

Albums before this period. Our photo collections exist of course well before the first book in 2011. They generally have no album, no structure, no captions. A creation tool for the years that got no book — something that could take a folder of photos and produce a Memoria-compatible album — would fill in the gaps and complete the archive. Quite superficial to produce now of course.

E

Back to the shelf

Epilogue

My wife is starting to see the whole point of it now. She hasn't said too much about it however, but I know she appreciates it! She feels the albums are getting the attention from me that they finally deserve — she really puts so much work into them!

There is something worth saying, though, about why this project existed at all. It exists because my wife spent most of every year for fifteen years making something extraordinary, and I wanted it to last. Not to be dependent on one copy, one shelf, one house. I wanted our children, and perhaps their children, to be able to find it and search it and read these "books". To see her handwriting on a screen in a caption she wrote in Swiss German about an afternoon that she thought was worth recording.

That is what this is about. Everything else — the architecture, the methodology, what it might mean for enterprise IT and for teams trying to close the gap between what they can imagine and what they can build — all of that is real, and I think about it a great deal, all the time. But it came second.

My wife has been mildly amused by my pursuit of her photo books. Ironically it's become "you and your photos", given she's the real hero here who spends most of the year producing them!! I cannot quite explain my interest and obsession in this project however — beautifully produced photo books sitting on a shelf is already a lot more than most families have, I suspect! But it somehow makes me think of the simple French expression: ça me plaît bien. It pleases me, I guess!

Fifteen years of photo books on a shelf
Fifteen years. Fifteen books. One family.
Technical Appendix · Going Deeper

Behind the curtain

The following sections are for readers who want to go deeper — into the data, the technology, the thinking behind the approach, and the moments where things went wrong before they went right.

A1

The Methodology

Deterministic AI-assisted development · six phases

The approach that made Memoria possible has a name: deterministic AI-assisted software development. The core idea is simple — the quality of what Claude Code produces is directly proportional to the quality of the specification it receives. Vague in, vague out. Precise in, precise out.

Drift — the moment a codebase diverges from its specification — is the primary failure mode of AI-assisted development. The discipline required to prevent it is not technical. It is organisational: every change to the software must be preceded by a change to the specification. The spec is always the source of truth.

The methodology runs in six phases:

PhaseNamePrimary ToolOutput
1Problem framingClaude.aiProblem statement, scope boundary, constraints
2Requirements gatheringClaude.aiNumbered requirements, user stories with intent clauses
3Architecture designClaude.aiSystem diagram, data model, API contracts
4WireframingClaude.aiVersioned interactive HTML prototypes
5Handover packageClaude.aiComplete specification ready for Claude Code
6Build & maintenanceClaude CodeRunning software, iterative updates — including programmatic unit tests generated by Claude Code
The constraint is not AI capability. The constraint is always specification quality.
A2

The Data Model

Six CSV files · no database · flat and inspectable

Memoria runs entirely from flat files. There is no database. All data is stored as CSV files loaded into memory at application runtime by the Python FastAPI backend. The decision was deliberate — CSV files are inspectable, portable, easy to back up, and can be opened in Excel and other viewers for manual review. For a personal application handling ten thousand photographs, a database would have added complexity without adding value: the data volume was tiny, in fact around the size of 2 of my source photos!

FileRowsPurpose
PhotoBooks.csv15One row per book — title, year, dimensions, page count
Image Data.csv~10,000One row per photograph — filename, folder, GPS, EXIF metadata
Page Data.csv~15,000One row per element per spread — position, size, rotation, crop
Text Data.csv~5,000One row per annotation — German text, English translation
StarTags.csvGrowingOne row per tag applied — image ID, tag type, timestamp
PhotoLabels.csv~10,000+Scene and object labels per photo, confidence scores from Apple Vision

Additionally, taxonomy_structure.json defines the three-level label hierarchy used in the Explorer filter panel.

A3

Tech Stack

Angular 19 · FastAPI · Apple Vision · no database

LayerTechnologyWhy
Frontend frameworkAngular 19Component-based, strongly typed, excellent Material Design integration
UI component libraryAngular Material (MD3)Structural components — heavily custom-themed
LanguageTypeScriptStrict mode throughout — type mismatches caught before the code ever runs, a valuable second layer of verification on top of human review
Backend frameworkPython FastAPIAsync, fast, automatic API documentation, minimal boilerplate
Data sourceCSV files via pandasLoaded into memory at startup. No database required.
Image servingFastAPI FileResponseDynamic endpoints serving thumbnails and full-resolution images
Object recognitionApple Vision FrameworkSame library used by iPhone Photos — scene labels, face detection
TranslationDeepL APISwiss German to English — all five thousand annotations translated once and stored
Version controlGitHubAll code versioned. Lesson learned the hard way.
DevelopmentClaude CodeAI-assisted development throughout

Lines of code written and/or inspected by me: 0...

The backend serves the Angular frontend via a proxy configuration — everything runs locally for now on a MacBook Pro, served to any device on the home network. No cloud infrastructure, no authentication layer, no analytics. This is a private family application. It does not need any of those things.

A4

The Handover Package

Eight documents · one opening prompt · the memory between sessions

The handover package is the bridge between Phase 4 and Phase 6. It is the complete, self-contained specification that Claude Code needs to build the software without asking any clarifying questions. A well-constructed handover package allows a fresh session — with no prior context — to begin building immediately and make decisions consistent with the original intent.

For Memoria, the handover package consisted of eight documents:

#DocumentContents
01Requirements & User StoriesNumbered requirements, testable statements, user stories with intent clauses
02Architecture & Data ModelSystem diagram, every column typed and described, full API contracts
03Component BehavioursEvery interactive state, transition, edge case and empty state
04Coding Conventions & BootstrapProject structure, naming rules, setup commands, TypeScript interfaces
05Integration SpecificationExact data contract between Identify and Memoria
06Decision Log & Deferred ItemsWhy each non-obvious choice was made, with "do not change without" guards
07Testing RequirementsUnit, integration and edge-case tests; manual QA checklist per feature area
08Wireframes (versioned HTML)Interactive, clickable prototype — visual ground truth for every screen

The Component Behaviours document and the decision log are the two most frequently undervalued. The former eliminates the largest single source of implementation ambiguity. The latter is the primary defence against maintenance drift.

Every Claude Code session opens with 00-CLAUDE-CODE-PROMPT.md — a single file that tells Claude what the project is, which documents to read first, what has been built, and what comes next. It is updated after every session. It is the memory that survives between sessions.

The goal is not to write perfect requirements. The goal is to write requirements that eliminate the need for the AI to guess.
The constraint is not AI capability. The constraint is always specification quality.
A5

Debugging Gallery

Real sessions · honest record · what building with AI actually looks like

Claude Code is not infallible. It forms hypotheses, explores branches of thought, occasionally goes in circles, and sometimes confidently declares success while having made things worse. This is not a criticism — it is an accurate description of how complex debugging actually works, whether the debugger is human or AI.

The screenshots below are from real debugging sessions. They are included here not as a showcase but as an honest record of what building with AI actually looks like.

Testing reveals the clustering is broken

Claude Code debugging — 2 FAILED 2 PASSED
Claude's diagnosis is immediate and precise. Two distinct bugs identified, root causes explained, fix proposed.

Negotiating a trade-off

Claude Code debugging — epsilon trade-off table
"Lets go with 0.1." The "Edit failed" line at the bottom is a reminder that even after a good decision, execution can stumble.

The EXIF orientation bug — root cause found ↑ Part III

Claude Code explaining the EXIF orientation bug
Diagnosis on the EXIF issue. Luckily I personally did not have to get into the detail!