# 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, leading development of the notetaker 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 currently works at Fyxer as a Senior Product Engineer since September 2025. He leads development of the notetaker product alongside another developer named Serafin - a two-person team that operates like the CEOs of this feature within the larger Fyxer product. The notetaker is a native macOS and Windows desktop application (built with Electron) designed to record meetings in the background without requiring a notetaker bot to join the meeting. This was built after 48% of users expressed the desire to record meetings without a bot presence. 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. He also built Fyxer's AI-powered meeting chat interface - a data-heavy, real-time UI that lets users query and extract structured information from their meetings like decisions, action items, and summaries. The notetaker app grew to 1,000 weekly active users and nearly 10,000 call recordings within months of launch. ### 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** - Fullstack Developer · 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 coding bootcamp covering HTML, CSS, Bootstrap, JavaScript ES2015, SQL, Git, GitHub, Heroku, Ruby on Rails, React, and Redux. - **Exchange Semester** - UNSW, Sydney, Australia (2017). Exchange semester at the University of New South Wales. - **BEng. Software Engineering** - McGill University, Montreal, Canada (2013 - 2018). Bachelor of Engineering in Software Engineering. ## Skills Programming: TypeScript, JavaScript, React, React Router, Remix, Next.js, React Native, Ruby on Rails, Python, FastAPI, SQL, HTML, CSS, Java, Kotlin, Swift Spoken languages: French, English, Arabic ## Experience ### Fyxer (https://www.fyxer.com) **Senior Product Engineer** · Full-time · 2025-09 - Present - Senior product engineer in the notetaker team. Leading the development of the notetaker app. ### Localista **Co-Founder & CTO** · Full-time · 2024-04 - 2025-07 - Co-Founder and CTO at Localista. ### Skyla **Co-Founder** · Full-time · 2023-09 - 2024-04 - Co-Founder at Skyla. ### Shopify (https://www.shopify.com) **Senior Developer** · Full-time · 2023-05 - 2023-09 - Worked in parallel on the Shopify Checkout, an SDK for marketplaces on both iOS and Android, and on the Shopify core application. **Developer** · Full-time · 2022-01 - 2023-05 - Worked on an API for marketplaces in the core Shopify application. ### Impact Lebanon (https://impactlebanon.org) **Co-Founder** · Self-employed · 2019-10 - 2026-04 - Responsible for building our online presence by creating our two websites. ### Le Wagon (https://www.lewagon.com) **Engineering Manager** · Full-time · 2021-07 - 2021-12 - Technical lead of the B2B platform and office management app. - Responsible for the growth of the London dev team. **Lead Teacher and Software Engineer** · Full-time · 2019-05 - 2021-07 - Worked on the company's internal platforms. - Gave several lectures that are part of our 9-week long web development and data science bootcamps. - Managed the teaching team. **Teaching Assistant** · Freelance · 2019-01 - 2019-04 - Teaching assistant at Le Wagon for their full-time and part-time bootcamps. ### Hoxton Digital **Ruby on Rails Developer** · Freelance · 2018-12 - 2019-04 - Worked on the company's main website and their clients' websites.