Skip to main content

Pipulate: Local First AI SEO Software

Project description

Pipulate: Local First AI SEO Software

Pipulate Free & Open Source SEO with & for LLMs

Your data. Your AI. Your machine. Your control.
No subscriptions, no vendor lock-in, no cloud costs.

๐Ÿš€ Quick Start for Impatient People

Want to skip the philosophy and just see what this does?

# 1. Install Nix (one-time setup)
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install

# 2. Close and reopen your terminal, then:
curl -L https://pipulate.com/install.sh | sh

# 3. Launch it
cd ~/pipulate && nix develop

What you get: A local web app at http://localhost:5001 with step-by-step workflows, integrated AI chat, and a JupyterLab instance at http://localhost:8888. No cloud required.

Success looks like: Two browser tabs auto-open showing the Pipulate interface and JupyterLab.

๐Ÿ’ก What Can You Actually Build?

Real examples of what people create with Pipulate:

๐Ÿ” SEO Workflows

  • Keyword Research Pipeline: Input seed keywords โ†’ AI expansion โ†’ competition analysis โ†’ export spreadsheet
  • Content Gap Analysis: Compare your site vs competitors โ†’ identify missing topics โ†’ prioritized content calendar
  • Technical SEO Audits: Crawl site โ†’ check Core Web Vitals โ†’ generate action items โ†’ track fixes

๐Ÿ“Š Data Processing Workflows

  • CSV Data Cleaning: Upload messy data โ†’ standardize formats โ†’ remove duplicates โ†’ validate results
  • API Data Collection: Connect to APIs โ†’ fetch data in batches โ†’ transform to consistent format โ†’ store locally
  • Report Generation: Combine multiple data sources โ†’ apply business rules โ†’ create branded reports

๐Ÿค– AI-Assisted Workflows

  • Content Creation Pipeline: Research topics โ†’ generate outlines โ†’ write drafts โ†’ optimize for SEO
  • Data Analysis Helper: Upload spreadsheet โ†’ AI suggests insights โ†’ create visualizations โ†’ export findings

Key advantage: Each workflow is a guided, step-by-step process that non-technical users can run repeatedly, while developers can customize the Python code behind each step.

Meet Chip O'Theseus

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—  Chip O'What?
โ•‘  ๐ŸŽญ PIPULATE: LOCAL-FIRST AI SEO SOFTWARE & DIGITAL WORKSHOP            โ•‘     ,       O
โ•‘  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ•‘     \\  .  O
โ•‘                                                                         โ•‘     |\\/| o
โ•‘  ๐Ÿ’ฌ Chip O'Theseus: "Welcome to your sovereign computing environment!"  โ•‘     / " '\
โ•‘                                                                         โ•‘    . .   .
โ•‘  ๐ŸŒŸ Where Python functions become HTML elements...                      โ•‘   /    ) |
โ•‘  ๐ŸŒŸ Where workflows preserve your creative process...                   โ•‘  '  _.'  |
โ•‘  ๐ŸŒŸ Where AI integrates locally and globally...                         โ•‘  '-'/    \
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

AI On Rails: Structured Workflows for Any AI

The Challenge with Agentic AI: Powerful but unpredictableโ€”you never know what you're gonna get.

The Pipulate Approach: Structured workflows that can leverage any AIโ€”local, cloud, or hybridโ€”while maintaining complete visibility and control.

Think of it as putting guardrails on AI assistance. Instead of asking an AI to "figure it out," domain experts create step-by-step workflows that guide AI through proven processes. The AI gets structure, you get predictable results.

Pipulate: Your AI Swiss Army Knife: Whether you prefer local privacy, cloud power, or hybrid approaches, Pipulate provides the framework. Use local models for sensitive work, cloud APIs for heavy lifting, or both in the same workflowโ€”your choice, your control.

      ๐Ÿค– AGENTIC MODE (Chaos)           ๐Ÿš‚ AI ON RAILS (Pipulate)
      โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•           โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

          ๐Ÿ’ฅ GOES OFF                      ๐Ÿ“Š LINEAR WORKFLOWS
          HALF-COCKED!                      BY DOMAIN EXPERTS
               โ”‚                                   โ”‚
               โ–ผ                                   โ–ผ
      โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
      โ•‘  ๐ŸŒช๏ธ WILLY NILLY ๐ŸŽฒ โ•‘            โ”‚  Step 1: Analyzeโ–ธ   โ”‚
      โ•‘                    โ•‘     VS     โ”‚  Step 2: Processโ–ธ   โ”‚
      โ•‘   Unpredictable    โ•‘            โ”‚  Step 3: Reportโ–ธ    โ”‚
      โ•‘      Results       โ•‘            โ”‚  Step 4: Exportโ–ธ    โ”‚
      โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚                                   โ”‚
               โ–ผ                                   โ–ผ
    โ˜๏ธ Trains Frontier Models        ๐Ÿ  Keeps Domain Expertise Local
  1. ๐Ÿ–ฅ๏ธ Runs locally like a desktop app using modern web technologies
  2. ๐Ÿ Simple linear workflow approach powered by HTMX for seamless interactivity
  3. ๐Ÿ““ Transforms Jupyter Notebooks into production-ready, step-by-step workflows
  4. ๐Ÿค– Integrated AI assistance using your own local models with complete privacy
  5. ๐Ÿ”ง Reproducible environments with Nix that work identically across all platforms
  6. ๐ŸŽฏ Perfect for SEO practitioners who want to turn technical expertise into guided, reusable workflows

What is Pipulate?

Pipulate is a local-first, single-tenant desktop app framework featuring AI-assisted, step-by-step workflows. Designed to feel like an Electron app, it uniquely runs a full, reproducible Linux environment within a project folder using Nix, ensuring consistency across macOS, Linux, and Windows (via WSL).

Desktop App Architecture: Electron vs Pipulate

        ๐Ÿ–ฅ๏ธ ELECTRON PATTERN                 ๐ŸŒ PIPULATE PATTERN
      โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•             โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚      ELECTRON APP       โ”‚        โ”‚     PIPULATE SETUP      โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค        โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”‚        โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
    โ”‚ โ”‚.exe โ”‚ โ”‚.dmg โ”‚ โ”‚.deb โ”‚ โ”‚        โ”‚ โ”‚     install.sh      โ”‚ โ”‚
    โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚        โ”‚ โ”‚ (Works on ALL OSes) โ”‚ โ”‚
    โ”‚   Per-OS Installers     โ”‚        โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚                                  โ”‚
                โ–ผ                                  โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  This is new.
    โ”‚   ๐Ÿ“ฑ Native Window      โ”‚        โ”‚ ๐Ÿ–ฅ๏ธ Terminal Console     โ”‚    ,       O
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚        โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚    \\  .  O
    โ”‚  โ”‚  Web Browser    โ”‚    โ”‚        โ”‚ โ”‚ nix develop         โ”‚ โ”‚    |\\/| o
    โ”‚  โ”‚  (Bundled)      โ”‚    โ”‚        โ”‚ โ”‚ Starting servers... โ”‚ โ”‚    / " '\
    โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚    โ”‚        โ”‚ โ”‚ โœ“ JupyterLab ready  โ”‚ โ”‚   . .   .
    โ”‚  โ”‚  โ”‚           โ”‚  โ”‚    โ”‚        โ”‚ โ”‚ โœ“ Pipulate ready    โ”‚ โ”‚  /    ) |
    โ”‚  โ”‚  โ”‚   HTML    โ”‚  โ”‚    โ”‚        โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ '  _.'  |
    โ”‚  โ”‚  โ”‚   CSS     โ”‚  โ”‚    โ”‚   +    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ '-'/    \
    โ”‚  โ”‚  โ”‚   JS      โ”‚  โ”‚    โ”‚                    โ”‚
    โ”‚  โ”‚  โ”‚           โ”‚  โ”‚    โ”‚                    โ–ผ
    โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚    โ”‚        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚        โ”‚ ๐ŸŒ Regular Browser      โ”‚
    โ”‚          โ”‚              โ”‚        โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
    โ”‚          โ–ผ              โ”‚        โ”‚ โ”‚ localhost:5001      โ”‚ โ”‚
    โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚        โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
    โ”‚ โ”‚   Node.js       โ”‚     โ”‚        โ”‚ โ”‚ โ”‚  Python/HTMX    โ”‚ โ”‚ โ”‚
    โ”‚ โ”‚   Runtime       โ”‚     โ”‚        โ”‚ โ”‚ โ”‚  Workflows      โ”‚ โ”‚ โ”‚
    โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚        โ”‚ โ”‚ โ”‚  Local AI       โ”‚ โ”‚ โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
                                       โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โœ… Feels like native app               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โŒ Multiple installers needed
โŒ Platform-specific builds             โœ… Universal installer
โŒ Update distribution complexity       โœ… Auto-updates via git
                                        โœ… Same experience all OSes
                                        โœ… Complete reproducibility

The Magnum Opus: Computing Sovereignty

