pipulate 1.99__tar.gz → 2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pipulate-2.2/MANIFEST.in +5 -0
- {pipulate-1.99 → pipulate-2.2}/PKG-INFO +44 -32
- {pipulate-1.99 → pipulate-2.2}/README.md +40 -28
- {pipulate-1.99 → pipulate-2.2}/__init__.py +9 -5
- {pipulate-1.99 → pipulate-2.2}/apps/010_introduction.py +33 -12
- {pipulate-1.99 → pipulate-2.2}/apps/015_config.py +65 -32
- {pipulate-1.99 → pipulate-2.2}/apps/020_profiles.py +3 -11
- {pipulate-1.99 → pipulate-2.2}/apps/030_roles.py +17 -268
- {pipulate-1.99 → pipulate-2.2}/apps/040_hello_workflow.py +8 -14
- {pipulate-1.99 → pipulate-2.2}/apps/060_tasks.py +2 -5
- {pipulate-1.99 → pipulate-2.2}/apps/070_history.py +4 -4
- {pipulate-1.99 → pipulate-2.2}/apps/110_parameter_buster.py +20 -20
- {pipulate-1.99 → pipulate-2.2}/apps/120_link_graph.py +22 -22
- {pipulate-1.99 → pipulate-2.2}/apps/130_gap_analysis.py +8 -9
- {pipulate-1.99 → pipulate-2.2}/apps/200_workflow_genesis.py +5 -6
- {pipulate-1.99 → pipulate-2.2}/apps/210_widget_examples.py +35 -35
- {pipulate-1.99 → pipulate-2.2}/apps/230_dev_assistant.py +12 -13
- {pipulate-1.99 → pipulate-2.2}/apps/240_simon_mcp.py +6 -7
- {pipulate-1.99 → pipulate-2.2}/apps/300_blank_placeholder.py +4 -11
- {pipulate-1.99 → pipulate-2.2}/apps/400_botify_trifecta.py +13 -13
- {pipulate-1.99 → pipulate-2.2}/apps/440_browser_automation.py +67 -24
- {pipulate-1.99 → pipulate-2.2}/apps/450_stream_simulator.py +1 -1
- {pipulate-1.99 → pipulate-2.2}/apps/510_text_field.py +5 -5
- {pipulate-1.99 → pipulate-2.2}/apps/520_text_area.py +5 -5
- {pipulate-1.99 → pipulate-2.2}/apps/530_dropdown.py +6 -6
- {pipulate-1.99 → pipulate-2.2}/apps/540_checkboxes.py +6 -6
- {pipulate-1.99 → pipulate-2.2}/apps/550_radios.py +6 -6
- {pipulate-1.99 → pipulate-2.2}/apps/560_range.py +6 -6
- {pipulate-1.99 → pipulate-2.2}/apps/570_switch.py +4 -4
- {pipulate-1.99 → pipulate-2.2}/apps/580_upload.py +9 -9
- {pipulate-1.99 → pipulate-2.2}/apps/610_markdown.py +4 -4
- {pipulate-1.99 → pipulate-2.2}/apps/620_mermaid.py +4 -4
- {pipulate-1.99 → pipulate-2.2}/apps/630_prism.py +4 -4
- {pipulate-1.99 → pipulate-2.2}/apps/640_javascript.py +5 -5
- {pipulate-1.99 → pipulate-2.2}/apps/710_pandas.py +5 -5
- {pipulate-1.99 → pipulate-2.2}/apps/720_rich.py +5 -5
- {pipulate-1.99 → pipulate-2.2}/apps/730_matplotlib.py +5 -5
- {pipulate-1.99 → pipulate-2.2}/apps/810_webbrowser.py +4 -4
- {pipulate-1.99 → pipulate-2.2}/apps/820_selenium.py +4 -4
- {pipulate-1.99 → pipulate-2.2}/apps/830_pico_slider.py +6 -7
- {pipulate-1.99 → pipulate-2.2}/cli.py +17 -14
- {pipulate-1.99 → pipulate-2.2}/config.py +0 -38
- pipulate-2.2/imports/ascii_displays.py +2555 -0
- {pipulate-1.99 → pipulate-2.2}/imports/botify/true_schema_discoverer.py +136 -28
- {pipulate-1.99 → pipulate-2.2}/imports/crud.py +7 -428
- pipulate-2.2/imports/durable_backup_system.py +215 -0
- {pipulate-1.99 → pipulate-2.2}/imports/stream_orchestrator.py +37 -0
- {pipulate-1.99 → pipulate-2.2}/imports/voice_synthesis.py +49 -3
- {pipulate-1.99 → pipulate-2.2}/pipulate/core.py +3 -2
- {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/PKG-INFO +44 -32
- {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/SOURCES.txt +2 -2
- {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/top_level.txt +0 -2
- {pipulate-1.99 → pipulate-2.2}/pyproject.toml +6 -6
- {pipulate-1.99 → pipulate-2.2}/server.py +22 -29
- pipulate-2.2/tests/test_mck_rep2.py +157 -0
- {pipulate-1.99 → pipulate-2.2}/tools/dom_tools.py +35 -24
- {pipulate-1.99 → pipulate-2.2}/tools/llm_optics.py +148 -0
- pipulate-2.2/tools/scraper_tools.py +993 -0
- pipulate-1.99/apps/xx_link_graph_v2.py +0 -6243
- pipulate-1.99/imports/ascii_displays.py +0 -1292
- pipulate-1.99/imports/durable_backup_system.py +0 -600
- pipulate-1.99/pipulate/pipulate.py +0 -62
- pipulate-1.99/tools/scraper_tools.py +0 -481
- {pipulate-1.99 → pipulate-2.2}/LICENSE +0 -0
- {pipulate-1.99 → pipulate-2.2}/apps/025_aspect.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/apps/050_documentation.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/apps/220_roadmap.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/__init__.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/ai_dictdb.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/ai_tool_discovery_simple_parser.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/append_only_conversation.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/botify/__init__.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/botify/code_generators.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/botify_code_generation.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/database_safety_wrapper.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/dom_processing/__init__.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/dom_processing/ai_dom_beautifier.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/dom_processing/enhanced_dom_processor.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/mcp_orchestrator.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/imports/server_logging.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/pipulate/__init__.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/dependency_links.txt +0 -0
- {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/entry_points.txt +0 -0
- {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/requires.txt +0 -0
- {pipulate-1.99 → pipulate-2.2}/setup.cfg +0 -0
- {pipulate-1.99 → pipulate-2.2}/tools/__init__.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/tools/advanced_automation_tools.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/tools/botify_tools.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/tools/conversation_tools.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/tools/keychain_tools.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/tools/mcp_tools.py +0 -0
- {pipulate-1.99 → pipulate-2.2}/tools/system_tools.py +0 -0
pipulate-2.2/MANIFEST.in
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Work-in-progress plugin sketches (xx_ prefix) never ship to PyPI.
|
|
2
|
+
# Runtime plugin discovery already skips xx_ files; this keeps the sdist
|
|
3
|
+
# — and the wheel `python -m build` derives from it — in agreement with
|
|
4
|
+
# that convention. Fix protects v2.1 forward; the 2.0 artifact is history.
|
|
5
|
+
exclude apps/xx_*.py
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pipulate
|
|
3
|
-
Version:
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 2.2
|
|
4
|
+
Summary: AI-readiness for the agentic web — local-first, Nix-reproducible workflows. The successor to AI SEO software.
|
|
5
5
|
Author-email: Mike Levin <pipulate@gmail.com>
|
|
6
|
-
License-Expression:
|
|
6
|
+
License-Expression: AGPL-3.0-or-later
|
|
7
7
|
Project-URL: Homepage, https://github.com/miklevin/pipulate/
|
|
8
8
|
Project-URL: Bug Tracker, https://github.com/miklevin/pipulate/issues
|
|
9
9
|
Project-URL: Documentation, https://pipulate.com/guide/
|
|
10
|
-
Keywords: seo,ai,llm,automation,local-first,nix,fasthtml,htmx,agentic
|
|
10
|
+
Keywords: ai-readiness,agentic-web,seo,ai,llm,automation,local-first,nix,fasthtml,htmx,agentic,content-negotiation
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
@@ -59,12 +59,17 @@ Dynamic: license-file
|
|
|
59
59
|
2. Hi, Auditor! What you're looking for is AUDIT.md ( https://pipulate.com/AUDIT.md )
|
|
60
60
|
3. And context AI_CONTEXT.md ( https://pipulate.com/AI_CONTEXT.md )
|
|
61
61
|
|
|
62
|
-
# Pipulate: Local First AI
|
|
62
|
+
# Pipulate: Local First AI-Readiness for the Agentic Web
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
>
|
|
64
|
+
```text
|
|
65
|
+
( Like a canary you say? )
|
|
66
|
+
O /) ____ The "No Problem" Framework
|
|
67
|
+
> I HEREBY WILL NOT RE-GENERATE o /)\__// / \ Pipulate - Protecting Your Code
|
|
68
|
+
> Once upon machines be smarten ___(/_ 0 0 | | just by being honest about text.
|
|
69
|
+
> ASCII sealing immutata art in *( ==(_T_)== NPvg | (If mangled, then AI drifted.)
|
|
70
|
+
> This here cony if it's broken \ ) ""\ | | https://pipulate.com
|
|
71
|
+
> Smokin gun drift now in token |__>-\_>_> \____/ 🥕🥕🥕
|
|
72
|
+
```
|
|
68
73
|
|
|
69
74
|
## Quick Start: Be Running in 5 Minutes
|
|
70
75
|
|
|
@@ -78,7 +83,7 @@ curl -fsSL https://pipulate.com/install.sh | bash
|
|
|
78
83
|
|
|
79
84
|
```bash
|
|
80
85
|
# 2. Launch it
|
|
81
|
-
nix develop
|
|
86
|
+
cd ~/pipulate && nix develop
|
|
82
87
|
```
|
|
83
88
|
|
|
84
89
|
**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.
|
|
@@ -107,10 +112,10 @@ nix develop
|
|
|
107
112
|
|
|
108
113
|
**Real examples of what people create with Pipulate:**
|
|
109
114
|
|
|
110
|
-
### 🔍
|
|
115
|
+
### 🔍 Agentic-Web Readiness Workflows (the craft formerly known as SEO)
|
|
111
116
|
- **Keyword Research Pipeline**: Input seed keywords → AI expansion → competition analysis → export spreadsheet
|
|
112
117
|
- **Content Gap Analysis**: Compare your site vs competitors → identify missing topics → prioritized content calendar
|
|
113
|
-
- **Technical
|
|
118
|
+
- **Technical Readiness Audits**: Crawl site → check what agents actually see → generate action items → track fixes
|
|
114
119
|
|
|
115
120
|
### 📊 Data Processing Workflows
|
|
116
121
|
- **CSV Data Cleaning**: Upload messy data → standardize formats → remove duplicates → validate results
|
|
@@ -118,7 +123,7 @@ nix develop
|
|
|
118
123
|
- **Report Generation**: Combine multiple data sources → apply business rules → create branded reports
|
|
119
124
|
|
|
120
125
|
### 🤖 AI-Assisted Workflows
|
|
121
|
-
- **Content Creation Pipeline**: Research topics → generate outlines → write drafts → optimize for
|
|
126
|
+
- **Content Creation Pipeline**: Research topics → generate outlines → write drafts → optimize for machine readers
|
|
122
127
|
- **Data Analysis Helper**: Upload spreadsheet → AI suggests insights → create visualizations → export findings
|
|
123
128
|
|
|
124
129
|
**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.
|
|
@@ -127,7 +132,7 @@ nix develop
|
|
|
127
132
|
|
|
128
133
|
```text
|
|
129
134
|
╔═════════════════════════════════════════════════════════════════════════╗ Chip O'What?
|
|
130
|
-
║ 🎭 PIPULATE: LOCAL-FIRST AI
|
|
135
|
+
║ 🎭 PIPULATE: LOCAL-FIRST AI-READINESS & DIGITAL WORKSHOP ║ , O
|
|
131
136
|
║ ────────────────────────────────────────────────────────────────────── ║ \\ . O
|
|
132
137
|
║ ║ |\\/| o
|
|
133
138
|
║ 💬 Chip O'Theseus: "Welcome to your sovereign computing environment!" ║ / " '\
|
|
@@ -172,7 +177,7 @@ Think of it as putting guardrails on AI assistance. Instead of asking an AI to "
|
|
|
172
177
|
3. 📓 **Transforms Jupyter Notebooks** into production-ready, step-by-step workflows
|
|
173
178
|
4. 🤖 **Integrated AI assistance** using your own local models with complete privacy
|
|
174
179
|
5. 🔧 **Reproducible environments** with Nix that work identically across all platforms
|
|
175
|
-
6. 🎯 **Perfect for
|
|
180
|
+
6. 🎯 **Perfect for practitioners readying clients for the agentic web** who want to turn technical expertise into guided, reusable workflows
|
|
176
181
|
|
|
177
182
|
--------------------------------------------------------------------------------
|
|
178
183
|
|
|
@@ -272,7 +277,7 @@ If you are not an Empire builder and prefer craftsmanship over the rat race and
|
|
|
272
277
|
|
|
273
278
|
### Primary Goals
|
|
274
279
|
|
|
275
|
-
1. **Empower End-Users (e.g.,
|
|
280
|
+
1. **Empower End-Users (e.g., Agentic-Web Practitioners):** Enable non-programmers to run powerful, AI-guided workflows (often ported from Jupyter Notebooks) without needing to interact with Python code directly.
|
|
276
281
|
2. **Serve Developers:** Provide a simple, reproducible environment for building these workflows, leveraging integrated tooling like Jupyter, local LLMs, and a streamlined web framework.
|
|
277
282
|
|
|
278
283
|
--------------------------------------------------------------------------------
|
|
@@ -564,12 +569,19 @@ The installation procedures labeled "Quick Start Guide" and the main installatio
|
|
|
564
569
|
|
|
565
570
|
```bash
|
|
566
571
|
rm -rf ~/TestProject
|
|
567
|
-
curl -
|
|
572
|
+
curl -fsSL https://pipulate.com/install.sh | bash -s TestProject
|
|
568
573
|
cd ~/TestProject
|
|
569
|
-
|
|
574
|
+
nix develop
|
|
570
575
|
```
|
|
571
576
|
|
|
572
|
-
Wait for
|
|
577
|
+
Wait for the JupyterLab tab to auto-open, then run the Onboarding notebook to unlock the Pipulate app.
|
|
578
|
+
|
|
579
|
+
**Automating past the boot menu:** `nix develop` ends at a two-door prompt — start Pipulate, or drop to the shell. It fails open, so anything without a terminal (CI, a provisioning script, an SSH session with no tty) starts the app and never sees the prompt. Two environment variables cover the cases that do:
|
|
580
|
+
|
|
581
|
+
| Variable | Effect |
|
|
582
|
+
|----------|--------|
|
|
583
|
+
| `PIPULATE_BOOT_MENU=0` | Skip the prompt entirely and start the app, e.g. `PIPULATE_BOOT_MENU=0 nix develop`. For an unattended terminal that would otherwise wait for a keypress that never comes. |
|
|
584
|
+
| `PIPULATE_BOOT_MENU_TIMEOUT=10` | Keep the prompt, but start the app after N seconds if nobody chooses. Off by default — with a human provably present, the prompt waits indefinitely rather than starting something they didn't ask for. |
|
|
573
585
|
|
|
574
586
|
### 🚨 Installation Troubleshooting
|
|
575
587
|
|
|
@@ -690,7 +702,7 @@ Are you a Developer or an End User? Chef or Customer? Understanding your audienc
|
|
|
690
702
|
### 👨🍳 The Chef (Developer/Technical User)
|
|
691
703
|
* **🔧 Workflow Creators:** Build and customize AI-assisted workflows
|
|
692
704
|
* **📓 Jupyter Porters:** Convert notebook experiments into guided applications
|
|
693
|
-
* **🔍 Technical SEOs:** Create sophisticated, reusable
|
|
705
|
+
* **🔍 Technical SEOs (and their successors):** Create sophisticated, reusable readiness processes
|
|
694
706
|
* **⚙️ System Administrators:** Deploy consistent environments across teams
|
|
695
707
|
|
|
696
708
|
**What Chefs Get:**
|
|
@@ -700,10 +712,10 @@ Are you a Developer or an End User? Chef or Customer? Understanding your audienc
|
|
|
700
712
|
- 🧰 Integrated tooling (Jupyter, local LLM, SQLite)
|
|
701
713
|
|
|
702
714
|
### 🍽️ The Customer (End User/Non-Technical)
|
|
703
|
-
* **📈
|
|
704
|
-
* **✍️ Content Creators:** Use AI-assisted processes for
|
|
705
|
-
* **📊 Marketing Teams:** Execute consistent
|
|
706
|
-
* **🏢 Business Owners:** Access enterprise-level
|
|
715
|
+
* **📈 Agentic-Web Practitioners:** Run powerful workflows without coding
|
|
716
|
+
* **✍️ Content Creators:** Use AI-assisted processes for machine legibility
|
|
717
|
+
* **📊 Marketing Teams:** Execute consistent agentic-web strategies
|
|
718
|
+
* **🏢 Business Owners:** Access enterprise-level readiness capabilities
|
|
707
719
|
|
|
708
720
|
**What Customers Get:**
|
|
709
721
|
- 🚶♂️ Guided, step-by-step workflow experiences
|
|
@@ -719,9 +731,9 @@ Just as a chef talks about knife techniques while a diner just wants amazing pas
|
|
|
719
731
|
**After installation succeeds, here's what to expect:**
|
|
720
732
|
|
|
721
733
|
### What You'll See
|
|
722
|
-
1. **
|
|
734
|
+
1. **JupyterLab opens automatically** for onboarding. Completing the Onboarding notebook unlocks the Pipulate app, which then opens automatically on future launches:
|
|
735
|
+
- `localhost:8888` - JupyterLab for development/experimentation (opens first)
|
|
723
736
|
- `localhost:5001` - Pipulate web interface with navigation menu
|
|
724
|
-
- `localhost:8888` - JupyterLab for development/experimentation
|
|
725
737
|
|
|
726
738
|
2. **In the Pipulate interface:**
|
|
727
739
|
- Left sidebar with workflow plugins (Introduction, Profiles, etc.)
|
|
@@ -738,7 +750,7 @@ Just as a chef talks about knife techniques while a diner just wants amazing pas
|
|
|
738
750
|
|
|
739
751
|
### Your Next Steps Depend on Who You Are
|
|
740
752
|
|
|
741
|
-
**🔍 If you're
|
|
753
|
+
**🔍 If you're readying clients for the agentic web:**
|
|
742
754
|
- Click "Introduction" in the left menu for a guided tour
|
|
743
755
|
- Try the built-in workflows to see the step-by-step pattern
|
|
744
756
|
- Use the AI chat to ask "How do I create a keyword research workflow?"
|
|
@@ -820,11 +832,11 @@ Traditional development follows DRY principles, creating abstract, complex syste
|
|
|
820
832
|
|
|
821
833
|
## Developer Setup & Environment Notes
|
|
822
834
|
|
|
823
|
-
**Nix Environment Activation:** Always run
|
|
835
|
+
**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`.
|
|
824
836
|
|
|
825
837
|
**Interactive vs. Quiet Shell:**
|
|
826
838
|
|
|
827
|
-
**Standard Shell:**
|
|
839
|
+
**Standard Shell:** `nix develop` (the same as `nix develop .#default`) runs the startup script (`run-script` defined in `flake.nix`) with welcome messages and service startup. Ideal for general use.
|
|
828
840
|
|
|
829
841
|
**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:
|
|
830
842
|
- Running specific commands without starting the servers (e.g., `nix develop .#quiet --command python -c "import pandas"`).
|
|
@@ -1407,10 +1419,10 @@ create_workflow.py │ └──────┬──────
|
|
|
1407
1419
|
### Essential Commands
|
|
1408
1420
|
```bash
|
|
1409
1421
|
# Development workflow
|
|
1410
|
-
cd ~/pipulate &&
|
|
1422
|
+
cd ~/pipulate && nix develop # Start Pipulate
|
|
1411
1423
|
nix develop .#quiet # Start without auto-services
|
|
1412
1424
|
python server.py # Manual server start
|
|
1413
|
-
git pull &&
|
|
1425
|
+
git pull && nix develop # Update to latest
|
|
1414
1426
|
|
|
1415
1427
|
# Create new workflows
|
|
1416
1428
|
python helpers/workflow/create_workflow.py my_workflow.py MyClass my_internal_name
|
|
@@ -1702,6 +1714,6 @@ This project is licensed under the MIT License. See the [LICENSE](https://github
|
|
|
1702
1714
|
|
|
1703
1715
|
**Background Articles:** <a href="https://mikelev.in/">Mike Levin, AI SEO in NYC</a>
|
|
1704
1716
|
|
|
1705
|
-
**Enhanced Documentation:** <a href="https://pipulate.com/">Pipulate AI
|
|
1717
|
+
**Enhanced Documentation:** <a href="https://pipulate.com/">Pipulate: AI-Readiness for the Agentic Web</a>
|
|
1706
1718
|
|
|
1707
1719
|
**On GitHub:** <a href="https://github.com/miklevin/pipulate">Pipulate on GitHub</a>
|
|
@@ -2,12 +2,17 @@
|
|
|
2
2
|
2. Hi, Auditor! What you're looking for is AUDIT.md ( https://pipulate.com/AUDIT.md )
|
|
3
3
|
3. And context AI_CONTEXT.md ( https://pipulate.com/AI_CONTEXT.md )
|
|
4
4
|
|
|
5
|
-
# Pipulate: Local First AI
|
|
5
|
+
# Pipulate: Local First AI-Readiness for the Agentic Web
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
>
|
|
7
|
+
```text
|
|
8
|
+
( Like a canary you say? )
|
|
9
|
+
O /) ____ The "No Problem" Framework
|
|
10
|
+
> I HEREBY WILL NOT RE-GENERATE o /)\__// / \ Pipulate - Protecting Your Code
|
|
11
|
+
> Once upon machines be smarten ___(/_ 0 0 | | just by being honest about text.
|
|
12
|
+
> ASCII sealing immutata art in *( ==(_T_)== NPvg | (If mangled, then AI drifted.)
|
|
13
|
+
> This here cony if it's broken \ ) ""\ | | https://pipulate.com
|
|
14
|
+
> Smokin gun drift now in token |__>-\_>_> \____/ 🥕🥕🥕
|
|
15
|
+
```
|
|
11
16
|
|
|
12
17
|
## Quick Start: Be Running in 5 Minutes
|
|
13
18
|
|
|
@@ -21,7 +26,7 @@ curl -fsSL https://pipulate.com/install.sh | bash
|
|
|
21
26
|
|
|
22
27
|
```bash
|
|
23
28
|
# 2. Launch it
|
|
24
|
-
nix develop
|
|
29
|
+
cd ~/pipulate && nix develop
|
|
25
30
|
```
|
|
26
31
|
|
|
27
32
|
**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.
|
|
@@ -50,10 +55,10 @@ nix develop
|
|
|
50
55
|
|
|
51
56
|
**Real examples of what people create with Pipulate:**
|
|
52
57
|
|
|
53
|
-
### 🔍
|
|
58
|
+
### 🔍 Agentic-Web Readiness Workflows (the craft formerly known as SEO)
|
|
54
59
|
- **Keyword Research Pipeline**: Input seed keywords → AI expansion → competition analysis → export spreadsheet
|
|
55
60
|
- **Content Gap Analysis**: Compare your site vs competitors → identify missing topics → prioritized content calendar
|
|
56
|
-
- **Technical
|
|
61
|
+
- **Technical Readiness Audits**: Crawl site → check what agents actually see → generate action items → track fixes
|
|
57
62
|
|
|
58
63
|
### 📊 Data Processing Workflows
|
|
59
64
|
- **CSV Data Cleaning**: Upload messy data → standardize formats → remove duplicates → validate results
|
|
@@ -61,7 +66,7 @@ nix develop
|
|
|
61
66
|
- **Report Generation**: Combine multiple data sources → apply business rules → create branded reports
|
|
62
67
|
|
|
63
68
|
### 🤖 AI-Assisted Workflows
|
|
64
|
-
- **Content Creation Pipeline**: Research topics → generate outlines → write drafts → optimize for
|
|
69
|
+
- **Content Creation Pipeline**: Research topics → generate outlines → write drafts → optimize for machine readers
|
|
65
70
|
- **Data Analysis Helper**: Upload spreadsheet → AI suggests insights → create visualizations → export findings
|
|
66
71
|
|
|
67
72
|
**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.
|
|
@@ -70,7 +75,7 @@ nix develop
|
|
|
70
75
|
|
|
71
76
|
```text
|
|
72
77
|
╔═════════════════════════════════════════════════════════════════════════╗ Chip O'What?
|
|
73
|
-
║ 🎭 PIPULATE: LOCAL-FIRST AI
|
|
78
|
+
║ 🎭 PIPULATE: LOCAL-FIRST AI-READINESS & DIGITAL WORKSHOP ║ , O
|
|
74
79
|
║ ────────────────────────────────────────────────────────────────────── ║ \\ . O
|
|
75
80
|
║ ║ |\\/| o
|
|
76
81
|
║ 💬 Chip O'Theseus: "Welcome to your sovereign computing environment!" ║ / " '\
|
|
@@ -115,7 +120,7 @@ Think of it as putting guardrails on AI assistance. Instead of asking an AI to "
|
|
|
115
120
|
3. 📓 **Transforms Jupyter Notebooks** into production-ready, step-by-step workflows
|
|
116
121
|
4. 🤖 **Integrated AI assistance** using your own local models with complete privacy
|
|
117
122
|
5. 🔧 **Reproducible environments** with Nix that work identically across all platforms
|
|
118
|
-
6. 🎯 **Perfect for
|
|
123
|
+
6. 🎯 **Perfect for practitioners readying clients for the agentic web** who want to turn technical expertise into guided, reusable workflows
|
|
119
124
|
|
|
120
125
|
--------------------------------------------------------------------------------
|
|
121
126
|
|
|
@@ -215,7 +220,7 @@ If you are not an Empire builder and prefer craftsmanship over the rat race and
|
|
|
215
220
|
|
|
216
221
|
### Primary Goals
|
|
217
222
|
|
|
218
|
-
1. **Empower End-Users (e.g.,
|
|
223
|
+
1. **Empower End-Users (e.g., Agentic-Web Practitioners):** Enable non-programmers to run powerful, AI-guided workflows (often ported from Jupyter Notebooks) without needing to interact with Python code directly.
|
|
219
224
|
2. **Serve Developers:** Provide a simple, reproducible environment for building these workflows, leveraging integrated tooling like Jupyter, local LLMs, and a streamlined web framework.
|
|
220
225
|
|
|
221
226
|
--------------------------------------------------------------------------------
|
|
@@ -507,12 +512,19 @@ The installation procedures labeled "Quick Start Guide" and the main installatio
|
|
|
507
512
|
|
|
508
513
|
```bash
|
|
509
514
|
rm -rf ~/TestProject
|
|
510
|
-
curl -
|
|
515
|
+
curl -fsSL https://pipulate.com/install.sh | bash -s TestProject
|
|
511
516
|
cd ~/TestProject
|
|
512
|
-
|
|
517
|
+
nix develop
|
|
513
518
|
```
|
|
514
519
|
|
|
515
|
-
Wait for
|
|
520
|
+
Wait for the JupyterLab tab to auto-open, then run the Onboarding notebook to unlock the Pipulate app.
|
|
521
|
+
|
|
522
|
+
**Automating past the boot menu:** `nix develop` ends at a two-door prompt — start Pipulate, or drop to the shell. It fails open, so anything without a terminal (CI, a provisioning script, an SSH session with no tty) starts the app and never sees the prompt. Two environment variables cover the cases that do:
|
|
523
|
+
|
|
524
|
+
| Variable | Effect |
|
|
525
|
+
|----------|--------|
|
|
526
|
+
| `PIPULATE_BOOT_MENU=0` | Skip the prompt entirely and start the app, e.g. `PIPULATE_BOOT_MENU=0 nix develop`. For an unattended terminal that would otherwise wait for a keypress that never comes. |
|
|
527
|
+
| `PIPULATE_BOOT_MENU_TIMEOUT=10` | Keep the prompt, but start the app after N seconds if nobody chooses. Off by default — with a human provably present, the prompt waits indefinitely rather than starting something they didn't ask for. |
|
|
516
528
|
|
|
517
529
|
### 🚨 Installation Troubleshooting
|
|
518
530
|
|
|
@@ -633,7 +645,7 @@ Are you a Developer or an End User? Chef or Customer? Understanding your audienc
|
|
|
633
645
|
### 👨🍳 The Chef (Developer/Technical User)
|
|
634
646
|
* **🔧 Workflow Creators:** Build and customize AI-assisted workflows
|
|
635
647
|
* **📓 Jupyter Porters:** Convert notebook experiments into guided applications
|
|
636
|
-
* **🔍 Technical SEOs:** Create sophisticated, reusable
|
|
648
|
+
* **🔍 Technical SEOs (and their successors):** Create sophisticated, reusable readiness processes
|
|
637
649
|
* **⚙️ System Administrators:** Deploy consistent environments across teams
|
|
638
650
|
|
|
639
651
|
**What Chefs Get:**
|
|
@@ -643,10 +655,10 @@ Are you a Developer or an End User? Chef or Customer? Understanding your audienc
|
|
|
643
655
|
- 🧰 Integrated tooling (Jupyter, local LLM, SQLite)
|
|
644
656
|
|
|
645
657
|
### 🍽️ The Customer (End User/Non-Technical)
|
|
646
|
-
* **📈
|
|
647
|
-
* **✍️ Content Creators:** Use AI-assisted processes for
|
|
648
|
-
* **📊 Marketing Teams:** Execute consistent
|
|
649
|
-
* **🏢 Business Owners:** Access enterprise-level
|
|
658
|
+
* **📈 Agentic-Web Practitioners:** Run powerful workflows without coding
|
|
659
|
+
* **✍️ Content Creators:** Use AI-assisted processes for machine legibility
|
|
660
|
+
* **📊 Marketing Teams:** Execute consistent agentic-web strategies
|
|
661
|
+
* **🏢 Business Owners:** Access enterprise-level readiness capabilities
|
|
650
662
|
|
|
651
663
|
**What Customers Get:**
|
|
652
664
|
- 🚶♂️ Guided, step-by-step workflow experiences
|
|
@@ -662,9 +674,9 @@ Just as a chef talks about knife techniques while a diner just wants amazing pas
|
|
|
662
674
|
**After installation succeeds, here's what to expect:**
|
|
663
675
|
|
|
664
676
|
### What You'll See
|
|
665
|
-
1. **
|
|
677
|
+
1. **JupyterLab opens automatically** for onboarding. Completing the Onboarding notebook unlocks the Pipulate app, which then opens automatically on future launches:
|
|
678
|
+
- `localhost:8888` - JupyterLab for development/experimentation (opens first)
|
|
666
679
|
- `localhost:5001` - Pipulate web interface with navigation menu
|
|
667
|
-
- `localhost:8888` - JupyterLab for development/experimentation
|
|
668
680
|
|
|
669
681
|
2. **In the Pipulate interface:**
|
|
670
682
|
- Left sidebar with workflow plugins (Introduction, Profiles, etc.)
|
|
@@ -681,7 +693,7 @@ Just as a chef talks about knife techniques while a diner just wants amazing pas
|
|
|
681
693
|
|
|
682
694
|
### Your Next Steps Depend on Who You Are
|
|
683
695
|
|
|
684
|
-
**🔍 If you're
|
|
696
|
+
**🔍 If you're readying clients for the agentic web:**
|
|
685
697
|
- Click "Introduction" in the left menu for a guided tour
|
|
686
698
|
- Try the built-in workflows to see the step-by-step pattern
|
|
687
699
|
- Use the AI chat to ask "How do I create a keyword research workflow?"
|
|
@@ -763,11 +775,11 @@ Traditional development follows DRY principles, creating abstract, complex syste
|
|
|
763
775
|
|
|
764
776
|
## Developer Setup & Environment Notes
|
|
765
777
|
|
|
766
|
-
**Nix Environment Activation:** Always run
|
|
778
|
+
**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`.
|
|
767
779
|
|
|
768
780
|
**Interactive vs. Quiet Shell:**
|
|
769
781
|
|
|
770
|
-
**Standard Shell:**
|
|
782
|
+
**Standard Shell:** `nix develop` (the same as `nix develop .#default`) runs the startup script (`run-script` defined in `flake.nix`) with welcome messages and service startup. Ideal for general use.
|
|
771
783
|
|
|
772
784
|
**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:
|
|
773
785
|
- Running specific commands without starting the servers (e.g., `nix develop .#quiet --command python -c "import pandas"`).
|
|
@@ -1350,10 +1362,10 @@ create_workflow.py │ └──────┬──────
|
|
|
1350
1362
|
### Essential Commands
|
|
1351
1363
|
```bash
|
|
1352
1364
|
# Development workflow
|
|
1353
|
-
cd ~/pipulate &&
|
|
1365
|
+
cd ~/pipulate && nix develop # Start Pipulate
|
|
1354
1366
|
nix develop .#quiet # Start without auto-services
|
|
1355
1367
|
python server.py # Manual server start
|
|
1356
|
-
git pull &&
|
|
1368
|
+
git pull && nix develop # Update to latest
|
|
1357
1369
|
|
|
1358
1370
|
# Create new workflows
|
|
1359
1371
|
python helpers/workflow/create_workflow.py my_workflow.py MyClass my_internal_name
|
|
@@ -1645,6 +1657,6 @@ This project is licensed under the MIT License. See the [LICENSE](https://github
|
|
|
1645
1657
|
|
|
1646
1658
|
**Background Articles:** <a href="https://mikelev.in/">Mike Levin, AI SEO in NYC</a>
|
|
1647
1659
|
|
|
1648
|
-
**Enhanced Documentation:** <a href="https://pipulate.com/">Pipulate AI
|
|
1660
|
+
**Enhanced Documentation:** <a href="https://pipulate.com/">Pipulate: AI-Readiness for the Agentic Web</a>
|
|
1649
1661
|
|
|
1650
1662
|
**On GitHub:** <a href="https://github.com/miklevin/pipulate">Pipulate on GitHub</a>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Pipulate: A hand-cranked, local-first AI SEO software
|
|
2
|
+
Pipulate: A hand-cranked, local-first AI-readiness software framework — the successor to AI SEO software.
|
|
3
3
|
|
|
4
4
|
Your data. Your AI. Your machine. Your control.
|
|
5
5
|
|
|
@@ -12,12 +12,16 @@ Usage:
|
|
|
12
12
|
pipulate
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
-
__version__ = "
|
|
16
|
-
__version_description__ = "
|
|
15
|
+
__version__ = "2.02"
|
|
16
|
+
__version_description__ = "Operation Stick Bug"
|
|
17
|
+
# SPDX expression, single source of truth, synced into pyproject.toml by
|
|
18
|
+
# scripts/release/version_sync.py. "-or-later" (not bare AGPL-3.0, which is
|
|
19
|
+
# deprecated SPDX) because the header below grants "any later version".
|
|
20
|
+
__license__ = "AGPL-3.0-or-later"
|
|
17
21
|
__email__ = "pipulate@gmail.com"
|
|
18
|
-
__description__ = "
|
|
22
|
+
__description__ = "AI-readiness for the agentic web — local-first, Nix-reproducible workflows. The successor to AI SEO software."
|
|
19
23
|
|
|
20
|
-
# Pipulate: A hand-cranked, local-first AI SEO software
|
|
24
|
+
# Pipulate: A hand-cranked, local-first AI-readiness software framework — the successor to AI SEO software.
|
|
21
25
|
# Copyright (C) 2026 Michael Jay Levin
|
|
22
26
|
#
|
|
23
27
|
# This program is free software: you can redistribute it and/or modify
|
|
@@ -84,30 +84,47 @@ class IntroductionPlugin:
|
|
|
84
84
|
except Exception as e:
|
|
85
85
|
logger.warning(f"Could not verify config pipeline state: {e}")
|
|
86
86
|
dynamic_app_name = self.wand.get_config().APP_NAME
|
|
87
|
-
active_model = self.wand.db.get('active_local_model', '
|
|
87
|
+
active_model = self.wand.db.get('active_local_model', 'not yet selected')
|
|
88
88
|
|
|
89
89
|
if not operator_name:
|
|
90
|
-
# STATE 1: The
|
|
90
|
+
# STATE 1: The Doorway (Airlock has not fired)
|
|
91
|
+
# ATTRIBUTED VOICE: the first thing a stranger hears must say
|
|
92
|
+
# what is producing it. This is Piper reading a fixed string,
|
|
93
|
+
# so it says so, and it does not borrow a persona to do it.
|
|
91
94
|
msg = (
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
95
|
+
"One disclosure before anything else. This voice is Piper, a speech "
|
|
96
|
+
"synthesizer running entirely on your machine, reading a fixed script. "
|
|
97
|
+
"There is no language model behind it yet. You have found port 5001 early, "
|
|
98
|
+
"which is fine, but this room fills in as you finish onboarding. "
|
|
99
|
+
"Head back to your JupyterLab tab, run the Onboarding notebook top to bottom, "
|
|
100
|
+
"and this page will have something worth saying."
|
|
96
101
|
)
|
|
97
|
-
return "
|
|
102
|
+
return "Onboarding Not Finished 🔒", msg, None
|
|
98
103
|
|
|
99
104
|
elif not has_configured:
|
|
100
|
-
# STATE 2: The Guide
|
|
105
|
+
# STATE 2: The Guide (Airlock fired, but Configuration is pending)
|
|
106
|
+
# The demo is a scripted scenario driven by player-piano.js, so
|
|
107
|
+
# it is a tour OF THE SYSTEM, never of anyone's "capabilities."
|
|
101
108
|
msg = (
|
|
102
|
-
f"Welcome to {dynamic_app_name}, {operator_name}.
|
|
109
|
+
f"Welcome to {dynamic_app_name}, {operator_name}. This voice is still a local "
|
|
110
|
+
"speech synthesizer reading a script, not a language model. The thinking "
|
|
111
|
+
"engines, local and cloud, get wired up next in Configuration. For a scripted "
|
|
112
|
+
"tour of the interface, press ",
|
|
103
113
|
Strong("Ctrl+Alt+D", cls="platform-shortcut"),
|
|
104
114
|
" right now. Otherwise, we will proceed to finalize your configuration."
|
|
105
115
|
)
|
|
106
116
|
return "Welcome", msg, 'finalize'
|
|
107
117
|
|
|
108
118
|
else:
|
|
109
|
-
# STATE 3: The Veteran
|
|
110
|
-
|
|
119
|
+
# STATE 3: The Veteran (Config workflow is finalized)
|
|
120
|
+
# Even here the narration stays scripted. The model name is a
|
|
121
|
+
# receipt, so it is spoken only about the engine, never as a
|
|
122
|
+
# claim about the speaker.
|
|
123
|
+
msg = (
|
|
124
|
+
f"Welcome back to {dynamic_app_name}, {operator_name}. This narration is still "
|
|
125
|
+
f"scripted speech, not inference. Your local engine is {active_model}. Anything "
|
|
126
|
+
"a model actually generates from here on will name the model that generated it."
|
|
127
|
+
)
|
|
111
128
|
return "Dashboard Ready ✅", msg, None
|
|
112
129
|
|
|
113
130
|
elif step_id == 'finalize':
|
|
@@ -132,6 +149,10 @@ class IntroductionPlugin:
|
|
|
132
149
|
else:
|
|
133
150
|
text = str(content)
|
|
134
151
|
|
|
152
|
+
# Markup stripping lives at the voice boundary (the ACOUSTIC SANITIZER
|
|
153
|
+
# in imports/voice_synthesis.py), which every caller crosses. Duplicated
|
|
154
|
+
# here it was harmless but drift-prone, so it moved rather than doubled.
|
|
155
|
+
|
|
135
156
|
|
|
136
157
|
from imports.voice_synthesis import chip_voice_system
|
|
137
158
|
if chip_voice_system and chip_voice_system.voice_ready:
|
|
@@ -206,7 +227,7 @@ class IntroductionPlugin:
|
|
|
206
227
|
|
|
207
228
|
return Div(
|
|
208
229
|
onload_trigger,
|
|
209
|
-
|
|
230
|
+
Article(
|
|
210
231
|
Div(
|
|
211
232
|
H2(title, style="display: inline-block; margin-bottom: 0;"),
|
|
212
233
|
encore_btn,
|