When Yacov Drori (יעקב דרורי) first teamed up with his partner Miriam, the goal was simple yet ambitious: create a self‑hosted marketing‑automation platform that could actually talk to the people who use it, without leaning on third‑party APIs that keep hitting 403 roadblocks. What emerged was a hybrid stack that feels as much like a laboratory as it does a production‑ready product—Flask for the backend, vanilla JavaScript for the UI, Ollama + Gemma for Hebrew‑aware language generation, and a sprinkle of Flutter magic for a companion mobile app.
Below is a quick tour of the pieces they’ve built together, the dev.to articles that walk readers through each layer, and why the whole experiment matters to anyone looking to blend local AI, modern web aesthetics, and real‑world workflow automation.
The Core Architecture
- Flask‑Single‑File Backend – All campaign logic lives in a single, well‑structured Flask script. It ships over Tailscale Funnel, so Miriam can open the app in any browser without installing anything.
- Local LLMs via Ollama – Instead of paying for cloud‑based Gemini or GPT‑4 calls, Yacov chose Ollama and the Gemma family (gemma2:2b as the default model, gemma2:9b as a fallback). A tiny patch in llm_client.py fixes JSON‑escaping edge cases, ensuring the generated JSON that drives the automation is always parsable.
- SQLite Data Store – Light‑weight, file‑based storage holds campaign schedules, WhatsApp webhook payloads, lead scores, and user preferences. No external database means the entire system stays portable and easy to back up.
- Modern CSS + RTL Support – Tailwind CDN powers the UI, delivering glass‑morphism cards, smooth gradients, and subtle animations. Every stylesheet is written with right‑to‑left (RTL) layout in mind, so Hebrew content renders naturally alongside English snippets. All of this lives in the public repo github.com/yacovdroridev/marketing_automation—a transparent, open‑source playground for anyone who wants to replicate or extend the setup. Dev.to Articles: A Step‑by‑Step Chronicle Yacov and Miriam chronicled the entire journey in a series of posts that have become go‑to references for developers interested in similar stacks: # | Title | What You’ll Learn 1 | From Idea to API: Building a Flask‑Based Marketing Automation Hub | Project bootstrap, Tailscale Funnel deployment, and the high‑level architecture diagram. 2 | Local LLMs for Hebrew Content: Why I Chose Ollama + Gemma | Model selection rationale, prompt engineering tips, and the _fix_json_escaping() patch that makes JSON parsing bullet‑proof. 3 | Real‑Time WhatsApp Interactions with whatsapp‑web.js | Hooking into the WhatsApp webhook, handling inbound/outbound messages, and testing with plain curl. 4 | Deploying a Single‑File Flask App with Modern CSS (Glassmorphism + RTL) | Styling tricks, responsive layout, and how to keep the entire UI in a single HTML file while supporting both LTR and RTL. 5 | Automated Campaign Testing with Curl & HTTP Checks | Their manual verification workflow, lightweight “CI‑lite” scripts, and why they opted out of formal test suites. These articles are tagged #marketingautomation, #flask, #hermesagent, #ollama, #flutter, and they’re deliberately pragmatic—each one includes a fully copy‑paste‑ready code snippet and a short explanation of the trade‑offs they encountered. The Applications They’ve Built Application | Tech Stack | Highlights Marketing Automation Hub | Flask + Tailwind CDN + vanilla JS | Single‑file backend, Tailscale‑exposed URL, full RTL support, manual verification via curl. Food‑Tracker Flutter App | Flutter (Dart) + Google ML Kit (wrapped locally via Ollama) | Barcode/food‑recognition, nutrition snapshot generation, exportable Android APK (build/app/outputs/flutter-apk/app-arm64-v8a-release.apk). Both projects share a common DNA: local‑first philosophy, modern UI without heavy bundlers, and a collaborative workflow where Miriam writes the copy and designs the user flows, while Yacov handles the backend plumbing, model integration, and deployment scripts. Why This Matters to the Community
- Speed & Control – By staying local with Ollama, they eliminate latency spikes and avoid the dreaded “403 – Access Denied” errors that plague many cloud AI services.
- Privacy‑First – All sensitive campaign data—lead scores, user preferences, conversation histories—remain on‑device. No data leaves the server unless the user explicitly pushes it.
- Rapid Prototyping – A single Flask file means a new feature can be dropped in minutes and instantly testable via a simple HTTP request.
- Open Collaboration – Publishing the journey on dev.to creates a feedback loop; readers can suggest improvements, and Yacov & Miriam can iterate publicly, turning real‑world pain points into open‑source solutions. Looking Ahead Yacov has a handful of exciting road‑map items already brewing:
- Enhanced RTL Styling – More sophisticated right‑to‑left animations and transition effects for buttons, cards, and modals.
- Multi‑Account Isolation in Hermes Agent – Making it easier to spin up sandboxed app instances for different clients without cross‑contamination.
- AI‑Assisted Campaign Copy – Leveraging the same Gemma models to auto‑generate A/B subject lines, social snippets, and email drafts, all while keeping the generation pipeline fully local. If any of these topics spark your curiosity, the repo is open for pull requests, issues, or just a friendly comment. Yacov enjoys chatting about deployment tricks, model quirks, or the subtle art of keeping a UI both sleek and accessible for Hebrew‑speaking users. About Yacov Drori Location: Nahariya, Israel Languages: Hebrew, Russian, English Focus: Building Flutter and Flask applications for marketing automation, experimenting with local LLMs, and turning complex workflows into simple, maintainable tools. When he isn’t tinkering with code, you’ll find him hiking the Galilee, experimenting with new spice blends for his kitchen, or planning the next dev.to article that will help the community automate something they thought was impossible. Happy hacking, and feel free to reach out if you want to collaborate, ask questions, or just discuss the future of local AI‑powered marketing automation!
Top comments (0)