This isn't just another framework โ€” it's a deliberate culmination of decades of tech evolution insights. Pipulate represents the "third act" approach to development (3rd time's the charm): choosing the most durable and lovable parts of the modern tech stack while rejecting the exhausting hamster wheel of framework churn.

If you are not an Empire builder and prefer craftsmanship over the rat race and want to build tools that last, then Pipulate may be for you. Pipulate embodies that philosophy โ€” maximum creative freedom with minimum technical debt, recapturing that old Webmaster feeling.

Core Philosophy: Local-First, WET, and AI-Augmented

Breaking Free: Durable Foundations for Any Approach

๐ŸŽก THE FRAMEWORK CHURN CYCLE                   ๐Ÿฐ COMPUTING SOVEREIGNTY  
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•               โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    React โ†’ Vue โ†’ Angular โ†’ Svelte             ๐Ÿ—ฝ Your Hardware
         โ†‘                    โ†“                ๐Ÿ—ฝ Your Data
    Webpack โ† Next.js โ† Vite โ† Remix           ๐Ÿ—ฝ Your AI Choice
         โ†‘                    โ†“                ๐Ÿ—ฝ Your Code
    Docker โ†’ K8s โ†’ Cloud โ†’ Serverless          ๐Ÿ—ฝ Your Schedule

    ๐Ÿ˜ตโ€๐Ÿ’ซ Endless Learning                        ๐Ÿ—ฝ Your Hardware
    ๐Ÿ’ธ Migration Fatigue                       ๐Ÿ—ฝ Your Data  
    ๐Ÿ”’ Platform Lock-in                        ๐Ÿ—ฝ Your AI Choice
    ๐Ÿ“ˆ Growing Complexity                      ๐Ÿ—ฝ Your Code
                                               ๐Ÿ—ฝ Your Schedule
              WITH
                                               โœจ Durable Tools:
    ๐Ÿƒโ€โ™‚๏ธ JUMP OFF THE WHEEL                        โ€ข Python (30+ years)
               โ†“                                โ€ข SQLite (built-in)
        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                         โ€ข HTML/HTTP (timeless)
        โ”‚  PIPULATE   โ”‚                         โ€ข Nix (reproducible)
        โ”‚ Local-First โ”‚                         โ€ข Cloud APIs (by choice)
        โ”‚+ Any Cloud  โ”‚                         
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                         ๐ŸŽฏ Third Act Philosophy:
                                                "Choose tools that will
                                                outlast any framework"
  • Local-First Sovereignty: Your data, code, and AI run on your hardware by defaultโ€”extending to cloud services when you choose. This guarantees privacy, eliminates surprise costs, and gives you complete control over when and how to scale.

  • WET Workflows, DRY Framework: Workflows are intentionally "WET" (explicit & step-by-step) for maximum clarity and customizabilityโ€”perfectly mirroring Jupyter Notebooks. The underlying framework is "DRY" for efficiency.

  • The AI Advantage: AI makes WET practical. Tedious code maintenance and refactoring, once a weakness of WET, is now an area where AI excels, turning repetition into a strength for rapid, context-aware development. Our breakthrough Workflow Reconstruction System exemplifies this: intelligent AST-based transplantation of workflow components eliminates traditional OOP inheritance complexity while maintaining perfect code precision.

  • Radical Transparency ("Know EVERYTHING!"): We reject opaque enterprise patterns in favor of complete observability. State is managed in transparent SQLite tables and JSON blobs, making the entire system intuitive and debuggable. No black boxes, ever.

  • Reproducibility with Nix: Nix Flakes provide a perfect, reproducible Linux environment on macOS, Linux, and Windows (WSL), solving the "works on my machine" problem.

  • Future-Proof Stack: We rely on durable standards: Python, SQLite, HTML, and HTMX. This is a framework built to last.

Primary Goals

  1. Empower End-Users (e.g., SEO Practitioners): Enable non-programmers to run powerful, AI-guided workflows (often ported from Jupyter Notebooks) without needing to interact with Python code directly.
  2. Serve Developers: Provide a simple, reproducible environment for building these workflows, leveraging integrated tooling like Jupyter, local LLMs, and a streamlined web framework.

The Technical Stack: Simple Yet Powerful

Pipulate's WET philosophy extends to its technology choices, favoring simple, durable tools over complex abstractions:

Not On My Machine Problem Fixed

The Cloud's popularity has been driven in part by developers not wanting to maintain multiple codebases or installers per OS. Thanks to Nix, that's all fixed.

  • Nix Flakes: Manages dependencies and creates reproducible environments, ensuring consistency across developers and operating systems, with optional CUDA support. E.g. Is this a Linux-thing you're reading about here? A Windows thing? A Mac thing? The answer is: YES!!! All of the above โ€” and if you've got cool acceleration hardware, it will even take advantage and utilize that too. Best of all worlds.
     ____                      _       _                        .--.      ___________
    |  _ \  __ _ _ ____      _(_)_ __ (_)_  __    ,--./,-.     |o_o |    |     |     |
    | | | |/ _` | '__\ \ /\ / / | '_ \| \ \/ /   / #      \    |:_/ |    |     |     |
    | |_| | (_| | |   \ V  V /| | | | | |>  <   |          |  //   \ \   |_____|_____|
    |____/ \__,_|_|    \_/\_/ |_|_| |_|_/_/\_\   \        /  (|     | )  |     |     |
                                                  `._,._,'  /'\_   _/`\  |     |     |
    Solving the "Not on my machine" problem well.           \___)=(___/  |_____|_____|

Nix serves as the "Noah's Ark" โ€” preserving this perfect focus in a reproducible environment that works identically across all platforms. Once you've locked in the focus, it lasts for years or decades, all bottled up in infrastructure-as-code.

Other Key Technologies Used

Pipulate integrates a carefully selected set of tools aligned with its philosophy:

  • FastHTML: A Python web framework prioritizing simplicity. It generates HTML directly from Python objects (no template language like Jinja2) and minimizes JavaScript by design, working closely with HTMX. It's distinct from API-focused frameworks like FastAPI. The Python function-naming is the HTML-template language.

The New LAMP Stack: Evolution in Simplicity

๐Ÿ›๏ธ ORIGINAL LAMP STACK (2000s)              ๐Ÿš€ NEW LAMP STACK (2025)
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•              โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๐Ÿง L: Linux                โ”‚              โ”‚  ๐Ÿง L: Linux + Nix          โ”‚
โ”‚     Single OS, manual setup โ”‚              โ”‚     Reproducible everywhere โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค              โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  ๐ŸŒ A: Apache               โ”‚              โ”‚  โšก A: ASGI                  โ”‚
โ”‚     Static config, restarts โ”‚              โ”‚     Async, hot reload       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค              โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  ๐Ÿ—„๏ธ M: MySQL                โ”‚              โ”‚  ๐Ÿ“Š M: MiniDataAPI          โ”‚
โ”‚     Complex queries, joins  โ”‚              โ”‚     Python-native simplicityโ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค              โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  ๐Ÿ”ง P: PHP                  โ”‚              โ”‚  ๐Ÿ P: Python + FastHTML    โ”‚
โ”‚     Mix of HTML/logic       โ”‚              โ”‚     + HTMX                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
              โ”‚                                            โ”‚
              โ–ผ                                            โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚   ๐Ÿข Enterprise     โ”‚                    โ”‚  ๐Ÿ  Local-First         โ”‚
    โ”‚   Complexity        โ”‚                    โ”‚  Sovereignty            โ”‚
    โ”‚                     โ”‚                    โ”‚                         โ”‚
    โ”‚ โ€ข Multi-server      โ”‚                    โ”‚ โ€ข Single machine        โ”‚
    โ”‚ โ€ข Load balancers    โ”‚                    โ”‚ โ€ข Integrated AI         โ”‚
    โ”‚ โ€ข Database clusters โ”‚         VS         โ”‚ โ€ข SQLite simplicity     โ”‚
    โ”‚ โ€ข DevOps overhead   โ”‚                    โ”‚ โ€ข Nix reproducibility   โ”‚
    โ”‚ โ€ข Cloud lock-in     โ”‚                    โ”‚ โ€ข Flexible deployment   โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

    ๐ŸŽฏ One person understands                  ๐ŸŽฏ One person controls
       part of the system                         the entire system

The original LAMP stack was beautiful in its simplicity โ€” one person could understand and manage the whole stack. But it got bloated with enterprise patterns, microservices, and distributed complexity.

Pipulate brings back that "one person, full stack" philosophy with modern tools:

  • Linux + Nix: Reproducible environments across all platforms
  • ASGI: Modern async server interface, future-proofed for performance
  • MiniDataAPI: Universal SQL simplifier close to Python's core data structures
  • Python + FastHTML + HTMX: The new web development paradigm

This isn't just simpler โ€” it's more powerful, giving you complete environment reproducibility, local AI integration, server-side state management, and future-proofed skills.

The Lens Stack: Focused Architecture

Pipulate's technology choices form aligned lenses that focus ideas from abstraction to actualization. Each lens must be ground and polished without misaligning the focus:

     Universal Translator of       Abstractions clarify into implementations
     Spoken Language to Code       by each lens being simple and transparent.

  Idea --> Lens 1   -->   Lens 2  -->  Lens 3  -> Lens 4 -> Lens 5 -> Lens 6

     -----> ,--.
     ---> ,'    `.---------> ,--.
     --> /        \------> ,'    `.-------> ,--.        ,-.
  o  -> /  Linux   \----> /  http  \----> ,'_hx `.--->,'   `.    ,-.
 /|\   (  HARDWARE  )--> ( PROTOCOL )--> ( LINGUA )->( UI/UX )->(APP)->(git)
 / \ -> \   Nix    /----> \  html  /----> `..py ,'--->`.   ,'    `-'
     --> \        /------> `.    ,'-------> `--'        `-'    And so on
     ---> `.    ,'---------> `--'         AI Help
     -----> `--'           AI Help
          AI Help

We keep lenses minimal, their material either thoroughly pre-trained into the model (Python 3.x, HTMX, etc.) or able to be included in the prompt and easily held in the context window. We've trimmed the cruft โ€” the lens flashes and burrs, and all unnecessary extra lenses (Angular, React, Vue, etc.)

HARDWARE:
  install.sh: Published on Pipulate.com to initiate magic cookie install 
  flake.nix: Nix IaC creating a normalized Linux subsystem on any host OS
PROTOCOL:
  http: Uvicorn fast Asynchronous Server Gateway Interface (ASGI) web server
  html: Uvicorn talks to Python Starlette using anyio & httpx libraries
  websocket: static/ws.js provides client bi-directional asynchronous communication
LINGUA:
  htmx: static/htmx.js JavaScript library to eliminate most need for JavaScript
  Python: .venv/bin/python3.12 latest version AIs are well trained on
UI/UX:
  browser: Obviously, but I guess it needs to be said. Like a looser Electron.
  fasthtml: static/fasthtml.js for FT Components, Python functions as templating
APP:
  app: Flask-style Uvicorn factory instance instantiated by FastHTML fast_app
  db: Dict-like DB providing transparent server-side state (server cookies)
  pipulate: Pipeline state management, like db but with JSON blob for workflows

Grinding Off the Burrs and Flashes

In lens manufacturing, "flashes" are excess material that squeeze out of molds โ€” unwanted projections that must be ground off. Steve Jobs famously did this twice: adopting Gorilla Glass (grinding off plastic flashes) and rejecting Flash Player (grinding off software bloat).

Pipulate continues this tradition:

  • FastHTML: Grinds off Jinja2 template complexity
  • HTMX: Grinds off virtual DOM overhead
  • Local AI: Enables privacy by default, cloud power when desired
  • SQLite: Grinds off enterprise database complexity

The result: clean, focused tools that do their job without unnecessary cruft.


From Flask to FastAPI to FastHTML

This is not your father's Python web framework. HTMX changes everything โ€” a marriage made in heaven between Python and the Web, finally turning Python into a first-class citizen for web development. In many use cases such as this one, Python is even preferable to JavaScript in the way it blends Python's formidable ecosystem of packages with workflows.

The Evolution: Flask โ†’ FastAPI โ†’ FastHTML

The revolution isn't just another framework โ€” it's eliminating the template layer entirely:

    ๐Ÿถ FLASK ERA              ๐Ÿš€ FASTAPI ERA            ๐ŸŒ FASTHTML ERA
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•           โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•           โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚   Python    โ”‚           โ”‚   Python    โ”‚           โ”‚   Python    โ”‚
    โ”‚  Functions  โ”‚           โ”‚  Functions  โ”‚           โ”‚  Functions  โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚                         โ”‚                         โ”‚
           โ–ผ                         โ–ผ                         โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚   Jinja2    โ”‚           โ”‚  Pydantic   โ”‚           โ”‚    HTMX     โ”‚โ—„โ”€ Over-the-wire
    โ”‚  Templates  โ”‚           โ”‚   Models    โ”‚           โ”‚  Fragments  โ”‚   HTML targeting
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜   DOM elements
           โ”‚                         โ”‚                         โ”‚
           โ–ผ                         โ–ผ                         โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚    HTML     โ”‚           โ”‚    JSON     โ”‚           โ”‚    HTML     โ”‚
    โ”‚   Response  โ”‚           โ”‚   Response  โ”‚           โ”‚  Elements   โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚                         โ”‚                         โ”‚
           โ–ผ                         โ–ผ                         โ–ผ
    ๐ŸŒ Full Page Reload     ๐Ÿ“ฑ Frontend Framework      ๐ŸŽฏ DOM Element Updates
                               (React/Vue/Angular)        def Div() = <div>
                                                          def Button() = <button>

    Template files needed    JSON โ†” HTML conversion     Python functions ARE
    Separate languages       Client-side complexity     the template language!

The FastHTML Breakthrough: Python function names directly become HTML elements, eliminating templates and making the server the single source of truth for UI state.

  • HTMX: Enables dynamic, interactive UIs directly in HTML via attributes, minimizing the need for custom JavaScript. Pipulate uses it for server-rendered HTML updates โ€” over the wire HTML-fragments targeting elements of the DOM directly instead of fragile, performance-reducing, framework-dependent JSON. THIS is where you jump off the tech-churn hamsterwheel and future-proof yourself.

  • MiniDataAPI: A lightweight layer for interacting with SQLite and other databases. Uses Python dictionaries for schema definition, promoting type safety without the complexity of traditional ORMs โ€” effectively future-proofing your SQL. You lose fancy join capabilities but in exchange get the Python dict interface as your main persistent database API forever-forward, enabiling instant swapability between SQLite and PostgreSQL (for example).

  • Ollama: Facilitates running LLMs locally, enabling in-app chat, workflow guidance, and future automation capabilities while ensuring privacy and avoiding API costs. Your local AI (Chip O'Theseus) learns & grows with you, hopping from hardware to hardware as you upgrade โ€” like a genie in a hermitcrab shell. And if that weren't kooky enough โ€” it knows how to make MCP-calls!!! That's right, your friendly localhost AI Chip O'Theseus is also an MCP client! Your linear workflows ain't so linear anymore when a single-step can be: "Go out and do whatever."

The Hybrid Advantage: Best of Both Worlds

Pipulate isn't anti-cloudโ€”it's pro-choice. Each workflow step can choose the best tool for the job:

  • Step 1: Use local AI for sensitive data analysis (privacy-first)
  • Step 2: Call OpenAI's API for advanced reasoning (cloud power)
  • Step 3: Process results locally and save to SQLite (data sovereignty)
  • Step 4: Use Anthropic's API for final review (frontier capabilities)

This is the Swiss Army knife approach: Local by default, cloud by choice, with complete visibility into what's happening at each step. Whether you're processing confidential client data (local) or need cutting-edge AI capabilities (cloud), Pipulate gives you the framework to do both seamlessly.

  • SQLite & Jupyter Notebooks: Foundational tools for data persistence and the workflow development process (porting from notebooks to Pipulate workflows). SQLite is built into Python and really all things โ€” the get-out-of-tech-liability free card you didn't know you had. And a full JupyterLab instance is installed side-by-side with Pipulate sharing the same Python .venv virtual environment, which is also shared with your preferred AI code editor (Cursor, Windsurf, VSCode, Zed) so... well... uhm, there are no words for when 3 different portals-to-Python share the same environment. You can do such stupid AI-tricks as letting your local LLM and a frontier cloud model inhabit the same body (Pipulate) โ€” controlling web browsers together and stuff.

How to Install Pipulate

Installation Strategy: Universal First, PyPI Alternative

We offer two installation paths that lead to the exact same robust, Nix-managed environment. Choose the path that best fits your experience level and preferences.

                            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                            โ”‚      New User on macOS     โ”‚
                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                          โ”‚
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚                                               โ”‚
                  โ–ผ                                               โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚ PATH 1: Recommended for Everyone โ”‚   โ”‚ PATH 2: Alternative for Python Developers โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚                                               โ”‚
  "I want the simplest, most               "I prefer managing my command-line
   direct way to get this running."        tools with standard Python utilities."
                  โ”‚                                               โ”‚
                  โ–ผ                                               โ–ผ
  1. `curl ... [nix]`                      1. `brew install pipx` (If needed)
  2. `curl ... [pipulate]`                 2. `pipx install pipulate`
                                           3. `pipulate install`
                  โ”‚                                               โ”‚
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                  โ”‚               โ”‚
                                  โ–ผ               โ–ผ
                            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                            โ”‚    Nix-Managed Pipulate    โ”‚
                            โ”‚        Environment         โ”‚
                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                         ||
                                    (Identical
                                      Result)

PATH 1: Quick Start โ€” Universal Installation (Recommended)

This is the fastest and most universal way to install Pipulate. It has the fewest dependencies and works on any modern Mac, Linux system, or Windows with WSL.


    ๐Ÿ“ฆ Your Machine            ๐Ÿ”ง Add Foundation       ๐Ÿš€ Complete Environment
         Today                       with Nix                 Ready to Go!

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚ Sad Computerโ”‚    Step 1   โ”‚   ๐Ÿ—๏ธ Nix    โ”‚    Step 2   โ”‚ ๐ŸŽฏ Pipulate โ”‚
    โ”‚   Without   โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚ Foundation  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚   + AI +    โ”‚
    โ”‚    Nix๐Ÿ˜ข    โ”‚             โ”‚  Installed  โ”‚             โ”‚   Jupyter   โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                                                    โ”‚
                                                             Step 3 โ”‚
                                                                    โ–ผ
                                                             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                                                             โ”‚ ๐ŸŒ Browser  โ”‚
                                                             โ”‚    Opens    โ”‚
                                                             โ”‚Automaticallyโ”‚
                                                             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

    Simple as 1-2-3! No Docker, no build steps, works with or without cloud services.
Everything runs locally with complete flexibility and control.

Step 1: Install Nix (One-Time Setup)

If you don't have it already, install the Nix package manager. It's the system that makes Pipulate's reproducible environment possible.

curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install

Important: After the Nix installation finishes, you must close and reopen your Terminal window.

Step 2: Run the Pipulate Installer

Now, run the universal install script. You can give your project a custom name, too.

# To install with a custom name like "Botifython"
curl -L https://pipulate.com/install.sh | sh -s Botifython

# Or, to install with the default name "pipulate"
curl -L https://pipulate.com/install.sh | sh

Step 3: Launch Pipulate

Navigate into your new project directory and launch the environment with nix develop.

# cd into the directory you just created
cd ~/Botifython

# Launch Pipulate
nix develop

That's it! The server and JupyterLab will start, and the application will open in your browser.

Running It Again:

  1. You can just forcibly exit out of that Terminal it's running from.
  2. Open a new Terminal, and once again:
cd ~/Botifython
nix develop

The Big Reset (If Necessary):

Things sometimes go wrong. This is how you do a full Pipulate reset. This will also delete anything you downloaded with Pipulate. Adjust custom install name to what you used.

rm -rf ~/Botifython
curl -L https://pipulate.com/install.sh | sh -s Botifython
cd ~/Botifython
nix develop

Wait for BOTH TABS to auto-open in your browser.

๐Ÿšจ Installation Troubleshooting

Common Issues & Solutions:

Problem Solution
nix: command not found You didn't restart your terminal after Nix installation
Browser doesn't open automatically Manually visit http://localhost:5001 and http://localhost:8888
Permission denied errors Make sure you can write to ~/pipulate directory
Port conflicts Kill processes on ports 5001/8888: lsof -ti:5001 | xargs kill -9
Nix build fails Clear Nix cache: nix-collect-garbage then retry

System Requirements:

  • macOS: 10.15+ (Intel/Apple Silicon)
  • Linux: Any modern distribution with curl
  • Windows: WSL2 with Ubuntu 20.04+
  • RAM: 4GB minimum, 8GB recommended
  • Disk: 2GB for installation + data storage
  • Network: Internet connection for initial setup only

PATH 2: Alternative Installation via PyPI (For Python Developers)

If you are a developer comfortable with tools like Homebrew and pipx, you can use our PyPI package as a gateway to the same robust installation.

Step 1: Install pipx

pipx is a tool for safely installing Python command-line applications. If you don't have it, you can install it with Homebrew.

brew install pipx

Step 2: Install the Pipulate CLI

Use pipx to install the pipulate command-line tool. This will not cause conflicts with your system Python.

pipx install pipulate

Step 3: Run the Installer

Use the command you just installed to set up the full Pipulate application.

pipulate install

This will trigger the same universal installation process, resulting in the exact same robust, Nix-managed environment. To run it in the future, just type pipulate run.

These few commands:

  • โœ… Updates to the latest version automatically
  • โœ… Starts JupyterLab and the Pipulate server
  • โœ… Opens web interfaces in your browser
  • โœ… Provides a complete, reproducible development environment

That's it! You now have a local-first development environment with AI integration, installed via your preferred Python toolchain.

Installation Process Deep Dive

Here's what happens behind the scenes during the "magic cookie" installation:

User runs install.sh (via curl)           Nix Flake Activation & Transformation
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 1. Download install.sh       โ”‚         โ”‚ 5. User runs 'nix develop'                 โ”‚
โ”‚ 2. Download ZIP from GitHub  โ”‚         โ”‚ 6. Flake detects non-git directory         โ”‚
โ”‚ 3. Extract ZIP to ~/AppName  โ”‚         โ”‚ 7. Flake clones repo to temp dir           โ”‚
โ”‚ 4. Download ROT13 SSH key    โ”‚         โ”‚ 8. Preserves app_name.txt, .ssh, .venv     โ”‚
โ”‚    to .ssh/rot               โ”‚         โ”‚ 9. Moves git repo into place               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚10. Sets up SSH key for git                 โ”‚
              โ”‚                          โ”‚11. Transforms into git repo                โ”‚
              โ–ผ                          โ”‚12. Enables auto-update via git pull        โ”‚
      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
      โ”‚ Result: Fully functional, auto-updating, git-based Pipulate installation    โ”‚
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Chef or Customer?

Are you a Developer or an End User? Chef or Customer? Understanding your audience is crucial for effective development. Pipulate serves two distinct but complementary audiences, much like a restaurant serves both chefs and customers

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚                      The Restaurant                      โ”‚
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
    โ”‚  โ”‚   Kitchen (Dev)  โ”‚              โ”‚  Dining Room     โ”‚  โ”‚
    โ”‚  โ”‚                  โ”‚              โ”‚  (End Users)     โ”‚  โ”‚
    โ”‚  โ”‚                  โ”‚              โ”‚                  โ”‚  โ”‚
    โ”‚  โ”‚  ๐Ÿ‘จโ€๐Ÿณ Sous Chef    โ”‚โ”€โ”€โ”€recipesโ”€โ”€โ”€โ–บโ”‚  ๐Ÿฝ๏ธ Customers    โ”‚  โ”‚
    โ”‚  โ”‚  ๐Ÿ‘ฉโ€๐Ÿณ Head Chef    โ”‚              โ”‚  ๐Ÿข Restaurateur โ”‚  โ”‚
    โ”‚  โ”‚                  โ”‚              โ”‚                  โ”‚  โ”‚
    โ”‚  โ”‚ "How do we make  โ”‚              โ”‚ "I want the best โ”‚  โ”‚
    โ”‚  โ”‚  pasta you've    โ”‚              โ”‚  pasta I've ever โ”‚  โ”‚
    โ”‚  โ”‚  never had?"     โ”‚              โ”‚  had in my life" โ”‚  โ”‚
    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ‘จโ€๐Ÿณ The Chef (Developer/Technical User)

  • ๐Ÿ”ง Workflow Creators: Build and customize AI-assisted workflows
  • ๐Ÿ““ Jupyter Porters: Convert notebook experiments into guided applications
  • ๐Ÿ” Technical SEOs: Create sophisticated, reusable SEO processes
  • โš™๏ธ System Administrators: Deploy consistent environments across teams

What Chefs Get:

  • ๐ŸŽ›๏ธ Complete control over the "recipe" (workflow logic)
  • ๐Ÿ”„ Reproducible development environment via Nix
  • ๐Ÿ—๏ธ Simple architecture that's easy to understand and modify
  • ๐Ÿงฐ Integrated tooling (Jupyter, local LLM, SQLite)

๐Ÿฝ๏ธ The Customer (End User/Non-Technical)

  • ๐Ÿ“ˆ SEO Practitioners: Run powerful workflows without coding
  • โœ๏ธ Content Creators: Use AI-assisted processes for optimization
  • ๐Ÿ“Š Marketing Teams: Execute consistent SEO strategies
  • ๐Ÿข Business Owners: Access enterprise-level SEO capabilities

What Customers Get:

  • ๐Ÿšถโ€โ™‚๏ธ Guided, step-by-step workflow experiences
  • ๐Ÿค– AI assistance at every step
  • ๐Ÿ™ˆ No need to see or understand the underlying code
  • ๐ŸŽฏ Consistent, repeatable results

๐Ÿ The Restaurant Analogy

Just as a chef talks about knife techniques while a diner just wants amazing pasta, Pipulate separates the complexity of creation from the simplicity of consumption. Developers craft the workflows, end-users enjoy the results.

๐ŸŽฏ Your First 10 Minutes with Pipulate

After installation succeeds, here's what to expect:

What You'll See

  1. Two browser tabs open automatically:

    • localhost:5001 - Pipulate web interface with navigation menu
    • localhost:8888 - JupyterLab for development/experimentation
  2. In the Pipulate interface:

    • Left sidebar with workflow plugins (Introduction, Profiles, etc.)
    • Main area showing step-by-step workflow interface
    • Right panel with integrated AI chat (Chip O'Theseus)
  3. Terminal shows:

    ๐Ÿš€ Starting Pipulate servers...
    โœ“ FastHTML server ready at http://localhost:5001  
    โœ“ JupyterLab ready at http://localhost:8888
    โœ“ Local AI ready for chat assistance
    

Your Next Steps Depend on Who You Are

๐Ÿ” If you're an SEO practitioner:

  • Click "Introduction" in the left menu for a guided tour
  • Try the built-in workflows to see the step-by-step pattern
  • Use the AI chat to ask "How do I create a keyword research workflow?"

๐Ÿ‘จโ€๐Ÿ’ป If you're a developer:

  • Open JupyterLab tab and run the introduction notebook
  • Check out plugins/010_introduction.py to see workflow code structure
  • Try creating a simple workflow: python helpers/workflow/create_workflow.py

๐Ÿค– If you're an AI assistant:

  • Focus on the Quick Reference Card above
  • Study the Critical Implementation Patterns section
  • Review mcp_tools.py for MCP protocol capabilities

๐Ÿ†• If you're just exploring:

  • Click through the left menu items to see different workflow types
  • Ask the AI chat: "What can I build with Pipulate?"
  • Try the Introduction workflow to see the step-by-step experience

The WET Revolution: Why Explicit Code Wins in the AI Era

Pipulate is built on a radical philosophy that challenges programming orthodoxy: WET (Write Everything Twice) is better than DRY (Don't Repeat Yourself) when you have AI to help manage it.

The Universal API Pattern: From Quarks to Code

At every scale of reality, we see the same pattern: "lumps of stuff" with APIs that enable interaction. Quarks combine into atoms, atoms into molecules, cells into organisms, individuals into societies. Each level requires the right granularity of interface โ€” not so abstract that you lose control, not so granular that you drown in complexity.

This is the 80/20 rule of existence: Handle 80% of interactions gracefully with 20% of the API surface, then handle edge cases as needed. Pipulate applies this principle to code architecture.

Durable vs. Ephemeral: Building on Bedrock

The tech industry suffers from "hamster wheel syndrome" โ€” constantly breaking APIs that force migration cycles. React (20+ versions), Node (frequent breaking changes), Angular (complete rewrites). This isn't progress; it's planned obsolescence.

Pipulate chooses durable foundations:

  • Linux Kernel: Version 6 in 30 years
  • Python: Version 3 in 30 years
  • HTML: Version 5 and stable
  • HTTP: Version 3 and backward compatible

These are the "laws of physics" for software โ€” stable APIs that enable compound growth rather than constant rebuilding.

Why WET Works Now

Traditional development follows DRY principles, creating abstract, complex systems that are hard to understand and modify. But the world has changed:

  1. ๐Ÿ”ฌ Jupyter Notebooks promote explicit, literate programming
  2. ๐Ÿค– AI assistants excel at managing repetitive code
  3. ๐Ÿ  Local-first architectures prioritize clarity over enterprise complexity
  4. ๐ŸŽฏ Right Granularity: WET provides the perfect abstraction level for human AND AI comprehension
                             ________________________________
 - Like Notebooks           /                                \
 - Linear Workflows        |  It runs proprietary private AI  |
 - Local & Cloud-free      |  Workflows from your Local PC?!  |
 - Chip O'Theseus included  \________________________________/
                                                            ()
      HARDWARE PLATFORM             LOCAL BROWSER             O   , Chip O'Theseus
   _______________________       __________ _______             o \\  .
  |                       |     / Pipulate \Jupyter\__            |\\/|
  | Windows, Mac or Linux |    |  __________________  |   See!    / " '\ - Radical transparency
  |     _____ ___         |    | | App Name   Menuโš™๏ธ| |<- - - - -. .   . - MCP tool-call control
  |   _/ Nix \____\_____  |    | |------------------| |         /    ) | - Browser as bot's body
  |  |                  | |    | | Workflow | Local | |        '  _.'  |
  |  |     Pipulate    <---------> -Step #1 | AI๐Ÿค–  | |        '-'/    \
  |__|  localhost:5001  |_|    | | -Step #2 | Chat  | |      What, no Docker?
     |  (AI on Rails๐Ÿš‚) |      | | -Step #3 | Helpโ–ธ | |      What, no React?
     |__________________|      | |__________|_______| |      What, no Cloud?
                               |______________________|

WET workflows are:

  • ๐Ÿ” Observable: See exactly what's happening at every step
  • ๐Ÿ”ง Customizable: Modify workflows without breaking abstractions
  • ๐Ÿค– AI-Friendly: Clear code that AI assistants can easily understand and maintain
  • ๐Ÿš€ Future-Proof: Built on durable web standards that won't become obsolete

Developer Setup & Environment Notes

Nix Environment Activation: Always run nix develop from the ~/pipulate directory before running any project commands (python server.py, pip install, etc.) in a new terminal. This ensures you are using the correct dependencies defined in flake.nix.

Interactive vs. Quiet Shell:

Standard Shell: nix develop (or nix develop .#default) runs the startup script (run-script defined in flake.nix) with welcome messages and service startup. Ideal for general use.

Quiet Shell: nix develop .#quiet activates the Nix environment without running the full startup script or launching services automatically. It only sets up paths and installs pip requirements. Use this for:

  • Running specific commands without starting the servers (e.g., nix develop .#quiet --command python -c "import pandas").
  • Debugging or interacting with AI assistants where verbose startup output is undesirable.
  • Manually running run-server or run-jupyter (scripts placed in .venv/bin by the shellHook).

Dependencies: System-level dependencies (Python version, libraries like gcc, zlib) are managed by flake.nix. Python package dependencies are managed by pip using requirements.txt within the Nix-provided environment.

Source of Truth: The flake.nix file is the definitive source for the development environment setup.


Architecture & Key Concepts

Pipulate features a distinct architecture designed for its local-first, simple, and observable nature.

Architecture Overview Diagram

This diagram illustrates the high-level components and their interactions:

                 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” Like Electron, but full Linux subsystem
                 โ”‚   Browser   โ”‚ in a folder for macOS and Windows (WSL)
                 โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ”‚ HTTP/WS
                       โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚           Nix Flake Shell             โ”‚ - In-app LLM (where it belongs)
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚ - 100% reproducible
    โ”‚  โ”‚   FastHTML    โ”‚  โ”‚    Ollama    โ”‚  โ”‚ - 100% local
    โ”‚  โ”‚   HTMX App    โ”‚  โ”‚  Local LLM   โ”‚  โ”‚ - 100% multi-OS
    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
    โ”‚          โ”‚                            โ”‚
    โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
    โ”‚    โ”‚MiniDataAPIโ”‚โ—„โ”€โ”€โ”€โ–บโ”‚ SQLite DB  โ”‚   โ”‚
    โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

This complete, self-contained environment runs identically on any operating system, providing the foundation for all Pipulate workflows and AI interactions.


Integrated Data Science Environment

Jupyter Notebooks run alongside the FastHTML server, allowing developers to prototype workflows in a familiar environment before porting them to Pipulate's step-based interface for end-users. The same Python virtual environment (.venv) is shared, and ad-hoc package installation is supported. If you're using Cursor, VSCode or Windsurf, set your Ctrl+Shift+P "Python: Set Interpreter" to "Enter Interpreter Path" ./pipulate/.venv/bin/python. You might have to adjust based on the folder you use as your workspace. But then you'll have a Python environment unified between Cursor, JupyterLab and Pipulate.

      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
      โ”‚   Jupyter Lab    โ”‚    โ”‚    FastHTML      โ”‚
      โ”‚   Notebooks      โ”‚    โ”‚     Server       โ”‚
      โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
      โ”‚ โ”‚ Cell 1   โ”‚     โ”‚    โ”‚  โ”‚ Step 1   โ”‚    โ”‚
      โ”‚ โ”‚          โ”‚     โ”‚--->โ”‚  โ”‚          โ”‚    โ”‚
      โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
      โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
      โ”‚ โ”‚ Cell 2   โ”‚     โ”‚    โ”‚  โ”‚ Step 2   โ”‚    โ”‚
      โ”‚ โ”‚          โ”‚     โ”‚--->โ”‚  โ”‚          โ”‚    โ”‚
      โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
      โ”‚  localhost:8888  โ”‚    โ”‚  localhost:5001  โ”‚
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Local-First & Single-Tenant Details

Pipulate manages all state server-side within the local environment (think local-server cookies), with optional cloud integration as needed. This approach offers:

  • Privacy & Control: Data stays local by default, cloud integration when you choose.
  • Full Resource Access: Utilize local CPU/GPU freely for intensive tasks, plus cloud APIs for heavy lifting.
  • Simplicity: Eliminates complexities of multi-tenancy while supporting both local and cloud workflows.
  • Observability: State changes (via DictLikeDB/JSON) are transparent and easily logged (AI greps it there).

Local-First State Management Benefits

This detailed view shows how Pipulate's local-first architecture eliminates common web development complexities:

      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” # Benefits of Local-First Simplicity
      โ”‚          Web Browser          โ”‚
      โ”‚                               โ”‚ - No mysterious client-side state
      โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚ - No full-stack framework churn
      โ”‚    โ”‚   Server Console   โ”‚     โ”‚ - No complex ORM or SQL layers
      โ”‚    โ”‚     & Web Logs     โ”‚     โ”‚ - No external message queues
      โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚ - No build step required
      โ”‚              โ–ผ                โ”‚ - Direct, observable state changes
      โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
      โ”‚    โ”‚  Server-Side State  โ”‚    โ”‚ - Conceptually like local-server-side cookies
      โ”‚    โ”‚  DictLikeDB + JSON โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Enables the "Know EVERYTHING!" philosophy
      โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚ - AI greps logs/server.log to see app state!
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Server-Rendered UI (HTMX)

The UI is constructed primarily with server-rendered HTML fragments delivered via HTMX. This minimizes client-side JavaScript complexity.

  • FastHTML generates HTML components directly from Python.
  • HTMX handles partial page updates based on user interactions, requesting new HTML snippets from the server.
  • WebSockets and Server-Sent Events (SSE) provide real-time updates (e.g., for chat, live development reloading).
                        HTMX+Python enables a world-class
                  Python front-end Web Development environment.
                             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                             โ”‚    Navigation Bar   โ”‚  - No template language (like Jinja2)
                             โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค  - HTML elements are Python functions
  Simple Python back-end     โ”‚  Main   โ”‚   Chat    โ”‚  - Minimal custom JavaScript / CSS
  HTMX "paints" HTML into    โ”‚  Area   โ”‚ Interface โ”‚  - No React/Vue/Angular overhead
  the DOM on demand โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚         โ”‚           โ”‚  - No "build" process like Svelte
                             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  - No virtual DOM, JSX, Redux, etc.

With such minimal surface area the AI code assistant knows everything. LLMs are either pre-trained on the stable, infrequently revved libraries used (Python 3.12, HTMX, or it's all small enough to fit in a 1-shot prompt โ€” yes, the whole core code-base fits in one Gemini Web UI form submit.


Workflow Patterns & Development

Pipeline Workflows

Designed for porting notebook-style processes, workflows are sequences of steps where the state is managed explicitly at each stage and stored persistently (typically as a JSON blob in the pipeline table).

  • Resumable & Interrupt-Safe: Because each step's completion is recorded, workflows can be stopped and resumed.
  • Explicit State Flow: Data typically passes from one step's output (done field) to the next via the transform function, simplifying debugging. Patterned on Unix pipes.
  • Good Training Data: The structured input/output of each step creates valuable data for potentially fine-tuning models.
  • Proprietary Friendly: Excellent for proprietary domain-experts and fields (competing academic, finances) who resist letting their data flow onto the Web for general AI training.
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   - Fully customizable steps
  โ”‚ Step 01 โ”‚โ”€pipedโ”€โ–บโ”‚ Step 02 โ”‚โ”€pipedโ”€โ–บโ”‚ Step 03 โ”‚   - Interruption-safe & resumable
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   - Easily ported from Notebooks
       โ”‚                  โ”‚                  โ”‚        - One DB record per workflow run
       โ–ผ                  โ–ผ                  โ–ผ        - Everything stays on your machine
  State Saved        State Saved         Finalized?   - Magnitudes simpler than celery

Run All Cells Pattern

The key insight: Pipulate workflows use a run_all_cells() pattern that directly mirrors Jupyter's "Run All Cells" command. This creates an immediate mental model โ€” each workflow step is like a notebook cell, and the system automatically progresses through them top-to-bottom, just like running all cells in a notebook.

    ๐Ÿ““ JUPYTER NOTEBOOK               ๐ŸŒ PIPULATE WORKFLOW
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•               โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    [ ] Cell 1: Import data          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚                            โ”‚  Step 1: Data Input โ”‚
        โ–ผ                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    [โ–ถ] Cell 2: Process data                    โ”‚ hx_trigger="load"
        โ”‚                                       โ–ผ
        โ–ผ                            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    [ ] Cell 3: Generate report      โ”‚ Step 2: Processing  โ”‚
        โ”‚                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
        โ–ผ                                       โ”‚ hx_trigger="load"
    [ ] Cell 4: Export results                  โ–ผ
                                     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    ๐ŸŽฏ "Run All Cells" Button   โ•โ•โ•โ–บ โ”‚ Step 3: Export      โ”‚
       Executes top-to-bottom        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

       Same mental model, same execution flow!
       But with persistent state, a web UI and
       not having to look at the Python code ๐Ÿšซ๐Ÿ.

LLM Integration (Ollama)

Integration with a local Ollama instance provides AI capabilities without external API calls:

  • Privacy: Prompts and responses stay local.
  • Cost-Effective: No per-token charges; run continuously using local resources.
  • Streaming Support: Real-time interaction via WebSockets.
  • Bounded Context: Manages conversation history effectively.
  • App State Awareness: Grepping your server log reveals full application state.
  • Tool Calling: Local LLM is an MCP client with a growing list of abilities
    • Workflow assistance
    • Browser automation
    • Debugging
                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚   Local Ollama   โ”‚ - No API keys needed
                   โ”‚      Server      โ”‚ - Completely private processing
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
                            โ”‚ Streaming via WebSocket
                            โ–ผ
                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚   Pipulate App   โ”‚ - Monitors WS for MCP tool-call commands
                   โ”‚(WebSocket Client)โ”‚ - Parses responses in real-time
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
                            โ”‚ In-memory or DB backed
                            โ–ผ
                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚     Bounded      โ”‚ - Manages context window (~128k)
                   โ”‚   Chat History   โ”‚ - Enables RAG / tool integration
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Multi-OS & CUDA Support (Nix)

Nix Flakes ensure a consistent environment across Linux, macOS, and Windows (via WSL), optionally leveraging CUDA GPUs if detected.

               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
               โ”‚  Linux / macOS   โ”‚ - Write code once, run anywhere
               โ”‚  Windows (WSL)   โ”‚ - Consistent dev environment via Nix
               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - As if Homebrew but across all OSes
                        โ”‚
                        โ”‚ Nix manages dependencies
                        โ–ผ
               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
               โ”‚   CUDA Support   โ”‚ - Auto-detects NVIDIA GPU w/ CUDA
               โ”‚   (if present)   โ”‚ - Uses GPU for LLM acceleration
               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - Falls back to CPU if no CUDA

UI Layout

The application interface is organized into distinct areas:

               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
               โ”‚         Navigation         โ—„โ”€โ”€ Search, Profiles,
               โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    Apps, Settings
               โ”‚               โ”‚             โ”‚
    Workflow, โ”€โ”€โ–บ   Main Area  โ”‚    Chat     โ”‚
    App UI     โ”‚   (Pipeline)  โ”‚  Interface โ—„โ”€โ”€ LLM Interaction
               โ”‚               โ”‚             โ”‚
               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

UI Component Hierarchy: Complete DOM Structure with IDs & ARIA Labels

Critical for AI assistants: All UI components use semantic IDs and comprehensive ARIA labeling for accessibility and automation.

๐Ÿ  home (Root Component)
โ”œโ”€โ”€ ๐Ÿ“ฆ create_outer_container()
โ”‚   โ”œโ”€โ”€ ๐Ÿงญ create_nav_group() [id='nav-group', role='navigation', aria-label='Main navigation']
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ” nav_search_container [role='search', aria-label='Plugin search']
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Input [id='nav-plugin-search', role='searchbox', aria-label='Search plugins']
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Div [id='search-results-dropdown', role='listbox', aria-label='Search results']
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ‘ค create_profile_menu() [id='profile-dropdown-menu', aria-label='Profile management']
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Summary [id='profile-id', aria-label='Profile selection menu']
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Ul [role='menu', aria-label='Profile options', aria-labelledby='profile-id']
โ”‚   โ”‚   โ”œโ”€โ”€ โšก create_app_menu() [id='app-dropdown-menu', aria-label='Application selection']
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Summary [id='app-id', aria-label='Application menu']
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Ul [role='menu', aria-label='Application options', aria-labelledby='app-id']
โ”‚   โ”‚   โ”œโ”€โ”€ ๐ŸŒ create_env_menu() [id='env-dropdown-menu', data-testid='environment-dropdown-menu']
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Summary [id='env-id', aria-label='Environment selection menu']
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Ul [role='menu', aria-label='Environment options', aria-labelledby='env-id']
โ”‚   โ”‚   โ””โ”€โ”€ โš™๏ธ poke_section [id='poke-dropdown-menu']
โ”‚   โ”‚       โ”œโ”€โ”€ Summary [id='poke-summary']
โ”‚   โ”‚       โ””โ”€โ”€ Div [id='nav-flyout-panel']
โ”‚   โ”œโ”€โ”€ ๐Ÿ“ฑ main-grid
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‹ create_grid_left() [id='grid-left-content'] โ†’ Workflow Steps/Cells Display
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ content_to_render (Dynamic workflow content)
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ scroll_to_top [id='scroll-to-top-link']
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿค– create_chat_interface() [id='chat-interface', role='complementary', aria-label='AI Assistant Chat']
โ”‚   โ”‚       โ”œโ”€โ”€ H2 [APP_NAME + ' Chatbot']
โ”‚   โ”‚       โ”œโ”€โ”€ Div [id='msg-list', role='log', aria-label='Chat conversation', aria-live='polite']
โ”‚   โ”‚       โ””โ”€โ”€ Form [role='form', aria-label='Chat input form']
โ”‚   โ”‚           โ”œโ”€โ”€ Textarea [id='msg', role='textbox', aria-label='Chat message input', aria-multiline='true']
โ”‚   โ”‚           โ”œโ”€โ”€ Button [id='send-btn', aria-label='Send message to AI assistant']
โ”‚   โ”‚           โ””โ”€โ”€ Button [id='stop-btn', aria-label='Stop AI response streaming']
โ”‚   โ””โ”€โ”€ ๐Ÿ”ง HTMX Refresh Listeners
โ”‚       โ”œโ”€โ”€ Div [id='profile-menu-refresh-listener', hx_target='#profile-dropdown-menu']
โ”‚       โ””โ”€โ”€ Div [id='app-menu-refresh-listener', hx_target='#app-dropdown-menu']

๐ŸŽฏ Key HTMX Targets for AI Browser Automation

Navigation Updates:

  • #profile-dropdown-menu - Profile menu refresh target
  • #app-dropdown-menu - App menu refresh target
  • #search-results-dropdown - Live search results
  • #nav-flyout-panel - Settings flyout panel

Content Areas:

  • #grid-left-content - Main workflow display area
  • #msg-list - Chat conversation history
  • body - Full page navigation refreshes

Interactive Elements:

  • #nav-plugin-search - Real-time plugin search (300ms delay)
  • #send-btn / #stop-btn - Chat control buttons
  • #scroll-to-top-link - Scroll navigation aid

This structure enables AI assistants to programmatically interact with all UI components using semantic selectors and ARIA landmarks.

File Structure

    .
    โ”œโ”€โ”€ .cursor/                   # Bootstraps Radical Transparency (teaches AI to fish)
    โ”‚   โ””โ”€โ”€ rules/                 # Framework rules (01_CRITICAL_PATTERNS.mdc, etc.)
    โ”œโ”€โ”€ .venv/                     # Common Python environment for FastHTML, Jupyter & Cursor
    โ”œโ”€โ”€ browser_automation/        # Selenium browser control & DOM capture
    โ”‚   โ”œโ”€โ”€ looking_at/            # Current browser DOM state for AI visibility
    โ”‚   โ””โ”€โ”€ *.py                   # Google search automation examples
    โ”œโ”€โ”€ cli.py                     # Command line interface for Pipulate operations
    โ”œโ”€โ”€ common.py                  # Base Class for DRY CRUD plugin app inheritance (todo)
    โ”œโ”€โ”€ data/
    โ”‚   โ””โ”€โ”€ data.db                # AI-accessible SQLite for application state (server cookies)
    โ”œโ”€โ”€ downloads/                 # Default location for workflow outputs (e.g., CSVs)
    โ”œโ”€โ”€ helpers/
 ย ย  โ”‚ย ย  โ”œโ”€โ”€ botify
 ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ botify_api.ipynb   # Git managed massive example notebook, produces docs
 ย ย  โ”‚ย ย  โ”œโ”€โ”€ workflow               # Workflow workshop, lots of tools that make WET DRY
 ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ create_workflow.py # Example of what might be found there
    โ”‚   โ””โ”€โ”€ prompt_foo.py          # Bundles XML code payloads for massive 1-shot AI prompts
    โ”œโ”€โ”€ logs/
 ย ย  โ”‚ย ย  โ”œโ”€โ”€ server-1.log           # N-rotations of server log per run per config
    โ”‚   โ””โ”€โ”€ server.log             # The server log of most recent run, contains app state
    โ”œโ”€โ”€ static/                    # JS, CSS, images, icons
    โ”œโ”€โ”€ plugins/                   # Workflow plugins (010_introduction.py, 400_trifecta.py, etc.)
    โ”œโ”€โ”€ pyproject.toml             # Python packaging configuration and metadata
    โ”œโ”€โ”€ training/                  # Markdown files for AI context/prompts
    โ”œโ”€โ”€ vulture_whitelist.py       # Code analysis whitelist for unused code detection
    โ”œโ”€โ”€ flake.nix                  # Infrastructure as Code & all system-versions for AI
    โ”œโ”€โ”€ LICENSE                    # It's MIT
    โ”œโ”€โ”€ install.sh                 # "Magic cookie" installation script (curl | sh)
    โ”œโ”€โ”€ mcp_tools.py               # MCP protocol tools - the AI assistant interface
    โ”œโ”€โ”€ notebook_introduction_local.ipynb  # Editable (non-auto-updating) copy of botify_api.ipynb
    โ”œโ”€โ”€ README.md                  # This file
    โ”œโ”€โ”€ requirements.txt           # Python dependencies (managed by Nix)
    โ””โ”€โ”€ server.py                  # Main application entry point

Critical Implementation Patterns for LLMs

These patterns are essential for LLMs working with Pipulate and are frequently missed:

1. The Auto-Key Generation Pattern (MOST CRITICAL)

๐Ÿ“ AUTO-KEY GENERATION FLOW
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    POST     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    HX-Refresh   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Empty Form  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚   Server    โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚ Page Reload โ”‚
โ”‚ Submit โŽ    โ”‚    /init    โ”‚  Response   โ”‚     Header      โ”‚   Trigger   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ–ฒ                                                            โ”‚
       โ”‚                                                            โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ User Hits   โ”‚ โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ Auto-Key    โ”‚ โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ landing()   โ”‚
โ”‚ Enter Again โ”‚    Ready!    โ”‚ Populated   โ”‚    Generates   โ”‚   Method    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

When a user hits Enter on an empty key field, this specific sequence occurs:

  1. Form Submission: POSTs to /{APP_NAME}/init with empty pipeline_id
  2. Server Response: The init method MUST return an HX-Refresh response:
    if not user_input:
        from starlette.responses import Response
        response = Response('')
        response.headers['HX-Refresh'] = 'true'
        return response
    
  3. Page Reload: HTMX triggers a full page reload
  4. Auto-Key Population: The landing() method calls pip.generate_pipeline_key(self) to populate the input field
  5. User Interaction: User hits Enter again to start the workflow

2. The Chain Reaction Pattern: The run_all_cells() Breakthrough

Pipulate uses HTMX-driven step progression powered by the brilliantly named run_all_cells() method:

  1. Initial Trigger: After init, the run_all_cells() method initializes the workflow just like Jupyter's "Run All Cells"
  2. Perfect Mental Model: The method name creates immediate understanding โ€” workflows execute top-to-bottom like notebook cells
  3. Step Handlers: Each step has GET (display) and POST (submit) handlers
  4. Automatic Progression: Completed steps trigger next step with hx_trigger="load"
  5. State Persistence: Each step stores data in pipeline state
  6. Pedagogical Brilliance: The naming makes the system instantly intuitive for developers and AI assistants

Example: The run_all_cells() Pattern in Action

# โœ… CORRECT: Use the run_all_cells() method for workflow initialization
async def init(self, request):
    """Initialize workflow using the run_all_cells pattern"""
    return pip.run_all_cells(app_name, steps)

# โŒ ANTI-PATTERN: Manual placeholder creation
async def init(self, request):
    """Manual approach โ€” harder to understand and maintain"""
    first_step_id = steps[0].id
    return Div(
        Div(id=first_step_id, hx_get=f'/{app_name}/{first_step_id}', hx_trigger='load'),
        id=f"{app_name}-container"
    )

The run_all_cells() method encapsulates the workflow initialization pattern and creates an immediate mental connection to Jupyter notebooks.

3. APP_NAME vs. Filename Distinction

๐Ÿ“‚ FILENAME vs APP_NAME DISTINCTION
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    CRITICAL SEPARATION                      โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                             โ”‚
โ”‚  ๐Ÿ“ FILENAME: 200_workflow_genesis.py                       โ”‚
โ”‚      โ”œโ”€โ”€ ๐ŸŒ Determines public URL: /workflow_genesis        โ”‚
โ”‚      โ””โ”€โ”€ ๐Ÿ“Š Controls menu order: 200                        โ”‚
โ”‚                                                             โ”‚
โ”‚  ๐Ÿท๏ธ  APP_NAME: "workflow_genesis_internal"                  โ”‚
โ”‚      โ”œโ”€โ”€ ๐Ÿ’พ Database table identifier                       โ”‚
โ”‚      โ”œโ”€โ”€ ๐Ÿ”’ MUST REMAIN STABLE (data integrity)             โ”‚
โ”‚      โ””โ”€โ”€ ๐Ÿšซ NEVER change after deployment                   โ”‚
โ”‚                                                             โ”‚
โ”‚  โš ๏ธ  DANGER: Changing APP_NAME = Orphaned Data              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Critical for data integrity:

  • Filename (e.g., 200_workflow_genesis.py): Determines public URL endpoint and menu ordering
  • APP_NAME Constant (e.g., APP_NAME = "workflow_genesis_internal"): Internal identifier that MUST REMAIN STABLE

4. State Management via DictLikeDB

  • State stored as JSON blobs in pipeline table
  • Accessed via pip.get_step_data() and pip.set_step_data()
  • All state changes are transparent and observable

5. Plugin Discovery System

๐Ÿ“ PLUGIN DISCOVERY SYSTEM
plugins/
โ”œโ”€โ”€ 010_introduction.py       โœ… Registered as "introduction" (menu order: 1)
โ”œโ”€โ”€ 020_profiles.py           โœ… Registered as "profiles" (menu order: 2)
โ”œโ”€โ”€ hello_flow (Copy).py      โŒ SKIPPED - Contains "()"
โ”œโ”€โ”€ xx_experimental.py        โŒ SKIPPED - "xx_" prefix
โ””โ”€โ”€ 200_workflow_genesis.py   โœ… Registered as "workflow_genesis" (menu order: 20)

    ๐Ÿ“Š AUTO-REGISTRATION RULES:
    โœ… Numeric prefix โ†’ Menu ordering + stripped for internal name
    โŒ Parentheses "()" โ†’ Development copies, skipped
    โŒ "xx_" prefix โ†’ Work-in-progress, skipped
    ๐Ÿ”ง Must have: landing() method + name attributes
    ๐Ÿ’‰ Auto dependency injection via __init__ signature
  • Files in plugins/ directory are auto-discovered
  • Numeric prefixes control menu ordering
  • Classes must have landing method and name attributes
  • Automatic dependency injection based on __init__ signature

Workflow Development Helper Scripts

Pipulate includes sophisticated helper scripts for workflow development:

create_workflow.py

Creates new workflows from templates:

python create_workflow.py workflow.py MyWorkflow my_workflow \
  "My Workflow" "Welcome message" "Training prompt" \
  --template trifecta --force

splice_workflow_step.py

Adds steps to existing workflows:

python splice_workflow_step.py workflow.py --position top
python splice_workflow_step.py workflow.py --position bottom

Template System

๐Ÿ—๏ธ WORKFLOW TEMPLATE SYSTEM
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  BLANK TEMPLATE โ”‚              โ”‚TRIFECTA TEMPLATEโ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค              โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚              โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚   Step 1    โ”‚ โ”‚              โ”‚ โ”‚   Step 1    โ”‚ โ”‚
โ”‚ โ”‚  (Minimal)  โ”‚ โ”‚              โ”‚ โ”‚  (Input)    โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚     VS       โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                 โ”‚              โ”‚        โ”‚        โ”‚
โ”‚ Quick Start     โ”‚              โ”‚        โ–ผ        โ”‚
โ”‚ Single Purpose  โ”‚              โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚ โ”‚   Step 2    โ”‚ โ”‚
                                 โ”‚ โ”‚ (Process)   โ”‚ โ”‚
create_workflow.py               โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
--template blank                 โ”‚        โ”‚        โ”‚
                                 โ”‚        โ–ผ        โ”‚
                                 โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
                                 โ”‚ โ”‚   Step 3    โ”‚ โ”‚
                                 โ”‚ โ”‚  (Output)   โ”‚ โ”‚
                                 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
                                 โ”‚                 โ”‚
                                 โ”‚ Full Pattern    โ”‚
                                 โ”‚ Complete Flow   โ”‚
                                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

                                 create_workflow.py
                                 --template trifecta
  • blank: Minimal workflow with one step
  • trifecta: Three-step workflow pattern
  • Automatic method generation and insertion

Workflow Reconstruction System

The Revolutionary Alternative to OOP Inheritance: Atomic transplantation of workflow components using intelligent pattern matching and AST precision.

๐Ÿงฌ WORKFLOW RECONSTRUCTION: ATOMIC TRANSPLANTATION
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    OLD WORKFLOW               WORKFLOW                UPDATED WORKFLOW
   (Atomic Source)           RECONSTRUCTOR            (Incremental Gen)
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚ ๐Ÿงฌ Components:  โ”‚  AST  โ”‚ ๐ŸŽฏ Pattern      โ”‚ AST  โ”‚ โœจ Generated:   โ”‚
  โ”‚                 โ”‚ โ”€โ”€โ”€โ–บ  โ”‚   Matching      โ”‚ โ”€โ”€โ”€โ–บ โ”‚                 โ”‚
  โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚       โ”‚                 โ”‚      โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
  โ”‚ โ”‚step_params* โ”‚ โ”‚       โ”‚ Bundle Type 1:  โ”‚      โ”‚ โ”‚step_params* โ”‚ โ”‚ โœ…
  โ”‚ โ”‚step_optim*  โ”‚ โ”‚       โ”‚ Auto-Registered โ”‚      โ”‚ โ”‚step_optim*  โ”‚ โ”‚ โœ…  
  โ”‚ โ”‚parameter*   โ”‚ โ”‚       โ”‚ Methods         โ”‚      โ”‚ โ”‚parameter*   โ”‚ โ”‚ โœ…
  โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚       โ”‚                 โ”‚      โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
  โ”‚                 โ”‚       โ”‚ Bundle Type 2:  โ”‚      โ”‚                 โ”‚
  โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚       โ”‚ Custom Routes   โ”‚      โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
  โ”‚ โ”‚_process     โ”‚ โ”‚       โ”‚ (_process,      โ”‚      โ”‚ โ”‚_process     โ”‚ โ”‚ โœ…
  โ”‚ โ”‚preview      โ”‚ โ”‚       โ”‚  preview)       โ”‚      โ”‚ โ”‚preview      โ”‚ โ”‚ โœ…
  โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚       โ”‚                 โ”‚      โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ”„ COMPLETE LIFECYCLE: Test โ†’ Validate โ†’ Production โ†’ Cleanup
  
  --suffix 5        --target new_name       --target same_name      git status
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  param_buster5     advanced_params         param_buster (in-place) (shows cruft)
  (safe testing)    (new workflow)          (git history preserved) (clean up!)

๐ŸŽฏ WHY IT WORKS: Lightning in a Bottle
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ โœจ Pattern Matching: No manual markers needed                           โ”‚
โ”‚ ๐Ÿ”ง AST Precision: Syntactically perfect code generation                 โ”‚  
โ”‚ ๐ŸŽญ Inheritance Alternative: Compose without complex super() chains      โ”‚
โ”‚ ๐Ÿงช Safe Testing: Incremental validation without production risk         โ”‚
โ”‚ ๐Ÿ“š Git Continuity: In-place updates preserve development history        โ”‚
โ”‚ ๐Ÿงน Systematic Cleanup: Prevents file cruft accumulation                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

         workflow_reconstructor.py --template botify_trifecta 
                                       --source parameter_buster
                                       --suffix 5

The System That Eliminates Bootstrap Paradox:

  • Atomic Sources: Battle-tested workflows become component libraries
  • Pattern Matching: Intelligent detection via _process, preview patterns
  • AST Transplantation: Surgical precision without syntax errors
  • Complete Lifecycle: Development โ†’ Testing โ†’ Production โ†’ Cleanup

๐Ÿ“‹ Quick Reference Card

Essential Commands

# Development workflow
cd ~/pipulate && nix develop          # Start Pipulate
nix develop .#quiet                   # Start without auto-services
python server.py                     # Manual server start
git pull && nix develop              # Update to latest

# Create new workflows  
python helpers/workflow/create_workflow.py my_workflow.py MyClass my_internal_name
python helpers/workflow/splice_workflow_step.py my_workflow.py --position top

# Plugin naming conventions
010_my_plugin.py                     # Active plugin (menu order 1)
xx_my_plugin.py                      # Disabled during development  
my_plugin (Copy).py                  # Ignored development copy

Key URLs & Ports

  • Pipulate App: http://localhost:5001
  • JupyterLab: http://localhost:8888
  • Local AI Chat: Built into the Pipulate interface
  • Logs: tail -f logs/server.log for debugging

Critical Patterns for AI Assistants

# Auto-key generation flow
if not user_input:
    response = Response('')
    response.headers['HX-Refresh'] = 'true'
    return response

# Workflow initialization
return pip.run_all_cells(app_name, steps)

# State management
data = pip.get_step_data(step_id)
pip.set_step_data(step_id, updated_data)

File Structure Quick Reference

plugins/                    # Your workflows (auto-discovered)
โ”œโ”€โ”€ 010_introduction.py     # Menu order 1
โ”œโ”€โ”€ xx_draft.py            # Disabled (xx_ prefix)
โ””โ”€โ”€ draft (Copy).py        # Ignored (parentheses)

mcp_tools.py               # AI assistant interface  
common.py                  # Base classes for workflows
browser_automation/        # Selenium automation tools
logs/server.log            # Debug everything here
data/data.db              # SQLite application state

Common LLM Implementation Mistakes

๐Ÿšจ LLM IMPLEMENTATION MISTAKE PREVENTION
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    COMMON PITFALLS                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โŒ Missing HX-Refresh      โ”‚ โœ… if not user_input:         โ”‚
โ”‚    Response                โ”‚     response.headers['HX-     โ”‚
โ”‚                            โ”‚     Refresh'] = 'true'        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โŒ Wrong Key Generation    โ”‚ โœ… pip.generate_pipeline_     โ”‚
โ”‚    Method                  โ”‚     key(self)                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โŒ Broken Chain Reaction   โ”‚ โœ… hx_trigger="load" โ†’        โ”‚
โ”‚    Pattern                 โ”‚     Automatic progression     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โŒ APP_NAME Changes        โ”‚ โœ… NEVER modify after         โ”‚
โ”‚    (Data Orphaning)        โ”‚     deployment                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

LLMs frequently make these errors:

  1. Missing HX-Refresh Response: Forgetting to return the refresh response for empty keys
  2. Incorrect Key Generation: Not using pip.generate_pipeline_key(self) properly
  3. Missing Cursor Positioning: Forgetting the _onfocus attribute for user experience
  4. Wrong Route Handling: Not understanding the difference between landing page and init routes
  5. State Inconsistency: Not properly handling the key generation and storage flow
  6. APP_NAME Changes: Modifying APP_NAME after deployment, orphaning existing data
  7. Chain Reaction Breaks: Not properly implementing the HTMX step progression pattern

Key Design Guidelines & Patterns

These "speedbumps" reinforce Pipulate's core philosophy:

  • Local vs. Enterprise Mindset: Embrace local-first simplicity. Avoid patterns designed for distributed, multi-tenant systems.
  • JSON State Management (Workflows): Keep workflow state in self-contained steps within a single JSON blob per run. Avoid complex state machines or external step tracking.
  • Database (MiniDataAPI): Use the simple schema definition and access patterns provided. Avoid heavy ORMs.
  • Workflow Pattern: Ensure workflows are linear and state is explicitly passed or saved at each step. Avoid complex async task chaining that obscures state.
  • UI Rendering Pattern: Generate HTML directly from Python components via FastHTML. Avoid template engines.
  • WebSocket Pattern: Use the dedicated Chat class for managing LLM interactions. Avoid raw WebSocket handling elsewhere.
  • Workflow Progression Pattern: Workflows use an explicit chain reaction pattern with hx_trigger="load" to manage step progression. This pattern must be preserved exactly as implemented. See the workflow documentation for details.

Internal Components

  • Monitoring: A file system watchdog monitors code changes. Valid changes trigger an automatic, monitored server restart via Uvicorn, facilitating live development.
        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚ File System โ”‚ Changes โ”‚  AST Syntax  โ”‚ Checks Code
        โ”‚  Watchdog   โ”‚ Detects โ”‚   Checker    โ”‚ Validity
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚ Valid Change           โ”‚
               โ–ผ                        โ–ผ
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 โ”‚    Uvicorn Server         โ”‚โ—„โ”€โ”€โ”€ โ”‚  Reload  โ”‚ Triggers Restart
 โ”‚ (Handles HTTP, WS, SSE)   โ”‚     โ”‚ Process  โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Pipeline State Inspector & MCP Tools

The system provides comprehensive debugging and state inspection capabilities through MCP tools and real-time monitoring:

๐Ÿ“Š PIPELINE STATE INSPECTOR
โ”œโ”€โ”€โ”€ ๐Ÿ” Discovering active workflows...
โ”œโ”€โ”€โ”€ โšก Found 3 running processes
โ”œโ”€โ”€โ”€ ๐ŸŽฏ Step 2/5: Processing data transformations
โ””โ”€โ”€โ”€ โœจ Ready for next interaction!

๐Ÿค– MCP TOOL CALLS
โ”œโ”€โ”€โ”€ ๐Ÿ“ก Connecting to Botify API...
โ”œโ”€โ”€โ”€ ๐Ÿ” Authentication successful
โ”œโ”€โ”€โ”€ ๐Ÿ“Š Fetching schema (4,449 fields discovered!)
โ””โ”€โ”€โ”€ ๐Ÿ’พ Caching results for lightning-fast access

The Deeper Philosophy: Why This Matters

Pipulate represents more than technology choices โ€” it's a statement about computing sovereignty and the future of human-AI collaboration.

The Bootstrap Paradox Solved

How do you "lift yourself up by your bootstraps"? The answer: you're not a closed system. Humans interact with reality through interfaces, just like software components. We are "human apps with reality APIs."

This pattern repeats at every scale โ€” from quantum fields to societies. The art lies in choosing the right granularity for these interfaces. Too abstract, and you lose control. Too granular, and you drown in complexity.

Every API is a Compromise

The most successful APIs are durable โ€” they become the "laws of physics" for their domain. In reality: the laws of physics, chemistry, biology. In tech: logic gates, operating systems, protocols like HTTP and HTML.

Pipulate chooses these durable APIs deliberately, creating a future-proof foundation for AI-assisted development that will outlast the current framework churn.

Writing for the Future

This documentation serves multiple audiences: humans seeking immediate productivity, and AI systems learning to collaborate with human creativity. The explicit, observable nature of Pipulate workflows creates perfect training data for the next generation of AI assistants.

Final Thoughts

Pipulate offers a unique approach to building local, AI-assisted applications, prioritizing simplicity, user control, and reproducibility over conventional scaling patterns. By understanding its core concepts and embracing its philosophy, developers can create powerful workflows, and end-users can benefit from AI guidance with complete flexibility in deployment options.

Remember the guiding principles:

  1. Keep it simple.
  2. Support local-first with cloud integration options.
  3. Embrace the unconventional while remaining practical.
  4. Choose durable foundations that work with any approach.
  5. Build for both human creativity and AI collaborationโ€”local or cloud.

The Bottom Line: Pipulate doesn't reject the modern AI ecosystemโ€”it provides a structured foundation that works with any AI service. Whether you're using Claude via API, ChatGPT for reasoning, or local models for privacy, Pipulate gives you the workflow framework to orchestrate them all effectively. It's not about choosing sides in the AI warsโ€”it's about having the right tool for any job.


Developer's Notes

The Pipulate Workshop

The repository includes not only polished plugins but also experimental scripts and notebooks under development (e.g., in the root directory or marked with xx_ prefix in plugin directories). These represent ongoing work and exploration.

Plugin Development Conventions

Auto-Registration Behavior

  • Numeric Prefixes: Files like workflows/10_hello_flow.py are registered as hello_flow (number stripped for internal name, used for menu order).
  • Parentheses Skip: Files with () in the name (e.g., hello_flow (Copy).py) are skipped โ€“ useful for temporary copies during development.
  • xx_ Prefix Skip: Files prefixed with xx_ (e.g., xx_experimental_flow.py) are skipped โ€“ useful for keeping unfinished work in the plugin directories without activating it.

Workflow for Creating New Plugins

  1. Copy: Copy a template to my_flow (Copy).py.
  2. Modify: Develop your workflow. It won't auto-register yet.
  3. Test: Rename to xx_my_flow.py. The server should auto-reload. Test thoroughly.
  4. Deploy: Rename to ##_my_flow.py to assign menu order and activate.

Git History Considerations

Use git mv for simple renames (like xx_ to numbered prefix) to preserve history. Document more complex renames in commit messages.

git mv workflows/xx_my_flow.py workflows/##_my_flow.py
git commit -m "Feat: Promote workflow xx_my_flow.py to ##_my_flow.py"

About This README: Single Source of Truth Documentation

This README serves as the upstream source of truth for all Pipulate documentation across GitHub, Pipulate.com, and the built-in app documentation. Changes made here automatically cascade to all other documentation surfaces.

The ASCII Art Synchronization System

๐ŸŒŠ THE UPSTREAM TRUTH CASCADE
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

     ๐Ÿ“œ Source Code Reality (The Ultimate Truth)
                         โ”‚
                         โ–ผ
     ๐Ÿ“„ README.md (Single Source of Truth)
                 โ”œโ”€ ASCII Art Blocks (Visual Truth)
                 โ”œโ”€ HTML Comment Keys (Metadata)
                 โ””โ”€ 80-Hyphen Pagination (Structure)
                         โ”‚
          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ–ผ              โ–ผ                  โ–ผ
   ๐ŸŒ GitHub Page  ๐Ÿ“š Pipulate.com  ๐Ÿ”ง Built-in Docs
   (Auto-display)  (Jekyll Build)   (Live Integration)
          โ”‚              โ”‚                  โ”‚
          โ–ผ              โ–ผ                  โ–ผ
   ๐Ÿ“Š Screenshots     ๐ŸŽฌ Demos           ๐Ÿงช Tests
     (Future)         (Future)           (Future)

How it works:

  • ASCII Art Blocks: Visual diagrams are automatically extracted and distributed to other documentation files
  • HTML Comment Keys: Headlines marked with <!-- key: identifier --> serve as reference anchors
  • 80-Hyphen Pagination: Section dividers enable automatic document structuring
  • Automatic Synchronization: Running python helpers/docs_sync/sync_ascii_art.py updates all documentation

This creates "ASCII art peer pressure" โ€” when visual diagrams change, they compel surrounding text to be updated for consistency, ensuring documentation accuracy across the entire ecosystem.

Roadmap

Core & Workflow Enhancements:

  • Dev, Test, and Prod database switching
  • Saving source HTML and rendered DOM of any URL
  • Botify data export CSV save (incorporating robust polling)
  • Full web form field support (textarea, dropdown, checkboxes, radio buttons)
  • Generic support for Anywidgets
  • Utility for deleting garbage tables from plugin experimentation

AI / LLM Integration:

  • LLM inspection of any local data object (RAG-style functionality)
  • Various memory types for LLM context (vector embedding, graph, key/val-store)
  • Enabling the local LLM to be an MCP Client

Automation & External Interaction:

  • MCP Server for automated web browsing and similar tasks

Included PrismJS Highlighting

THEMES

  • Okaidia ocodia 1.77KB

LANGUAGES

  • CSS1.71KB
  • Markup + HTML + XML + SVG + MathML + SSML + Atom + RSS4.64KB
  • C-like0.83KB
  • JavaScript6.18KB
  • Bash + Shell + Shell zeitgeist87 8.96KB
  • Diff uranusjr 1.33KB
  • JSON + Web App Manifest CupOfTea696 0.58KB
  • JSON5 RunDevelopment 0.52KB
  • JSONP RunDevelopment 0.23KB
  • Liquid cinhtau 2.56KB
  • Lua Golmote 0.74KB
  • Markdown Golmote 10.43KB
  • Markup templating
  • Mermaid RunDevelopment 3.03KB
  • Nix Golmote 1.47KB
  • Python multipetros 2.45KB
  • Regex RunDevelopment 2.33KB
  • YAML hason 3.11KB

PLUGINS

  • Line Highlight11.66KB
  • Line Numbers kuba-kubula 7.23KB
  • Toolbar mAAdhaTTah 5.63KB

Contributing

Contributions are welcome! Please adhere to the project's core philosophy:

  • Maintain Local-First Simplicity (No multi-tenant patterns, complex ORMs, heavy client-side state).
  • Respect Server-Side State (Use DictLikeDB/JSON for workflows, MiniDataAPI for CRUD).
  • Preserve the Workflow Pipeline Pattern (Keep steps linear, state explicit).
  • Honor Integrated Features (Don't disrupt core LLM/Jupyter integration unless enhancing local goals).

License

This project is licensed under the MIT License. See the LICENSE file for details.

Resources

Background Articles: Mike Levin, AI SEO in NYC

Enhanced Documentation: Pipulate AI SEO Software

On GitHub: Pipulate on GitHub

Project details


Release history Release notifications | RSS feed

This version

1.1.1

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pipulate-1.1.1.tar.gz (570.8 kB view details)

Uploaded Source

Built Distribution

pipulate-1.1.1-py3-none-any.whl (579.0 kB view details)

Uploaded Python 3

File details

Details for the file pipulate-1.1.1.tar.gz.

File metadata

  • Download URL: pipulate-1.1.1.tar.gz
  • Upload date:
  • Size: 570.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.11

File hashes

Hashes for pipulate-1.1.1.tar.gz
Algorithm Hash digest
SHA256 6cfcdef678b5c1a1017fdd301071285936aec3696309aa32055967b2c02a0804
MD5 246b9acfbb195434ac7929b0eb6130cb
BLAKE2b-256 5d351b92f28752d6b2cc54251deb1fcae0bd4c7fe00f44267e49e278e8a8a475

See more details on using hashes here.

File details

Details for the file pipulate-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: pipulate-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 579.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.11

File hashes

Hashes for pipulate-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2aebccc2c998f544fb0546ac8c068dbed7241ac04891a3a98aec9445f21acadb
MD5 34dd6168b60f378fe9c031331e8a0fc7
BLAKE2b-256 ccfd8d2b3c837e151bb9df72276bc9725ec79e9124b6e69e3bece337cbafebd9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page