# Jamie Ede > Jamie Ede - Technical Trainer, Engineer, Developer I've spent my career at the intersection of complex technical systems and the humans who have to use them: training teams at Cloudflare, building data platform knowledge at Snowflake, and going deep on distributed databases at DataStax. I write here about what I'm learning, building, and figuring out, including tools I've shipped along the way, like a [document analyzer](/analyzer) built on Cloudflare Workers AI. ## Posts - [AI-assisted captions, alt text, and tags with Workers AI vision models](https://jamieede.com/posts/ai-assisted-captions-alt-text-and-tags/): Writing alt text for every photograph is the boring half of running a photography site. A vision model can take the first pass. This is the final post in the … - [Stripping EXIF before upload and backfilling the photos already in the bucket](https://jamieede.com/posts/stripping-exif-before-upload-and-backfilling-existing-photos/): A holiday photo can leak GPS, the camera’s serial number, the software it was edited with, and the exact timestamp of when you were not home. Cloudflare … - [Letting the browser POST straight to Cloudflare Images with Direct Creator Upload](https://jamieede.com/posts/direct-creator-upload-from-the-browser/): Multi-megabyte image uploads should not travel through a Pages Function on the way to storage. They do not have to. This is part of the photography portfolio … - [Hardened admin auth on Cloudflare Pages: JWT validation, AUD pinning, and pages.dev lockdown](https://jamieede.com/posts/hardened-admin-auth-cloudflare-pages/): Every admin request to the photography portfolio goes through three checks before it can touch a D1 row or a Cloudflare Images API call: the Cloudflare Access … - [Two sites, one codebase: multi-tenant Cloudflare Pages with separate D1s](https://jamieede.com/posts/two-sites-one-codebase-cloudflare-pages/): Deploying two completely separate sites from one repo on Cloudflare Pages, with shared tooling and independent builds for each domain. - [Cloudflare Images with flexible delivery and retina srcSet](https://jamieede.com/posts/cloudflare-images-flexible-delivery-and-retina-srcset/): Using Cloudflare Images flexible delivery to serve every size from one source, and writing responsive retina srcset that builds itself from widths. - [Building a photography portfolio on Cloudflare's full stack](https://jamieede.com/posts/building-a-photography-portfolio-on-cloudflares-full-stack/): Two photography portfolios on one codebase, built on Cloudflare Images, Pages and Workers: self-hosted photo hosting I actually control. - [Automated link checking on a Hugo site with Lychee and Gitea Actions](https://jamieede.com/posts/automated-link-checking-on-a-hugo-site-with-lychee-and-gitea-actions/): Catching broken links on a static Hugo site automatically with Lychee and Gitea Actions, so 404s get flagged in CI before readers ever hit them. - [Ask the Honda Monkey Z125 service manual](https://jamieede.com/posts/ask-the-honda-monkey-z125-service-manual/): Building a RAG assistant over the Honda Monkey Z125 service manual, so you can ask the workshop manual maintenance questions in plain English. - [Page views, three years later: eventual consistency with edge analytics](https://jamieede.com/posts/pageviews-eventual-consistency-edge-reconcile/): Three years on from a Cloudflare Workers and KV page-view counter: what eventual consistency and edge analytics actually look like at scale. - [Hyper-Converged Database 2.0 lands in my DataStax docs agent — plus 500+ refreshed pages](https://jamieede.com/posts/hcd-2-lands-datastax-docs-agent-refresh/): When DataStax shipped Hyper-Converged Database 2.0, my docs agent answered HCD questions the same afternoon, with 501 new pages ingested by a full recheck. - [Ask the Honda VFR750F service manual](https://jamieede.com/posts/ask-the-honda-vfr750f-service-manual/): Building a RAG assistant over the Honda VFR750F service manual, so you can ask the gear-driven-cam V4's workshop manual questions in plain English. - [The local OCR that scored best, and let the chatbot show the diagrams](https://jamieede.com/posts/docling-rapidocr-inline-figures-service-manual-rag/): In the last post I built a strict exact-match test for the OCR behind a 1994 Yamaha XV250 Virago manual chatbot and scored four local pipelines against 100 … - [Adding source citations to Astra Docs Chat](https://jamieede.com/posts/adding-source-citations-astra-docs-chat/): When I shipped Astra Docs Chat , I was honest about what it could not do. Top of that list: source citations with links back to the doc pages. An answer you … - [Nahimic wouldn't initialize and its own fix link was down — the Internet Archive saved me](https://jamieede.com/posts/nahimic-would-not-initialize-and-its-own-fix-link-was-down/): I hit a properly circular bit of frustration this week. The Nahimic audio software my motherboard manufacturer ships downloaded and installed fine, but the app … - [Measuring OCR accuracy for a 1994 service manual RAG](https://jamieede.com/posts/measuring-ocr-accuracy-1994-service-manual-rag/): A torque figure with a missing digit is not a typo. It is a mechanic over-tightening a brake bolt. When you turn a scanned service manual into a RAG chatbot, … - [A Claude Code skill for driving TrueNAS SCALE over WebSocket](https://jamieede.com/posts/a-claude-code-skill-for-driving-truenas-scale-over-websocket/): How I built a Claude Code skill that drives TrueNAS SCALE over its WebSocket API, turning homelab NAS management into plain-language commands. - [Deploying a Hugo site on Gitea to Cloudflare Pages with Gitea Actions](https://jamieede.com/posts/deploying-a-hugo-site-on-gitea-to-cloudflare-pages-with-gitea-actions/): Introduction ¶ A while back I wrote a post on deploying a Hugo site from Gitea to Cloudflare Pages using a Gitea push mirror to GitHub, because at the time … - [Rebuilding the document analyzer on Cloudflare's full stack](https://jamieede.com/posts/rebuilding-the-document-analyzer-on-cloudflares-full-stack/): Rebuilding my Ollama-based document analyzer entirely on Cloudflare's full stack, moving local LLM work to Workers, Workers AI and the edge. - [Self-hosting Langflow behind a public static site](https://jamieede.com/posts/self-hosting-langflow-behind-static-site/): Astra Docs Chat is public on Cloudflare Pages. Langflow runs on a private instance: reachable from the Pages Function proxy, not from browsers directly. This … - [Swapping DeepSeek in for OpenAI chat in a Langflow RAG flow](https://jamieede.com/posts/deepseek-instead-of-openai-chat-langflow-rag/): The Langflow DataStax RAG template ships with an OpenAI chat node. For Astra Docs Chat , I replaced it with DeepSeek for streaming answers: cheaper at volume, … - [Using Astra DB as the vector store for a DataStax docs RAG chat](https://jamieede.com/posts/astra-db-vector-store-datastax-docs-rag/): For Astra Docs Chat , the subject matter is Astra DB Serverless: using Astra as the vector store was the natural fit, and Langflow’s DataStax bundle … - [Chunking and embedding technical documentation for RAG](https://jamieede.com/posts/chunking-embedding-technical-docs-rag/): “271 pages” is not “271 vectors.” Split settings and embedding model choice determine whether Astra Docs Chat retrieves the right … - [Re-ingesting a RAG doc corpus when upstream docs change](https://jamieede.com/posts/re-ingesting-rag-doc-corpus-when-docs-change/): Update (June 2026): the corpus has since moved to an agentic hybrid setup on Astra DB , with a differential recheck and content-checksum sync that fixes the … - [Building a streaming chat UI in Hugo without React or an iframe](https://jamieede.com/posts/streaming-chat-ui-hugo-without-react/): Langflow ships an embed widget. For Astra Docs Chat I wanted a full page that matches the rest of jamieede.com: same header, same typography, no iframe chrome. … - [Docs-only guardrails when RAG retrieval finds nothing](https://jamieede.com/posts/docs-only-guardrails-empty-rag-retrieval/): When Astra Docs Chat cannot find relevant chunks in Astra DB, the model may still answer from general knowledge: confident, plausible, and sometimes wrong for … - [Langflow RAG over Astra DB: ingest and chat flows](https://jamieede.com/posts/langflow-rag-astra-db-ingest-and-chat-flows/): The overview of Astra Docs Chat names Langflow once and moves on: ingest graph, chat graph, done. This post opens the hood: component chains, two published … - [Batch-ingesting hundreds of markdown files through Langflow](https://jamieede.com/posts/batch-ingest-markdown-langflow-api/): Astra Docs Chat only works if the documentation already lives in a vector store. The parent post summarised that as a one-time batch job: export markdown, run … - [Proxying Langflow from Cloudflare Pages Functions](https://jamieede.com/posts/proxying-langflow-cloudflare-pages-functions/): When I built Astra Docs Chat , the overview post described the stack in one paragraph: Hugo page on the front, Langflow and Astra DB behind it. The piece that … - [Building IBM DataStax Astra Docs Chat: asking DataStax docs questions in plain English](https://jamieede.com/posts/building-astra-docs-chat-rag-over-datastax-on-langflow-and-cloudflare-pages/): Building a RAG chatbot over the DataStax Astra DB docs with Langflow and Cloudflare Pages, so you can ask the documentation questions in plain English. - [Building a web terminal in 2023 before AI was how we shipped side projects](https://jamieede.com/posts/building-a-web-terminal-in-2023-before-ai-was-how-we-shipped-side-projects/): Building an interactive web terminal back in 2023, before AI assistants changed how we ship side projects, and what that approach looked like. - [Securing a Public Gitea Server: Config Changes and Cleaning Up With psql](https://jamieede.com/posts/secure-public-gitea-server---config-and-cleanup/): Securing a Public Gitea Server: Config and Cleanup With psql ¶ If your Gitea instance is reachable on the internet, it can attract unwanted signups and … - [Kid using ChatGPT to make battle royale game](https://jamieede.com/posts/kid-using-chatgpt-to-make-basic-games/): Introduction ¶ Creating a game can be a fulfilling, frustration experience. I want to share the journey of my child building a 2D Battle Royale game The … - [The challenges of AI applications](https://jamieede.com/posts/challenges-of-ai-applications/): The common challenges you hit when building AI applications, from hallucination and context limits to evaluation and cost, and ways to handle them. - [Building a Self-Hosted Document Analyzer Using Ollama, Llama2, and Cloudflare Workers](https://jamieede.com/posts/ai-ollama-document-analysis/): Building a self-hosted document analyzer with Ollama, Llama2 and Cloudflare Workers, running local LLM inference on a homelab NAS. - [Truenas Scale - Allow multiple apps to use a single GPU](https://jamieede.com/posts/truenas-scale-multiple-gpu-assignment/): Introduction and issue ¶ Truenas Scale is a great solution to having your own at-home home-lab, NAS with plugins, apps and VMs. It is solid for basic NAS … - [Truenas Scale - Add more apps via Community Repository](https://jamieede.com/posts/truenas-scale-add-more-apps-via-repository/): Introduction ¶ As I write this, by default, Truenas Scale has 24 apps installable: Some notable apps are: Collabora Diskover Data Elastic Search Emby … - [Using Cloudflare Workers for page views modal on Hugo website](https://jamieede.com/posts/cloudflare-workers-pageviews/): Update (June 2026): this counter has been rebuilt. The client-side beacon below was catching only ~15% of real page loads (ad blockers, no-JS, the non-atomic … - [Implementing a static search for Hugo website](https://jamieede.com/posts/pagefind-search-for-hugo/): Adding fast, fully client-side search to a static Hugo site on Cloudflare Pages with Pagefind: no server and no external search service required. - [New Bing - GPT, difference in conversation styles](https://jamieede.com/posts/new-bing---conversation-styles/): Introduction ¶ So, the new AI-powered Bing has conversation styles you can choose from. In this post we are going to briefly look at the different outputs … - [Saving money with Bing](https://jamieede.com/posts/saving-money-with-bing/): Introduction ¶ The new Bing is here. Using this is better than using Google … Yes, Bing is better than Google in many scenarios. In this post, I … - [Deploying a Hugo site on Gitea to Cloudflare Pages](https://jamieede.com/posts/deploying-a-hugo-site-on-gitea-to-cloudflare-pages/): Update (2026-05-27): This post documents an older workaround that mirrored Gitea to a private GitHub repo because, at the time, Cloudflare Pages only supported … - [OpenWrt on Raspberry Pi 4](https://jamieede.com/posts/openwrt-on-raspberry-pi-4/): Introduction ¶ So, you have an internet connection. You are using [insert-brand-name-here] router. You want more control over your network and/or you are … - [Exploring the Fascinating World of Image Generation with OpenAI](https://jamieede.com/posts/exploring-the-fascinating-world-of-image-generation-with-openai/): OpenAI is a leading research organization in the field of artificial intelligence that has made significant strides in the area of image generation. This … - [OpenAI - The AI that can](https://jamieede.com/posts/openai---the-ai-that-can/): Intro ¶ OpenAI is an artificial intelligence research laboratory consisting of the for-profit corporation OpenAI LP and its parent company, the non-profit … - [Nicehash review](https://jamieede.com/posts/nicehash-review/): Introduction ¶ I have 3 rigs at home. 1 x Nvidia 3080 FE (Founders Edition) 1 x Gigabyte Nvidia GeForce RTX™ 3080 GAMING OC 10G 1 x Gigabyte Nvidia GeForce … - [My SQM QoS Implementation (Bufferbloat fixing)](https://jamieede.com/posts/my-sqm-qos-implementation-bufferbloat-fixing/): Introduction ¶ This post is a more in-depth detail that links to these previous posts: Bufferbloat, what is this? Fixing Bufferbloat After reading up on … - [Fixing Bufferbloat](https://jamieede.com/posts/fixing-bufferbloat/): Introduction ¶ Read this short post regarding what Bufferbloat is and how it could affect your experience playing online games/video conferencing: … - [Bufferbloat, what is it](https://jamieede.com/posts/bufferbloat-what-is-it/): Introduction ¶ During the installation and configuration of OpenWrt, I came across a concept called Bufferbloat read on for an intro to what it is. … - [Hosting Hugo on Cloudflare Pages](https://jamieede.com/posts/hosting-hugo-on-cloudflare-pages/): My main website jamieede.com has had MANY iterations over the years. Like, probably 20+ in total. Find a new technology, use it, understand it, and deploy it. … ## Pages - [About](https://jamieede.com/about/) - [Projects](https://jamieede.com/projects/) - [Document Analyzer](https://jamieede.com/analyzer/) - [DataStax Docs Agent (beta)](https://jamieede.com/astra-agent/)