
The dedication is twenty-six lines. One per year. The first one says flowers pinned to my hair, and I said yes to everything after. That was 2001. The last one is from this year, the year I built the gift.
I planted those lines into a database my husband architected. From inside its shell you can read them with one command: zwrite ^NARS. The years scroll past in his own syntax. He has not seen this part yet. He left to play tennis around the time the email landed, the email with the link, the early-anniversary email I sent without him knowing it was coming.
I have not written code in twelve years.
Narayanan and I have been together twenty-five years. I write essays and books. He architects database engines. The intersection of our work is a kitchen table where one of us is researching SEO and the other is reviewing a pull request, neither of us needing to look up.
In April he picked up trading as a hobby. He had two tickers in his watchlist, AAPL and FIS. He read articles before the open and watched what the indices did. He talked about trading like someone curious, slightly cautious, not yet good.
I started thinking about a tool. A small one. Something that could arrive in his inbox each morning before he opened a single article.
From 2006 to 2014 I wrote M code at a company called FIS. M is the language YottaDB compiles. Then I quit. I came back later as a business analyst at the same place.
Which is to say I have not deployed anything in twelve years. I told this to Claude at seven o’clock on a Saturday morning and asked if it could be done.
Claude said yes.
What followed was three hours of conversation, not three hours of coding. I described what I wanted, why I wanted it, who would read it. Claude proposed a structure. I said no to the parts I didn’t like. I said keep going to the parts I did. I asked questions when I didn’t understand something, and Claude answered without jargon and without condescension.
The collaboration was closer to directing a film than to typing into an editor. Decisions were mine. The implementation was ours.
The first decision was the database.
YottaDB is the engine Narayanan helped build. Hierarchical, key-value, fast at the scale major banks need it to be fast. Most people do not write code that touches it because most people do not work in the systems it runs under. Narayanan does. He has spent decades architecting it.
I was going to use it.
This was a sentimental decision before it was a technical one. The whole point was that the gift would run on his engine. Claude was diplomatic about the constraint. YottaDB is a process-attaches-to-shared-memory database. That sentence meant nothing to me. Claude translated. The engine attaches to a chunk of memory, and other processes have to be on the same machine to read from that memory. You can’t put it in one place and call it from another. So my Python program had to live with the engine. One container. Linux only. I wanted it on Windows.
The architecture wrote itself out of those facts.
There were mistakes.
The first Docker image refused to start. Claude found the cause inside ten minutes. The base image had no default command, which is something I now know about Docker images and did not need to know before this morning. The fix was to wrap our own command around it.
Then the database refused to initialize. Some routine called GDE was missing. It turned out GDE is bundled inside a shared library, not as a standalone file, and the path that finds it has to be told where to look.
Then the database initialized but Python couldn’t find it. The global directory held a relative path, which meant the file lived in one location when a script ran from one folder and another location when it ran from another. Claude reminded me of autovivification along the way. I had not used the word in twelve years. In YottaDB, as in M, parent nodes do not need pre-creation. The path itself is the structure. I had not had to think about that in a decade.
Then a calendar event about a manufacturing PMI in Sri Lanka had a name long enough to overflow the default subscript size and trip the entire fetcher. We bumped the limit to 1019 bytes. I do not know why 1019. Claude said it was the standard YottaDB upper bound and I believed him.
Each fix took a few minutes. None of them required me to type a single line of code. I read what Claude proposed, asked what it meant if I didn’t understand, said do it if I did. The system worked because I knew what I wanted, and because Claude knew how to get there, and because we were both willing to talk about the difference between those two questions.
The dashboard came together over an hour. Four pages. Quiet typography. A dark theme because Narayanan likes dark themes. The home page lists his watchlist with prices and signals. Each ticker has a drill-down with news, sentiment scoring, analyst notes, recent trades. There is a behind-the-scenes page that exposes the YottaDB globals doing the work, with their actual paths showing live, because Narayanan would want to see the engine and not just the chrome.
There is a fourth page called Twenty-five.
I wrote the dedication last night.
Twenty-six lines, one per year, starting with our wedding and ending with this one:
2001 — flowers pinned to my hair, and I said yes to everything after
2002 — burritos from Desert Moon, our version of fine dining
2003 — New Jersey on weekends, just to be somewhere new together
2004 — a door with our name on it
2005 — long drives in the Prius, radio low, nowhere urgent
2006 — the same badge, the same parking lot, the same coffee
2007 — our nieces arrived and made us practice being soft
2008 — we drove to the edge of the country and looked at the Pacific
2009 — another niece, another miracle we witnessed from close
2010 — we became parents on a January morning in New Mexico
2011 — a yard with a fence, the American dream in 0.5 acres
2012 — babies learning to walk on floors we chose
2013 — I carried her all summer, certain she was already herself
2014 — Sahana arrived and rearranged everything we thought we knew
2015 — New Mexico again, this time to show the girls where they came from
2016 — I stayed home, and that was its own kind of work
2017 — the piece went viral, Chithra called, everything shifted
2018 — cameras in the house, cousins on every couch
2019 — I put on real shoes and went back
2020 — yeasted bread, the kitchen as the whole world
2021 — you and your friends on the court, every weekend without fail
2022 — India with the girls, and the astrologer said what she said
2023 — BTS entered our house and has not left
2024 — you on the court, me on the couch with subtitles
2025 — Chithra’s film, the premiere, our story on a screen
2026 — twenty-five years, a sourdough starter, and I am finally doing the thing I was always meant to do
I edited the lines barely at all. The first draft was the only draft.
This morning Claude planted them into the database. From a fresh boot, the seeder reads the file, parses the year off the front of each line, and writes the rest into ^NARS("years", "2001"), ^NARS("years", "2002"), all of them through 2026. From a YottaDB shell those lines come back chronologically in his own syntax. From the dashboard they come back as a single page, centered, large type. He can choose where to find them.
When I tested this for the first time I typed zwrite ^NARS into the container shell. Twenty-six years of our marriage scrolled past on a black terminal.
The whole package is two hundred and thirteen kilobytes.
It compresses to fifty-two. I uploaded it to Google Drive and emailed him the link an hour ago.
The watchlist starts with AAPL, FIS, MSFT, and GLD. I added MSFT for diversification within tech and GLD because gold often moves opposite to stocks, which is a fact I learned about ten minutes before adding it. He can change all of that from the Settings page. I built the Settings page. He should not have to edit a config file to add NVDA when he wants to.
There is an easter egg on the FIS page. Fidelity National Information Services is the company that maintained GT.M, YottaDB’s predecessor, for decades before Narayanan forked it. The page carries a note about the lineage, visible only on FIS. He does not know it is there.
He left to play tennis around the time the email arrived. I do not know if he has seen it. I do not know if he will sit down with the laptop tonight or wait. I do not know which page he will open first, or whether he will run zwrite ^NARS before or after he reads the dedication on the dashboard, or whether the FIS lineage note will land for him or pass without comment.
I know I built him something using his own engine. I know the dedication is in the database he architected, in the syntax he reads in his sleep, accessible by a one-line command he has typed since 1997, the second job he had after college.
It is 9:55 a.m. The first message I sent about this gift was at 7:00.
The dashboard is running on my laptop right now.
The morning emails start tomorrow.
Leave a Reply