How it all started
It was a Wednesday evening, April 8th, 2026. I was on the couch with my partner. We were staring into the streaming interface, trying to find a movie we'd both actually watch. She wanted horror: jumpscares, blood, fear. Some slasher from the early two-thousands. I wanted a drama. Something quiet, something arthouse, ideally with long takes where not much happens.
Netflix looked at our combined watchlist and suggested a generic action thriller. Again. That wasn't what I wanted. It wasn't what she wanted either. It was the safe middle. The mathematically calculated compromise between two people with individual needs. The average of the two of us is "nobody". A cheap John Wick clone. You know the drill.
My name is Ken, I'm a service operations manager for spark spectrometers and I deal for a living with analytical instruments, some of which were already running before I learned to walk. Analytical thinking: yes. Software development: never. I hadn't written a single line of production code before that evening. But that night, in front of the TV, something must have triggered me.
The problem
Streaming algorithms estimate your taste based on your watchlist. But watch lists are contaminated data sources. What you eventually turned on depends on what was available, what your partner wanted to see, what's about to drop out of the catalog, what mood you happened to be in on some random Tuesday night… The signal is noise. Bad enough on a single profile, mathematically broken on a shared one. And everyone pretends it's fine.
I wanted to build the opposite. An app that doesn't guess your taste from your history but asks you directly. 24 psychological scenario questions instead of thousands of watchlist data points. More direct. More honest. Mathematically cleaner.
I had the name faster than the plan. PAVL: at the same time a nod to Pavlov's dog (assigning responses to stimuli — that's the core of the whole app) and a back door for a megalomaniac wordplay: Psychologische Analyse Visueller Latenzen (Psychological Analysis of Visual Latencies). It sounds like something a German scientist invented in a basement lab in 1973. That was exactly the effect I was going for.
Before I'd written a single line of code, I had the logo. Black background, film-strip frame, the wordmark PAVL set in GloockA high-contrast display serif typeface with heavy strokes. Frequently used on film posters, book covers, and editorials when a dramatic, literary look is needed. — one of those serif faces A24American film studio known for style-conscious indie and arthouse films ("Hereditary", "Everything Everywhere All at Once"). Established a distinct visual identity, especially through minimalist posters with elegant serif typography. has been plastering on their movie posters for years. Accent color purple, because I had no patience for the thousandth tech-blue. I knew what I was building because I knew what it was supposed to look like.
Day 1 to 7: From whiteboard to first question
In the first days I had no code. I had a whiteboard, a NotebookLMGoogle AI tool that turns your own documents (PDFs, notes, web pages) into a searchable, queryable knowledge workspace. Used for research and structuring ideas. workspace, and three tools that would become my most important sparring partners. CursorAI-powered code editor (a VS Code fork) with direct access to large language models like Claude or GPT. Instead of typing manually, you describe requirements in natural language and the model proposes code or writes it directly into your files. as the development environment, ClaudeLarge language model by Anthropic, used among other things for code generation, architectural consultation, and text processing. as architectural validator and script generator, GeminiLarge language model by Google. Accessed here via programming interface (API) to automatically tag thousands of movies with psychological metadata — bulk processing rather than single chat interactions. for bulk data processing via APIDefined entry point through which one program can automatically consume the services of another — without human interaction via a website..
Some people now call this "vibe coding"Colloquial (and in this text, dismissive) term for software development driven primarily by natural-language interaction with an AI rather than writing code yourself. Suggests effortlessness, which obscures the actual analytical work involved.. That's a horrible term that sounds like it's describing a meditation app where a program emerges from water sounds and breathing exercises. What actually happens is an analytical translation process: you describe what you want, precisely, the system writes the code, you read, understand, correct, ask back, point out logic errors, demand a restructure… You have to carry the architecture in your head, even if you're not writing every line yourself. You have to be able to spot mistakes. You have to know when an answer is hallucinated and when it fits.
What I needed was a psychological profile system. Ten dimensions that describe a person cinematically. How much cognitive demand do you tolerate, do you want to be challenged or entertained? How sensitive is your stimulus system to loud, fast, aggressive imagery? How much emotional exposure do you allow, do you want to feel along or keep your distance? Are you an escapist or do you want to be confronted with maximum reality? How strict is your aesthetic standard, does it have to be a work of art or is raw tension enough? How much darkness do you tolerate, where's your pain threshold? Plus humor affinity, empathy anchor, expectation shift, social modulation… Each dimension on a scale from zero to one hundred. The result is a ten-dimensional vectorA mathematical object describing a person via ten numeric values here (one per psychological dimension). Think of it as coordinates in a ten-dimensional space — each person is a point inside it.: a kind of psychological fingerprint that describes who you are as a viewer.
The 24 questions had to be written in such a way that every answer produces clean, mathematically defensible shifts along these ten axes. This wasn't marketing work, this was calibration. I spent days reformulating individual answers because they would have hit too many dimensions at once. Or too few.
One question, for example: "A child dies at the start. Slowly. The camera forces you to watch."
Answer A — "I close the app." — lowers your darkness tolerance and your emotional exposure. Answer C — "I stay calm and look at why the scene is built this way." — raises your cognitive demand and lowers your emotional exposure. Both answers are valid. They simply describe different people. That's exactly the point.
Day 8 to 14: The system learns
Questions alone give you an estimate. But people lie, including to themselves. I looked at my own first result and thought: hm, I'm actually funnier than the system says. And then I realized that my "actually" might be a lie too. The system needed a mechanism that checks self-assessment against actual behavior.
That's exactly what the deck is for. After the questions you get movies as swipeable cards. Right if you want it, left if you don't. Every swipe shifts your vector. If you like movies that are more intense, funnier, or darker than the questions had assumed, your profile adjusts. Your archetype can change.
The math behind this is an adaptive learning rate that decreases over time. Early swipes move you a lot: you're new, the system knows little about you, every data point is gold. Later swipes barely move you, your vector stabilizes. Just like a human matures in their taste. There's a hard upper bound per update so a single deranged swipe can't destroy your whole profile. Negative ratings carry slightly more weight than positive ones because people are more honest and direct about what they reject than about what they think they want.
Day 15 to 18: The architecture
Warning: This is where it gets technical. Vectors, learning rates, a bit of math. If that's not your thing, just skip to the next section — I won't take it personally, and the story will survive.
The frontend is a React NativeFramework for building mobile apps for both Android and iOS from a single codebase, instead of maintaining two separate apps in two programming languages. app, built with ExpoTooling layer on top of React Native that significantly simplifies development, build process, and publishing of mobile apps. Spares you a lot of configuration pain., because I knew from day one that I wanted to serve Android and iOS from a single codebase. A second parallel project for iOS would probably have killed me.
The backend runs entirely serverlessArchitectural model where you don't run or manage your own servers. Code executes in a cloud environment that scales automatically and only consumes resources when actual requests come in. on CloudflareInternet infrastructure provider. Among other things, operates a globally distributed network of data centers on which you can run applications close to wherever the user happens to be.. WorkersCloudflare Workers: JavaScript (and other runtimes) that runs on Cloudflare’s global edge—typical for APIs, routing, and backend logic without running your own servers. for the computations, D1Cloudflare D1: managed SQL database in the same edge environment as Workers, for structured app data with minimal distance between storage and compute. for the database, R2Cloudflare R2: object storage for large files (images, video, assets), S3-compatible—complements Workers and D1 for media and blobs rather than relational rows. for the assets. No AWS, no containers, no self-hosted server waking me up at three in the morning with a push notification. The entire backend code runs at the edgeComputations happen geographically close to the user instead of at a central data center. Drastically reduces latency because data doesn't have to travel halfway around the world first.. Meaning: wherever the user happens to be. When somebody in Hamburg opens the app, a server in Hamburg answers. When someone in São Paulo swipes, a server in São Paulo answers. LatencyTime between request and response. For web applications, anything under 100 ms is considered very fast, anything over one second feels noticeably sluggish. in the millisecond range, without me having to configure a single region by hand.
Authentication runs entirely without passwords. PasskeysModern authentication standard replacing passwords with cryptographic key pairs. The private key stays on your device, unlocked via Face ID or fingerprint. Phishing-resistant, because there's nothing left to type.. The new standard Apple, Google, and Microsoft are jointly pushing. You log in with Face ID or fingerprint, your device authenticates you cryptographically against the server. No "forgot password?", no verification email lost in the spam folder. I just left out this entire category of problems. Cross-device login works through a six-digit code valid for ten minutes. Enough security, low friction.
The biggest technical hurdle was the matching engine: the algorithm that decides which movie comes next in your deck. 26,000 movies are in the database, each one tagged through an automated API pipeline with Gemini into the same ten-dimensional space as the users. On every deck request, the system has to compute which movies fit your current vector best.
My first attempt was a simple cosine similarityA mathematical method for measuring how similarly two vectors are oriented. A standard approach for recommender systems, but it ignores how far the values sit from their average.. Works for many recommender systems. In my case it plateaued. The recommendations were okay but not good enough that I would have trusted them. Three days later I had rebuilt it. The final version uses Pearson correlationRelated to cosine similarity but subtracts the mean first. As a result, it captures not just whether two profiles point in the same direction, but whether they respond above-average to the same things. Practically: stronger, more precise matches. with exponential sharpeningMathematical trick that disproportionately amplifies good matches and pushes mediocre ones down. Ensures the top recommendations actually fit instead of just being "okay". for the top matches. Mathematically more elegant and practically better. Latency for a full sort across 26,000 movies currently sits between 700 and 1400 milliseconds. Fast enough for now, because you only get 25 cards per session anyway and don't need every single movie computed in real time.
Day 19 to 21: Pair Mode
Remember the beginning? My partner and I — the Netflix problem? She wants heads to roll, I want Andrei TarkovskyRussian filmmaker (1932–1986), the archetype of contemplative arthouse cinema. Known for extremely long takes, spiritual themes, and meditative pacing ("Stalker", "Solaris", "Andrei Rublev"). Used here as shorthand for "demanding, slow cinema"..
Pair mode was never just a feature, it was the origin. Two people with completely opposing profiles wanting to watch a movie together without either of them making compromises that don't really work for anyone. The app has to understand that the intersection of two tastes isn't the average, it's the rare zone where both profiles want the same thing for different reasons.
Here's how it works: you connect with someone from your friends list. Both of you swipe independently through the same deck. The system computes the mathematical intersection of your two vectors in the background, weighted by which dimensions you're similar in (amplify) and which ones you diverge sharply on (dampen). The match signal only fires when both of you have swiped right. No real-time sync, no need to be online at the same time. You swipe in the morning at work, she swipes on the couch in the evening. If a movie comes up green on both sides, it lands automatically in your shared watchlist.
There are 36 pair archetypes, sorted along four axes: harmony, complementarity, tension, extreme. If you're both highly cognitively demanding and darkness-tolerant, you're "The Autistic Syndicate". If one of you breaks every convention and the other craves order, you're "Storm Against Silence". If one loves Tarkovsky and the other knows "The Texas Chainsaw Massacre"1974 American horror film, a landmark of the slasher genre. Used here as the counterweight to Tarkovsky: uncompromising brutality instead of contemplation. by heart, then you're exactly the kind of couple Pair mode was built for in the first place. The system isn't therapeutic. It's observational. Sometimes tender. Mostly damning.
Day 22 to 24: Beta
On May 2nd, 2026, 24 days after I first wrote down the idea, I shipped PAVL into closed betaSoftware testing phase accessible only to a limited group. Serves to surface bugs and gather feedback before the product becomes publicly available.. Over 60 testers signed up in the first 48 hours. The first bug reports came in within hours. Some of those issues I fixed the same night.
I sat on my couch, Dr Pepper in hand, watching the data stream from real users. Their results, their swipes, how their vectors shifted in real time. It was the strangest feeling I'd had in a long time. I had built a system. It was running. Other people were using it. And it worked.
24 days earlier I didn't know what a D1 indexA special data structure inside the D1 database that accelerates finding specific records. Without indexes, the database has to scan every row individually — with one, it finds what it's looking for in just a few steps. was.
What I learned
AI doesn't replace a developer. But it removes the entry barrier. I still can't write a sorting algorithm spontaneously from memory. If you put me in front of a whiteboard with a marker and say "implement a B-treeSelf-balancing data structure used in databases to keep large amounts of sorted data efficiently searchable. A classic interview question for programmers — used in the text as a symbol of "real" coding knowledge.", no chance. But I can think a system through architecturally, I can articulate requirements clearly, I can read code and understand it once it's in front of me, and I can spot when something is wrong, even if I couldn't have written it from scratch myself. That's enough for Cursor and Claude. What I brought wasn't coding experience, it was two decades of spectrometry experience, in which I learned to deal with complex systems that fail, that need to be repaired, and that don't tell you what they want.
Anyone claiming AI makes programmers obsolete has never tried to build a real product with it. AI translates from concept to code. But the concept has to come from you. The architecture has to be clear. The decisions — which database, which learning rate, which authentication, which trade-off between latency and storage — those you have to make. Cursor doesn't know whether your app is a Cloudflare app or an AWS app. Cursor doesn't know your algorithm has to run on Pearson instead of cosine. I knew, because I had thought about it.
Directness matters more than politeness. I never asked Claude or Cursor to please be nice and help me. I formulated problems clearly, described bugs concretely, and put requirements directly on the table. Whoever works with AI like with a colleague who has to be handled with care loses hours in unnecessary clarifying.
And you need a vision, not a business model. I didn't start with "how do I make money with this", I started with "why is Netflix so goddamn dumb". The business model comes later. A vision you can articulate clearly is the first fuel. Everything else is optimization.
What's next
PAVL is in closed beta. Android only, for now. iOS to follow. Series support is planned. The algorithm will keep getting sharpened. Premium features are in development. The app itself stays free for the core functionality!
If you're reading this and thinking "I could try that too", try it. Just do it! You don't need a coding bootcamp. You need an idea that keeps you up at night. A problem that annoys you enough. And the willingness to wade through a swamp for a few weeks without knowing for sure whether you'll ever come out the other side.
I did it. I still can't write a B-tree from memory. But I have an app.
PAVL is in open beta. If you want to try it, get the app on Google Play. If you just want to try the quiz without installing the app, there's a demo running at pavl.app/demo.
We see what you see.
— Ken