41554 blogs · [ { "id": "01a0821a-c533-73dd-8f01-285063565a84", "title": "The Joy of Watching AI Agents Work: Sports Commentary for Code", "url": "https://blog.laurentcharignon.com/post/2025-12-28-watching-ai-agents-work/", "published_at": "2025-12-28T00:00:00+00:00" }, { "id": "01a0821a-c533-73dd-8f01-285063bbcd08", "title": "Truc: A Todo App That Forgets", "url": "https://blog.laurentcharignon.com/post/2025-12-28-truc-todo-app/", "published_at": "2025-12-28T00:00:00+00:00" }, { "id": "01a0821a-c533-73dd-8f01-2850644e2fec", "title": "BuildLLMPrompt: A Prompt Builder for AI Coding Assistants", "url": "https://blog.laurentcharignon.com/post/2025-12-16-buildllmprompt-prompt-builder-for-ai-coding/", "published_at": "2025-12-16T00:00:00+00:00" }, { "id": "01a0821a-c533-73dd-8f01-285064ba785a", "title": "A Retro Airport Flight Tracker for My Desktop", "url": "https://blog.laurentcharignon.com/post/2025-12-14-flight-tracker-widget/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c533-73dd-8f01-285065980000", "title": "Apple Shortcuts As Code", "url": "https://blog.laurentcharignon.com/post/2025-12-14-cherri-programming-apple-shortcuts/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07631e2b61", "title": "Building a Tinder-Style Email Triage UI with Hammerspoon", "url": "https://blog.laurentcharignon.com/post/2025-12-14-email-triage-hammerspoon/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0763227829", "title": "Demystifying Agentic Workflows: It's Just a Loop", "url": "https://blog.laurentcharignon.com/post/2025-12-14-demystifying-agentic-workflows/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0763b034a0", "title": "Host Your Own Blog for Free with Hugo and Cloudflare Pages", "url": "https://blog.laurentcharignon.com/post/2025-12-14-host-your-own-blog-hugo-cloudflare/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07640f0ce1", "title": "How I Deploy Apps to My Homelab (A Love Story in 9 Acts)", "url": "https://blog.laurentcharignon.com/post/2025-12-14-homelab-deployment-flow/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0764fab637", "title": "lan-ca: Local HTTPS in 300 Lines of Go", "url": "https://blog.laurentcharignon.com/post/2025-12-14-lan-ca-local-https/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07654d6f4e", "title": "LLM Proxy: A Unified AI Gateway Running on My Mac Studio", "url": "https://blog.laurentcharignon.com/post/2025-12-14-llm-proxy-unified-ai-gateway/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076594e4f9", "title": "My Hammerspoon Screenshot Manager: From Chaos to AI-Powered Organization", "url": "https://blog.laurentcharignon.com/post/2025-12-14-hammerspoon-screenshot-manager/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07660468cb", "title": "NVR Proxy: Turning Security Cameras into Prometheus Metrics with Scheduled LLM Analysis", "url": "https://blog.laurentcharignon.com/post/2025-12-14-nvr-proxy-scheduled-llm-to-prometheus/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0766f1d01d", "title": "Trip Packing Wizard: An Open Source AI Packing List Generator", "url": "https://blog.laurentcharignon.com/post/2025-12-14-trip-packing-wizard-open-source/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07674d1a99", "title": "Princess Memory: Vibe Coding a Family Game from the Couch", "url": "https://blog.laurentcharignon.com/post/2025-12-13-princess-memory-vibe-coding/", "published_at": "2025-12-13T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076751f39e", "title": "Your Body Is Basically an API: A Late-Night Chat About Consciousness", "url": "https://blog.laurentcharignon.com/post/2025-12-13-consciousness-mortality-and-tool-calls/", "published_at": "2025-12-13T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076823a08f", "title": "LLM Instructions Block Editor: Drag-and-Drop Context Management", "url": "https://blog.laurentcharignon.com/post/2025-11-30-llm-instructions-block-editor/", "published_at": "2025-11-30T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0768edfa2c", "title": "Prompt Tracker: Turn Your Coding Sessions into a Star Wars Opening Crawl", "url": "https://blog.laurentcharignon.com/post/2025-10-02-prompt-tracker-visualize-claude-conversations/", "published_at": "2025-10-02T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0768f5f09d", "title": "Building with LLMs at Scale: Part 1 - The Pain Points", "url": "https://blog.laurentcharignon.com/post/2025-09-30-llm-workflow-part1-pain-points/", "published_at": "2025-09-30T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076944deb7", "title": "Building with LLMs at Scale: Part 2 - Ergonomics and Observability", "url": "https://blog.laurentcharignon.com/post/2025-09-30-llm-workflow-part2-ergonomics/", "published_at": "2025-09-30T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076a2a1551", "title": "Building with LLMs at Scale: Part 3 - Higher-Level Abstractions", "url": "https://blog.laurentcharignon.com/post/2025-09-30-llm-workflow-part3-abstractions/", "published_at": "2025-09-30T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076b1c0af7", "title": "Building with LLMs at Scale: Part 4 - Experiments and Works-in-Progress", "url": "https://blog.laurentcharignon.com/post/2025-09-30-llm-workflow-part4-experiments/", "published_at": "2025-09-30T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076b9517e5", "title": "Building with LLMs at Scale: Part 5 - Learning and Knowledge Accumulation", "url": "https://blog.laurentcharignon.com/post/2025-09-30-llm-workflow-part5-learning/", "published_at": "2025-09-30T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076bbc0586", "title": "Memento: Building Long-Term Memory for LLM Coding Assistants", "url": "https://blog.laurentcharignon.com/post/2025-09-30-memento-llm-memory-system/", "published_at": "2025-09-30T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076cb285fc", "title": "Building a Smart Home with AppDaemon: From Baby Monitors to Language Learning", "url": "https://blog.laurentcharignon.com/post/2025-01-19-smart-home-automation-appdaemon/", "published_at": "2025-01-19T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076d90df1f", "title": "Using deep learning to predict my budget categories", "url": "https://blog.laurentcharignon.com/post/deep-learning-budget-data/", "published_at": "2022-10-04T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076e8024b1", "title": "How to automate everything", "url": "https://blog.laurentcharignon.com/post/how-to-automate-everything/", "published_at": "2022-09-12T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076ecf37f0", "title": "My favorite quotes", "url": "https://blog.laurentcharignon.com/post/favorite-quotes/", "published_at": "2022-03-06T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076f8234bd", "title": "How I use org-roam as a second brain", "url": "https://blog.laurentcharignon.com/post/org-roam/", "published_at": "2022-02-25T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c076fb7f128", "title": "Learnings from working as a SWE in the US", "url": "https://blog.laurentcharignon.com/post/career-learning/", "published_at": "2022-02-24T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07707de221", "title": "Data-Oriented Programming", "url": "https://blog.laurentcharignon.com/post/data-oriented-programming/", "published_at": "2022-02-22T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0770e8d074", "title": "Using a formula to compute tasks duration in org-mode tables", "url": "https://blog.laurentcharignon.com/post/duration-org-mode-table-formula/", "published_at": "2022-02-21T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07715ad1ad", "title": "What do meditation and touch typing have in common?", "url": "https://blog.laurentcharignon.com/post/meditation-touch-typing/", "published_at": "2022-02-20T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0772187557", "title": "Generating a word cloud from an Emacs buffer", "url": "https://blog.laurentcharignon.com/post/word-cloud-generation/", "published_at": "2022-02-18T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07730091d0", "title": "Highlighting the current date in org-mode buffers", "url": "https://blog.laurentcharignon.com/post/org-mode-highlight-date/", "published_at": "2022-02-17T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07735f84f3", "title": "Syncing org-mode with Microsoft Todo", "url": "https://blog.laurentcharignon.com/post/creating-microsoft-todos-from-org/", "published_at": "2022-02-16T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0773d7269e", "title": "Making the best use of my iPhone Pictures", "url": "https://blog.laurentcharignon.com/post/inserting-images-into-org/", "published_at": "2022-02-11T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0773eced77", "title": "Interview Prep Cheat Sheet", "url": "https://blog.laurentcharignon.com/post/interview-prep-cheat-sheet/", "published_at": "2021-10-20T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07746b5667", "title": "On salary negotiations and talking to tech recruiters", "url": "https://blog.laurentcharignon.com/post/negotiating/", "published_at": "2021-02-13T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0775212cad", "title": "Making a heat map of Apple Watch workouts", "url": "https://blog.laurentcharignon.com/post/heat-map-apple-watch/", "published_at": "2020-03-14T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07757866f8", "title": "Completing PDFs with Clojure", "url": "https://blog.laurentcharignon.com/post/completing-pdfs-with-clojure/", "published_at": "2020-02-22T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0776652426", "title": "Universal code coverage renderer in Emacs", "url": "https://blog.laurentcharignon.com/post/universal-code-coverage/", "published_at": "2020-02-16T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0776a3765f", "title": "Labeling wedding pictures with Emacs", "url": "https://blog.laurentcharignon.com/post/labelling-wedding-pictures/", "published_at": "2020-02-12T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0776aa276e", "title": "financier: modeling compensation packages with Python", "url": "https://blog.laurentcharignon.com/post/financier-modeling-compensation-python/", "published_at": "2019-02-21T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0776de904e", "title": "GitHub code review with Emacs", "url": "https://blog.laurentcharignon.com/post/code-review-in-emacs/", "published_at": "2019-02-19T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0776e99156", "title": "A Mail Merge in 100 lines of Clojurescript", "url": "https://blog.laurentcharignon.com/post/mail-merge-in-100-lines-of-clojure/", "published_at": "2018-12-20T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07770636ad", "title": "Manage Let's Encrypt certificates with Digital Ocean Spaces", "url": "https://blog.laurentcharignon.com/post/sync-certificates-letsencrypt/", "published_at": "2017-10-10T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0777db2700", "title": "Extracting Chrome Cookies with Clojure", "url": "https://blog.laurentcharignon.com/post/extracting-chrome-cookie-clojure/", "published_at": "2017-08-19T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c07788a56cc", "title": "Automate your laptop setup with Ansible", "url": "https://blog.laurentcharignon.com/post/laptop-setup-with-ansible/", "published_at": "2017-07-24T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0778a0e0f2", "title": "Set up digital ocean block storage with Ansible", "url": "https://blog.laurentcharignon.com/post/set-up-digital-ocean-block-storage-with-ansible/", "published_at": "2017-07-23T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c0779968b74", "title": "Syncing org mode reminders to my bot", "url": "https://blog.laurentcharignon.com/post/sync-org-mode-reminders-to-bot/", "published_at": "2017-07-21T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c077a87f152", "title": "Managing my todos, notes, and reminders", "url": "https://blog.laurentcharignon.com/post/manage-reminders-with-emacs-and-facebook-bot/", "published_at": "2017-07-18T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c077abd35c9", "title": "Changeset Evolution", "url": "https://blog.laurentcharignon.com/post/2016-02-02-changeset-evolution/", "published_at": "2016-02-02T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c077ae6534f", "title": "A Test Automation Story", "url": "https://blog.laurentcharignon.com/post/2016-01-20-reliable-automation-example/", "published_at": "2016-01-20T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c077b277e9c", "title": "Introduction to Mechanize with Python", "url": "https://blog.laurentcharignon.com/post/2016-01-09-web-browsing-automation/", "published_at": "2016-01-09T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c077bb50a6e", "title": "Add Colors To Your Python Logs With Colorlog", "url": "https://blog.laurentcharignon.com/post/2015-08-10-add-colors-to-your-python-logs-with-colorlog/", "published_at": "2015-08-10T00:00:00+00:00" }, { "id": "01a0821a-c534-7133-9854-1c077bdbc0fe", "title": "Practical one time padding with Node JS", "url": "https://blog.laurentcharignon.com/post/2014-12-10-one-time-pad-node-js/", "published_at": "2014-12-10T00:00:00+00:00" } ] posts Claim your blog
Back to Laurent Charignon
Blog · corpus.blog/blogs/blog.laurentcharignon.com/posts

Laurent Charignon

blog.laurentcharignon.com

2025

2022

2021

2020

2019

2018

2017

2016

2015

2014