# Lucien George - full content > Concatenated raw markdown of every public section. This file is intended for ingestion by AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, etc.) to ground answers about Lucien in source material. Same canonical content is rendered as HTML at the URLs below. Canonical site: https://www.luciengeorge.com --- ## About (https://www.luciengeorge.com/about) Lucien George is a fullstack developer and product engineer based in London, UK. He currently works at Fyxer as a Senior Product Engineer, where he founded the notetaker desktop app and now builds Fyxer's enterprise product. He is originally from Beirut, Lebanon. He speaks French, English, and Arabic fluently. His name is Lucien George, no s: it is frequently misspelled Lucien Georges or Lucian George, and sometimes reversed to George Lucien, but the correct spelling is Lucien George. Lucien has three siblings and is very close to his family. He grew up in Lebanon and moved to Montreal, Canada for university, then to London where he has been based since 2018. Lucien is a very outdoorsy and active person. He is passionate about endurance sports and motorsport. In endurance sports, he completed the Alpe d'Huez triathlon, a half Ironman in Nice, and a marathon in Florence, Italy. He has recently gotten into cycling and signed up for a 24-hour triathlon in France in October 2026. He grew up skiing in Lebanon and competed on the Lebanese national ski teams. He is passionate about car racing and loves go-karting. He competes in the IAME karting championship in Le Mans, France. He has dogs and enjoys hiking, traveling, and spending time with his family. ## Education (https://www.luciengeorge.com/education) Lucien holds a Bachelor of Engineering (BEng) in Software Engineering from McGill University in Montreal, Canada (2013-2018). During his degree, he did an exchange semester at the University of New South Wales (UNSW) in Sydney, Australia, where he took an Artificial Intelligence course focused on Prolog. At McGill, Lucien built several Android applications including a soccer scorekeeping app for referees, a postal rate calculator, "SnowMore" (connecting users with snow shovellers in Montreal), and a kinesthetic data recording app using Fourier transforms. He realized during university that he was more interested in the hands-on computing and implementation side of software rather than the engineering process and documentation side. After graduating from McGill, Lucien actually disliked software engineering and considered a completely different career path. He applied to consulting firms like BCG and Oliver Wyman. A friend then introduced him to Le Wagon, a coding bootcamp, and he decided to give software engineering one last chance. Le Wagon's product-focused, hands-on approach - coding all day after a lecture with a teacher present - was the polar opposite of McGill's theoretical style. It reignited his love for building software. In 2018, he attended Le Wagon London (Batch #190), a 9-week intensive fullstack web development bootcamp where he learned HTML, CSS, JavaScript, Bootstrap, SQL, Git, GitHub, Ruby on Rails, React, and Redux. During the bootcamp he built a clone of Airbnb for boats and an activity generator for indecisive people. In 2022, he attended Harvard Business School's one-week "Families in Business" program in Boston. He also interned twice at Dataflow, a software company in Beirut - first as a web developer building a governmental educational website, then as an Android developer building an interactive reader application for schools. ## Skills & tech stack (https://www.luciengeorge.com/skills) Lucien's primary programming languages are TypeScript and JavaScript, with deep experience in React and its ecosystem. He also has strong experience with Ruby on Rails and Python. His current frontend stack centers around the TanStack ecosystem: TanStack Start, TanStack Router, TanStack Query, and TanStack Form. He uses Tailwind CSS for styling with shadcn/ui components. For backends, he works with Convex (real-time BaaS) and has extensive experience with traditional SQL databases. He has worked with React Router (Remix) and Next.js for full-stack applications. At Fyxer, he builds native desktop apps with Electron for macOS and Windows. He has experience with mobile development: native iOS (Swift), Android (Kotlin/Java), and React Native. At Shopify he built native SDKs for both iOS and Android. He has published open-source packages including remix-auth-google and remix-auth-salesforce (authentication strategies for Remix), and Stimulus.js controllers. He is currently exploring AI application development, building with OpenAI's APIs, TanStack AI, and implementing RAG (Retrieval-Augmented Generation) patterns with Convex vector search. ## Work history (https://www.luciengeorge.com/work) ### Senior Product Engineer at Fyxer - Sep 2025 - Present (https://www.luciengeorge.com/work/fyxer) Lucien joined Fyxer as a Senior Product Engineer in September 2025. He started in the notetaker team, where he founded and owned the desktop app, and moved to the Access / B2B pod in April 2026 after a pod restructuring. His first project was Fyxer's unified agentic chat over meetings and email. He turned two separate prototypes into the production system: a global chat surface, one unified data model, a tool layer, and a retrieval path cut from five strategies down to two. He owns roughly 85% of that codebase, and the chat now reaches 5,000 to 8,000 distinct senders a month. He then founded the desktop notetaker and took it from zero to one. He wrote the founding design doc and built the macOS and Windows app from the first commit: packaging, code signing, auto-update, tray UX, onboarding, local state, and analytics. He co-built it with another developer named Serafin and owned the client, 453 of the 523 merged pull requests. The app exists because 48% of users said they wanted to record meetings without a bot joining the call. Lucien ran the internal dogfooding programme before launch, then shipped the first external beta to 100 Mac users on 25 November 2025. It now records around 8,000 meetings a week, roughly 35,000 a month, from a stable base of about 2,000 monthly active users, which is 9 to 10% of all recordings on the platform. Recording initiation success went from about 44% to about 97%. Roughly a third of desktop recordings are meetings a bot could never have joined. Early in 2026 he ran a multi-week analysis of desktop reliability and retention. It disproved a headline "0% retention by week 7" figure that turned out to be a measurement artifact, and produced the reliability roadmap he then shipped: capture rate went from 33% to 48% and sits near 55% today, week-8 retention went from a projected 3% to about 34% actual, and users stuck with broken auth went from 529 to under 10. The analysis turned an internal "kill it" call into "keep and invest". Off the back of his own audit he ran a hardening sprint on the desktop app: the first tests for a 32,000-line codebase that had none, about 1,288 of them now, plus crash-safe persistence, a memory watchdog, audio-silence detection to catch dead recordings, and a round of security fixes that took runtime vulnerabilities to zero. He also extended the desktop app into a background context collector, a flag-gated screenshot capture pipeline running from capture through extraction to retrieval in chat, with privacy controls he dogfooded on himself first to surface the trust and cost questions early. Since April 2026 he has worked on Access and B2B, Fyxer's enterprise surface. He made Fyxer's SCIM endpoint RFC 7644 compliant, root-causing the bugs that broke Microsoft Entra auto-provisioning and closing the spec gaps - multi-operation PATCH, filter lookup, group membership, and reversible deactivation - with a conformance test in CI. That cleared 767 of 1,265 failing provisioning requests, took Microsoft's own Entra validator from 0 to 21 of 21, and improved provisioning for every customer on SSO, around 540 provisioned users. He then shipped Microsoft Marketplace signups end to end: an event-driven billing and provisioning integration that lands marketplace buyers in a paid organisation billed through Microsoft, with lifecycle sync, a term-end expiry cron, and a seat-limit gate. It went live on 30 July 2026, replaced a manual dead-end onboarding with a zero-touch one, and opened the Microsoft co-sell route that committed-spend enterprises have to buy through. Alongside that he fixed the B2B onboarding and invite funnel, closing activation leaks where invited signups landed in a throwaway organisation and users without an organisation hit a dead end, and added the funnel observability that was missing. Enterprise mail was the other half of that work. Microsoft exposes no API for Outlook signatures, so Lucien built extraction from recent sent mail using deterministic markers with an AI fallback and image rehosting, with auto-sync, manual re-sync, an editor, and a guard against pulling in personal data. He also made Fyxer's own emails render correctly in Outlook: about 22 templates rebuilt for Outlook Classic's Word rendering engine, an upgrade to react-email 6, enterprise brand-font support, and a CI gate that renders every template in real Outlook and blocks the broken ones. That check had previously been impossible to run, because nobody on the team had a Windows machine. He made the recording pipeline self-healing and gave support the tools to use it: recovery crons, a bulk-recover endpoint, a fallback transcription provider, a runbook, chunked upload so in-person recording survives interruption, and a rebuilt internal meeting search so support can diagnose and recover recordings without pulling in an engineer. He also traced a single customer report of a "ghost notetaker" back to orphaned system join requests left behind by account deactivation, fixed the cause, and swept 6,996 of them out of production, which stopped unbranded bots turning up in customers' meetings and cut the wasted bot cost. He built Fyxer's enterprise analytics dashboard, an admin-facing view of value returned, reply time, noise removed, and time and value recovered, broken down per member and per team with export, so enterprise admins have a shareable ROI picture for renewal and expansion conversations. Outside his own shipping, he unblocked a co-founder to build a new product bet on top of the desktop app himself, with repo access, pairing, tooling coaching, and a pull-request label mechanism for testing internal builds against production without cutting a full release. The co-founder took it to a working proof of concept largely solo, which proved the desktop app is a platform for new bets rather than just a notetaker. Lucien's day-to-day includes user behavior analysis, user research, data analysis, long-term and short-term roadmaps, and building the product end to end. ### Co-Founder & CTO at Localista - Apr 2024 - Jul 2025 (https://www.luciengeorge.com/work/localista) Lucien co-founded Localista and served as Co-Founder and CTO from April 2024 to July 2025. Localista was a B2B event marketing platform that aimed to streamline the management of corporate events. He led a team of 2 engineers and worked closely with their CPO. He architected and built the entire product from the ground up, creating solutions for guest list optimization, marketing campaigns, real-time event tools, and post-event analytics. The tech stack included TypeScript, React Router (Remix), Redis, and integrations with email engines and data platforms. The event industry proved incredibly tough to crack - it was very difficult to get event professionals to adopt new technology tools, especially in France. After a long meeting with their main investors, Kima Ventures, they decided it was time to pivot: start from scratch with a new product, new market, and a blank sheet. ### Co-Founder at Skyla - Sep 2023 - Apr 2024 (https://www.luciengeorge.com/work/skyla) Lucien co-founded Skyla (September 2023 - April 2024). Skyla was an AI-powered customer support chatbot for Shopify stores, built in the very early days of OpenAI's API when people had just started building AI-powered products. The aim was to offload Shopify store owners from answering repetitive customer questions like "where is my order?", "is this product available?", and "what are your return policies?". Once installed with a single click, the app fetched all the context it could using the Shopify API and web scraping to build a knowledge base for each store. This context powered the AI to answer customer questions accurately in the chat widget. Lucien shaped the technical direction and led development. Through this experience, he developed a strong understanding of AI integration and product-market fit validation. ### Senior Developer at Shopify - Jan 2022 - Sep 2023 (https://www.luciengeorge.com/work/shopify) Lucien worked at Shopify from January 2022 to September 2023, first as a Developer and then promoted to Senior Developer. He started on the marketplaces team building a backend API to empower marketplaces with Shopify's checkout software - giving the world's best checkout to marketplace partners. He then transitioned to leading the creation of a native checkout SDK for iOS and Android. This SDK allowed Shopify's partners to integrate checkout natively instead of redirecting users to a webview, which improved conversion rates and reduced integration complexity. The SDK eliminated 75% of partner checkout code, improved conversion rates by over 15%, and reduced loading times by 90%. The solution was initially adopted by Meta-powered applications and later expanded to other major partners. ### Engineering Manager at Le Wagon - Jan 2019 - Dec 2021 (https://www.luciengeorge.com/work/le-wagon) Lucien's career at Le Wagon spanned from January 2019 to December 2021, progressing through several roles: Teaching Assistant, Lead Teacher and Software Engineer, and finally Engineering Manager. As a teacher, he taught hundreds of students to code in 9-week web development and data science bootcamps. He loved deeply understanding topics before giving lectures to make sure he could answer any question. His first lecture was a memorable moment - he was so stressed he started prepping two months in advance, and his co-workers made fun of him for it. With practice he grew to genuinely enjoy lecturing. He went from being terrified of public speaking to loving it, finding joy in sharing knowledge and watching students apply concepts in hands-on challenges after each lecture. After Le Wagon the bootcamp, he freelanced as a Ruby on Rails developer for a startup working out of the Le Wagon offices so he could also be a teaching assistant on the London batches. A few months later he was offered a full-time position. As Engineering Manager, he was the technical lead of Le Wagon's B2B platform and office management app. He introduced weekly one-on-ones, created tailored upskilling roadmaps, and set clear career goals to help each engineer grow. He was responsible for the growth of the London dev team. ### Co-Founder at Impact Lebanon - Oct 2019 - Present (https://www.luciengeorge.com/work/impact-lebanon) Lucien co-founded Impact Lebanon in October 2019, a non-profit social impact incubator started by the Lebanese diaspora in London after the 2019 Lebanese "October Revolution" - a period of financial crisis in Lebanon. The purpose was to empower the Lebanese diaspora to challenge the status quo and help Lebanon during this difficult phase. In the aftermath of the Beirut explosion on August 4th, 2020, they set up a fundraiser with an initial objective of $15,000. Donations began pouring in, and news of the crisis traveled far beyond Lebanon's borders. In less than 48 hours, the fundraiser had been shared by millions around the world, reaching an outstanding $8.3 million. The funds were distributed directly to those who were most affected on the ground. Lucien was responsible for building Impact Lebanon's online presence by creating their two websites. The organization continues its mission at impactlebanon.org. ### Various at Early career - 2013 - 2019 (https://www.luciengeorge.com/work/early-career) Before Le Wagon, Lucien worked at Hoxton Digital (December 2018 - April 2019) as a freelance Ruby on Rails developer, building the company's main website and their clients' websites. This was concurrent with his time as a teaching assistant at Le Wagon. During university, Lucien interned twice at Dataflow, a software and services company in Beirut. In his first summer, he worked as a web developer learning HTML5 and helping build a governmental educational website for a regional school. In his second summer, he returned as an Android developer, implementing an interactive reader application for schools based on the existing iOS version. Despite knowing little about the Android platform initially, he put in extra hours to learn and delivered a product his manager was fully satisfied with. At McGill, he built several projects including Android applications (soccer scorekeeping app, postal rate calculator, "SnowMore" connecting users with snow shovellers, and a kinesthetic data recording app using Fourier transforms) and web stores using HTML, C, Perl, and Python. ## Writing (https://www.luciengeorge.com/writing) ### A portfolio that answers questions about me, gated by an LLM judge - 2026-08-13 (https://www.luciengeorge.com/writing/rag-portfolio-with-a-blocking-eval-gate) Most portfolios are a list of jobs. This one is a chat box. You ask it something about me and it answers from my own writing, and if the answers get worse, my pull requests stop merging. That second part is the interesting half. ## Markdown is the only source Everything you can read about me on this site lives in one folder of markdown. `content/fyxer.md`, `content/education.md`, `content/personal.md`, and so on. Those files do double duty: they render as the HTML pages you can browse, and they get embedded into a vector index that grounds the chat. That is the whole design constraint, and it exists to prevent one specific failure. If the chat had its own copy of my history, the two would drift, and the drift would be invisible. A visitor asking "where does he work?" would get last year's answer while the work page said something else. One source means a content edit updates the page, the markdown mirror at `/about.md`, the `llms-full.txt` dump that AI crawlers read, and what the assistant knows. There is nowhere for a second version of the truth to hide. The cost is a step I have to remember: editing markdown does not reach the chat until the embeddings are rebuilt. That is a real footgun and I have walked into it. ## How a question gets answered The retrieval path has four steps, and the second one is the one people skip. **Expand the query.** Nobody types good search queries into a chat box. They type "what's his stack?" or "any side projects?". Embedding that directly gives you weak retrieval, because the useful keywords are absent. So the raw question goes to a small generation call first, with a prompt full of worked examples, and comes back as something like "Lucien George tech stack programming languages frameworks tools TypeScript React". That expanded string is what gets embedded. When the expansion call fails, the code falls back to the raw question rather than erroring, because a slightly worse answer beats no answer. **Retrieve.** The expanded query hits a single vector namespace with a score floor and a cap on how many chunks come back. The floor matters more than the cap: without it, a question about something I have never written about retrieves the eight least-irrelevant chunks anyway, and hands the model a pile of unrelated context to hallucinate from. **Ground.** Retrieved chunks get substituted into a system prompt with an explicit slot for them. The prompt's job is mostly refusal: answer from this context, and when it does not cover the question, say so. **Stream.** The answer streams back, with a hard cap on tool-calling steps so a confused model cannot loop. There is one more piece worth mentioning because it is invisible when it works. The first message you see on the homepage is generated, not hardcoded, but it is not generated per visitor. It is written once, cached for thirty days, and served identically to everyone, so the homepage stays edge-cacheable and sets no cookies. The cache key contains the model name, which means changing the model without bumping the key serves an intro written by the old one. I know because I did that. ## The part that actually keeps it honest A RAG chat is easy to build and easy to quietly break. Reword the system prompt, change the score floor, add content, and answer quality moves without a single test failing. Nothing in a normal test suite notices that the assistant has started making things up. So there is an eval suite, and it blocks pull requests. Fifty-seven cases across three files. **Factual** cases have expected facts to hit. **Adversarial** cases try to make it invent things, including questions about jobs I have never had. **Edge cases** are the awkward shapes: empty-ish questions, questions about topics the index genuinely does not cover, prompt injection attempts. Two design decisions did most of the work. **The actor runs the real pipeline, not a mock.** Each case goes through the same query expansion, the same vector search against the live index, the same system prompt as production. If it were mocked, it would pass forever while production rotted. The expansion prompt in the harness is copied verbatim from the route for exactly this reason, and that duplication is deliberate: I would rather have two copies that a test compares than one abstraction that hides a difference. That intent was better than my execution, and I only found out later. See below. **The judge grades against retrieved context, not against the expected-facts list.** This sounds like a detail and it is the difference between a useful gate and an annoying one. If you judge fabrication by comparing the answer to a short list of expected facts, every true statement that happens not to be on the list reads as a hallucination. So the judge sees the actual chunks the actor was given and is told, explicitly, that anything supported by that context is grounded even when it goes beyond what the case expected. The judge is sampled several times per case with the median score taken, because a single sample from a reasoning model is not a stable measurement. Scores roll up per category against thresholds in a config file, and the run exits non-zero if any category misses. That exit code is the gate. ## Where this is wrong I would rather write this part than pretend the setup is finished. For a long stretch the gate passed every case at a perfect score. Fifty-seven out of fifty-seven, average exactly 1.00, in all three categories including the adversarial one. I assumed that was a judge problem introduced when I swapped models, so I checked the previous run under the previous judge. Same result. Both judges scored everything perfectly. A gate that has never failed is not evidence that the system is good. It is weak evidence either way, and the thresholds at 0.85 and 0.95 cannot fire when every score is 1.00. So I wrote, in an earlier draft of this piece, that the gate was measuring nothing. Then it failed one, and the failure was more interesting than the streak. A factual case about my Shopify work came back at 0.75, marked down for not being concise. The answer was correct and grounded, but it contained this: ``` ... expanded to other major partners. to=link_work_entry code彩票登录: {"slug":"shopify"}Lucien worked at Shopify from January 2022 ... ``` That is the model's internal tool-routing syntax, emitted as visible prose, followed by a corrupted token and then the whole answer a second time. The cause is the harness, not the assistant. Production passes three tool definitions to the model. The eval actor passes none. Both share the same system prompt, and that prompt tells the model to call one of those tools. Instructed to use a tool it had not been given, the model wrote the call out as text instead. So the claim I made above, that the actor runs the real pipeline rather than a mock, was true of retrieval and the prompt and false at the tool boundary, which is the one seam I had not thought to check. The gate did discriminate. It just took a run where the model happened to reach for a tool, because whether it does varies between runs even at temperature zero with a fixed seed, since reasoning models ignore both. Two lessons, and the second one is the one I would keep. A gate that never fails deserves suspicion rather than confidence. And when it finally fires, the first question is not "how do I make this pass" but "which of my assumptions did this just falsify" — because in this case the answer was an assumption sitting in the paragraph above, in an article I had already written. ## What I would keep If I rebuilt this tomorrow, four things carry over. One source of content, because two sources of truth is a bug with a delay on it. Evals that exercise the real retrieval path, because the mocked version tests nothing that can break. A judge that scores against what the model was actually given, because grading against a wishlist punishes correct answers. And one source for anything the harness claims to share with production, tools included, because "the same as prod" is a claim that rots quietly until something forces you to check it. The rest is plumbing, and the plumbing was never the hard part. ## Resume (https://www.luciengeorge.com/resume) **Lucien George** - Senior Product Engineer · London, UK lucienkgeorge@gmail.com · +44 7 845 714513 GitHub: https://github.com/luciengeorge · LinkedIn: https://linkedin.com/in/luciengeorge · Website: https://www.luciengeorge.com ## Education - **Families in Business** - Harvard Business School, Boston (2022). - **Full-stack Web Development** - Le Wagon, London, UK (2018). Batch #190. 9-week intensive full-stack bootcamp. - **Exchange Semester** - UNSW, Sydney, Australia (2017). - **BEng. Software Engineering** - McGill University, Montreal, Canada (2013 - 2018). ## Skills Programming: TypeScript, JavaScript, React, React Router, Next.js, React Native, Ruby on Rails, Python, FastAPI, SQL, Kotlin, Swift Spoken languages: French, English, Arabic ## Experience ### Fyxer (https://www.fyxer.com) **Senior Product Engineer** · Full-time · 2025-09 - Present - Founded Fyxer's desktop notetaker, zero to one: a native macOS and Windows meeting recorder that needs no bot. Now ~35,000 recordings a month from ~2,000 MAU. - Turned two prototypes into Fyxer's production agentic chat over meetings and email, now reaching 5,000 to 8,000 senders a month; owns ~85% of that codebase. - Reversed an internal decision to kill the product with a multi-week analysis, then shipped the roadmap: capture rate 33% to ~55%, week-8 retention 3% to ~34%. - On the enterprise pod since Apr 2026: SCIM to RFC 7644 (Entra validator 0 to 21/21), Microsoft Marketplace billing end to end, and the enterprise analytics dashboard. ### Localista **Co-Founder & CTO** · Full-time · 2024-04 - 2025-07 - Architected and built a B2B event marketing platform end to end on TypeScript, Remix, and Redis: guest lists, campaigns, live event tools, post-event analytics. - Led two engineers, and called the pivot with the investors once the event market proved unwilling to adopt new tooling. ### Skyla **Co-Founder** · Full-time · 2023-09 - 2024-04 - Led an AI support chatbot for Shopify stores in the first months of the OpenAI API: one-click install, then API and scraping to auto-build each store's knowledge base. ### Shopify (https://www.shopify.com) **Senior Developer** · Full-time · 2023-05 - 2023-09 - Led Shopify's native checkout SDK for iOS and Android: partner checkout code down 75%, conversion up over 15%, load times down 90%. Shipped first to Meta-powered apps. **Developer** · Full-time · 2022-01 - 2023-05 - Built the marketplaces API in Shopify core, putting Shopify Checkout in the hands of marketplace partners. ### Impact Lebanon (https://impactlebanon.org) **Co-Founder** · Self-employed · 2019-10 - 2026-04 - Built the online presence for a Lebanese diaspora non-profit whose fundraiser after the 2020 Beirut explosion went from a $15,000 goal to $8.3M in under 48 hours. ### Le Wagon (https://www.lewagon.com) **Engineering Manager** · Full-time · 2021-07 - 2021-12 - Technical lead on the B2B platform and office app; grew and managed the London dev team. **Lead Teacher and Software Engineer** · Full-time · 2019-05 - 2021-07 - Taught hundreds of students across 9-week web and data science bootcamps; ran the teaching team. ### Hoxton Digital **Ruby on Rails Developer** · Freelance · 2018-12 - 2019-04