pipulate 2.71__tar.gz → 2.72__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.
Files changed (98) hide show
  1. {pipulate-2.71 → pipulate-2.72}/.agents/skills/journal/references/index.md +5 -4
  2. {pipulate-2.71 → pipulate-2.72}/AGENTS.md +6 -6
  3. {pipulate-2.71 → pipulate-2.72}/AUDIT.md +7 -7
  4. {pipulate-2.71 → pipulate-2.72}/MANIFEST.in +1 -1
  5. {pipulate-2.71 → pipulate-2.72}/PKG-INFO +35 -35
  6. {pipulate-2.71 → pipulate-2.72}/README.md +33 -33
  7. {pipulate-2.71 → pipulate-2.72}/__init__.py +5 -5
  8. {pipulate-2.71 → pipulate-2.72}/apps/015_config.py +1 -1
  9. {pipulate-2.71 → pipulate-2.72}/apps/040_hello_workflow.py +2 -2
  10. {pipulate-2.71 → pipulate-2.72}/apps/400_botify_trifecta.py +1 -1
  11. {pipulate-2.71 → pipulate-2.72}/imports/ascii_displays.py +92 -92
  12. {pipulate-2.71 → pipulate-2.72}/imports/durable_backup_system.py +1 -1
  13. {pipulate-2.71 → pipulate-2.72}/pipulate/core.py +1 -1
  14. {pipulate-2.71 → pipulate-2.72}/pipulate.egg-info/PKG-INFO +35 -35
  15. {pipulate-2.71 → pipulate-2.72}/pyproject.toml +15 -15
  16. {pipulate-2.71 → pipulate-2.72}/server.py +1 -1
  17. {pipulate-2.71 → pipulate-2.72}/tools/dom_tools.py +1 -1
  18. {pipulate-2.71 → pipulate-2.72}/tools/llm_optics.py +10 -10
  19. {pipulate-2.71 → pipulate-2.72}/tools/scraper_tools.py +1 -1
  20. {pipulate-2.71 → pipulate-2.72}/.agents/skills/gsc-readonly/SKILL.md +0 -0
  21. {pipulate-2.71 → pipulate-2.72}/.agents/skills/hello-workflow/SKILL.md +0 -0
  22. {pipulate-2.71 → pipulate-2.72}/.agents/skills/journal/SKILL.md +0 -0
  23. {pipulate-2.71 → pipulate-2.72}/.agents/skills/pipulate/SKILL.md +0 -0
  24. {pipulate-2.71 → pipulate-2.72}/.agents/skills/roles/SKILL.md +0 -0
  25. {pipulate-2.71 → pipulate-2.72}/.agents/skills/sheets-readonly/SKILL.md +0 -0
  26. {pipulate-2.71 → pipulate-2.72}/LICENSE +0 -0
  27. {pipulate-2.71 → pipulate-2.72}/apps/010_introduction.py +0 -0
  28. {pipulate-2.71 → pipulate-2.72}/apps/020_profiles.py +0 -0
  29. {pipulate-2.71 → pipulate-2.72}/apps/025_aspect.py +0 -0
  30. {pipulate-2.71 → pipulate-2.72}/apps/030_roles.py +0 -0
  31. {pipulate-2.71 → pipulate-2.72}/apps/050_documentation.py +0 -0
  32. {pipulate-2.71 → pipulate-2.72}/apps/060_tasks.py +0 -0
  33. {pipulate-2.71 → pipulate-2.72}/apps/070_history.py +0 -0
  34. {pipulate-2.71 → pipulate-2.72}/apps/110_parameter_buster.py +0 -0
  35. {pipulate-2.71 → pipulate-2.72}/apps/120_link_graph.py +0 -0
  36. {pipulate-2.71 → pipulate-2.72}/apps/130_gap_analysis.py +0 -0
  37. {pipulate-2.71 → pipulate-2.72}/apps/200_workflow_genesis.py +0 -0
  38. {pipulate-2.71 → pipulate-2.72}/apps/210_widget_examples.py +0 -0
  39. {pipulate-2.71 → pipulate-2.72}/apps/220_roadmap.py +0 -0
  40. {pipulate-2.71 → pipulate-2.72}/apps/230_dev_assistant.py +0 -0
  41. {pipulate-2.71 → pipulate-2.72}/apps/240_simon_mcp.py +0 -0
  42. {pipulate-2.71 → pipulate-2.72}/apps/300_blank_placeholder.py +0 -0
  43. {pipulate-2.71 → pipulate-2.72}/apps/440_browser_automation.py +0 -0
  44. {pipulate-2.71 → pipulate-2.72}/apps/450_stream_simulator.py +0 -0
  45. {pipulate-2.71 → pipulate-2.72}/apps/510_text_field.py +0 -0
  46. {pipulate-2.71 → pipulate-2.72}/apps/520_text_area.py +0 -0
  47. {pipulate-2.71 → pipulate-2.72}/apps/530_dropdown.py +0 -0
  48. {pipulate-2.71 → pipulate-2.72}/apps/540_checkboxes.py +0 -0
  49. {pipulate-2.71 → pipulate-2.72}/apps/550_radios.py +0 -0
  50. {pipulate-2.71 → pipulate-2.72}/apps/560_range.py +0 -0
  51. {pipulate-2.71 → pipulate-2.72}/apps/570_switch.py +0 -0
  52. {pipulate-2.71 → pipulate-2.72}/apps/580_upload.py +0 -0
  53. {pipulate-2.71 → pipulate-2.72}/apps/610_markdown.py +0 -0
  54. {pipulate-2.71 → pipulate-2.72}/apps/620_mermaid.py +0 -0
  55. {pipulate-2.71 → pipulate-2.72}/apps/630_prism.py +0 -0
  56. {pipulate-2.71 → pipulate-2.72}/apps/640_javascript.py +0 -0
  57. {pipulate-2.71 → pipulate-2.72}/apps/710_pandas.py +0 -0
  58. {pipulate-2.71 → pipulate-2.72}/apps/720_rich.py +0 -0
  59. {pipulate-2.71 → pipulate-2.72}/apps/730_matplotlib.py +0 -0
  60. {pipulate-2.71 → pipulate-2.72}/apps/810_webbrowser.py +0 -0
  61. {pipulate-2.71 → pipulate-2.72}/apps/820_selenium.py +0 -0
  62. {pipulate-2.71 → pipulate-2.72}/apps/830_pico_slider.py +0 -0
  63. {pipulate-2.71 → pipulate-2.72}/cli.py +0 -0
  64. {pipulate-2.71 → pipulate-2.72}/config.py +0 -0
  65. {pipulate-2.71 → pipulate-2.72}/imports/__init__.py +0 -0
  66. {pipulate-2.71 → pipulate-2.72}/imports/ai_dictdb.py +0 -0
  67. {pipulate-2.71 → pipulate-2.72}/imports/ai_tool_discovery_simple_parser.py +0 -0
  68. {pipulate-2.71 → pipulate-2.72}/imports/append_only_conversation.py +0 -0
  69. {pipulate-2.71 → pipulate-2.72}/imports/botify/__init__.py +0 -0
  70. {pipulate-2.71 → pipulate-2.72}/imports/botify/code_generators.py +0 -0
  71. {pipulate-2.71 → pipulate-2.72}/imports/botify/true_schema_discoverer.py +0 -0
  72. {pipulate-2.71 → pipulate-2.72}/imports/botify_code_generation.py +0 -0
  73. {pipulate-2.71 → pipulate-2.72}/imports/crud.py +0 -0
  74. {pipulate-2.71 → pipulate-2.72}/imports/database_safety_wrapper.py +0 -0
  75. {pipulate-2.71 → pipulate-2.72}/imports/dom_processing/__init__.py +0 -0
  76. {pipulate-2.71 → pipulate-2.72}/imports/dom_processing/ai_dom_beautifier.py +0 -0
  77. {pipulate-2.71 → pipulate-2.72}/imports/dom_processing/enhanced_dom_processor.py +0 -0
  78. {pipulate-2.71 → pipulate-2.72}/imports/mcp_orchestrator.py +0 -0
  79. {pipulate-2.71 → pipulate-2.72}/imports/server_logging.py +0 -0
  80. {pipulate-2.71 → pipulate-2.72}/imports/stream_orchestrator.py +0 -0
  81. {pipulate-2.71 → pipulate-2.72}/imports/voice_synthesis.py +0 -0
  82. {pipulate-2.71 → pipulate-2.72}/pipulate/__init__.py +0 -0
  83. {pipulate-2.71 → pipulate-2.72}/pipulate.egg-info/SOURCES.txt +0 -0
  84. {pipulate-2.71 → pipulate-2.72}/pipulate.egg-info/dependency_links.txt +0 -0
  85. {pipulate-2.71 → pipulate-2.72}/pipulate.egg-info/entry_points.txt +0 -0
  86. {pipulate-2.71 → pipulate-2.72}/pipulate.egg-info/requires.txt +0 -0
  87. {pipulate-2.71 → pipulate-2.72}/pipulate.egg-info/top_level.txt +0 -0
  88. {pipulate-2.71 → pipulate-2.72}/setup.cfg +0 -0
  89. {pipulate-2.71 → pipulate-2.72}/tests/test_apply_airlock.py +0 -0
  90. {pipulate-2.71 → pipulate-2.72}/tests/test_mck_rep2.py +0 -0
  91. {pipulate-2.71 → pipulate-2.72}/tools/__init__.py +0 -0
  92. {pipulate-2.71 → pipulate-2.72}/tools/advanced_automation_tools.py +0 -0
  93. {pipulate-2.71 → pipulate-2.72}/tools/botify_tools.py +0 -0
  94. {pipulate-2.71 → pipulate-2.72}/tools/connector_tools.py +0 -0
  95. {pipulate-2.71 → pipulate-2.72}/tools/conversation_tools.py +0 -0
  96. {pipulate-2.71 → pipulate-2.72}/tools/keychain_tools.py +0 -0
  97. {pipulate-2.71 → pipulate-2.72}/tools/mcp_tools.py +0 -0
  98. {pipulate-2.71 → pipulate-2.72}/tools/system_tools.py +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Auto-generated on 2026-09-29 by `scripts/articles/generate_ai_context.py` and
4
4
  > rewritten from scratch on every release. If this date looks stale, assume
5
- > the rest of the repo is newer than this map. 1503 entries indexed.
5
+ > the rest of the repo is newer than this map. 1504 entries indexed.
6
6
 
7
7
  This repository holds the *machinery*. The *reasoning*, the running journal
8
8
  that explains why every piece exists, lives on a separate website and not in
@@ -27,6 +27,7 @@ The first 20 entries include full `index.md` URLs to establish
27
27
  the link pattern. All remaining entries are bare slugs. Reconstruct any full
28
28
  URL as: `https://mikelev.in/futureproof/{slug}/index.md`
29
29
 
30
+ - [2026-09-29] [The Three-Door Installer: Named Prompts, Split DNS, and Verifiable Releases](https://mikelev.in/futureproof/the-three-door-installer-and-named-prompts/index.md)
30
31
  - [2026-09-29] [The Deed Is Named for the Door: Engineering Replayable QA Archives for AI](https://mikelev.in/futureproof/the-deed-is-named-for-the-door-qa-archive-zip/index.md)
31
32
  - [2026-09-29] [The Qamy Door and the Cellular Witness: Launching a Third Domain with Replayable Receipts](https://mikelev.in/futureproof/qamy-door-cellular-witness-replayable-receipts/index.md)
32
33
  - [2026-09-28] [The Forward-Slash Test: Bridging Agent Skills to Claude Code with Verifiable Receipts](https://mikelev.in/futureproof/the-forward-slash-test-claude-skills-bridge/index.md)
@@ -46,12 +47,12 @@ URL as: `https://mikelev.in/futureproof/{slug}/index.md`
46
47
  - [2026-09-19] [Playing Pinball in the Age of AI: A Replayable Workflow Guide](https://mikelev.in/futureproof/playing-pinball-in-the-age-of-ai-replayable-workflow-guide/index.md)
47
48
  - [2026-09-19] [The Color Blue and the Pipe: Inspecting Code Before Execution](https://mikelev.in/futureproof/color-blue-pipe-inspecting-code/index.md)
48
49
  - [2026-09-19] [Edna Mode Rules for AI Workflows: Why Practical Tooling Beats Fragile Abstractions](https://mikelev.in/futureproof/edna-mode-rules-for-ai-workflows/index.md)
49
- - [2026-09-18] [The One-Door Threshold: Engineering Replayable AI Workflows and Quiet Shells](https://mikelev.in/futureproof/the-one-door-threshold-replayable-ai-workflows/index.md)
50
50
 
51
- ## Compact slug index — pattern: https://mikelev.in/futureproof/{slug}/index.md
51
+ ## Compact slug index -- pattern: https://mikelev.in/futureproof/{slug}/index.md
52
52
 
53
- Format: `[date] [size] slug` — fetch any entry as `https://mikelev.in/futureproof/{slug}/index.md`
53
+ Format: `[date] [size] slug` -- fetch any entry as `https://mikelev.in/futureproof/{slug}/index.md`
54
54
 
55
+ - [2026-09-18] [207k] the-one-door-threshold-replayable-ai-workflows
55
56
  - [2026-09-18] [292k] the-first-ten-minutes-reproducible-ai-workflows
56
57
  - [2026-09-17] [184k] retrieval-cue-memory-consolidation-selective-hydration
57
58
  - [2026-09-17] [239k] the-voice-asks-first-verifiable-consent
@@ -1,4 +1,4 @@
1
- # AGENTS.md — Pipulate
1
+ # AGENTS.md -- Pipulate
2
2
 
3
3
  This repository carries Agent Skills under https://agentskills.io/specification
4
4
  (`.agents/skills/*/SKILL.md`, a YAML head over a Markdown body, loaded on
@@ -16,24 +16,24 @@ that duplicates code will drift and is a bug.
16
16
 
17
17
  ## Setup (the executable version of "Dev environment tips")
18
18
 
19
- - `nix develop` — the full environment. On a terminal it stops at a short
19
+ - `nix develop` -- the full environment. On a terminal it stops at a short
20
20
  list of words and a `(nix)` prompt with nothing started; `jn` starts
21
21
  JupyterLab and the server. Without a terminal it starts the app, so an
22
22
  agent takes the quiet shell below. See `flake.nix`.
23
- - `nix develop .#quiet` — minimal shell for agents and scripting.
23
+ - `nix develop .#quiet` -- minimal shell for agents and scripting.
24
24
  - Python lives in `.venv/`; invoke as `.venv/bin/python`.
25
25
 
26
26
  ## Workspace (the layout `nix develop` materializes under `Workshop/`)
27
27
 
28
28
  `Workshop/` is JupyterLab's root, not Pipulate's: three folders, corporate/, personal/ and shared/, and nothing else, with the starter notebooks under personal/Notebooks/. The tree below is GENERATED
29
29
  between the sentinel comments by `prompt_foo.py` from the sealed `workspace_tree`
30
- figurate asset — do not hand-edit it; edit the asset in
30
+ figurate asset -- do not hand-edit it; edit the asset in
31
31
  `imports/ascii_displays.py` and recompile. Empty here means the compiler has not
32
32
  run since the sentinels landed.
33
33
 
34
34
  <!-- --- START WORKSPACE TREE --- -->
35
35
  ```text
36
- Workshop/ — the JupyterLab root (NOT Pipulate's own root)
36
+ Workshop/ -- the JupyterLab root (NOT Pipulate's own root)
37
37
  │ FLAT siblings. Nothing nests. Nothing to get wrong.
38
38
  │
39
39
  ├── corporate/ the org's canon · gitignored · its own private repo
@@ -69,5 +69,5 @@ run since the sentinels landed.
69
69
  - Propose changes as SEARCH/REPLACE blocks (exact-match, `[[[SEARCH]]]` /
70
70
  `[[[DIVIDER]]]` / `[[[REPLACE]]]`) applied via `cat patch | python apply.py`.
71
71
  - Never patch `.ipynb` directly; `nbstripout` and `jupytext` are in play
72
- (see `.gitattributes`) — patch helper modules or give cell instructions.
72
+ (see `.gitattributes`) -- patch helper modules or give cell instructions.
73
73
  - Python edits are AST-checked and Nix edits are syntax-checked before write.
@@ -62,8 +62,8 @@ any local desktop application:
62
62
 
63
63
  These borrow vocabulary from formal control catalogs without pretending to
64
64
  implement them. NIST SP 800-53 and the CIS Benchmarks are valuable here as a
65
- shared language — assets, trust boundaries, least privilege, auditability,
66
- credential lifecycle, update path, logging, recovery, configuration management —
65
+ shared language -- assets, trust boundaries, least privilege, auditability,
66
+ credential lifecycle, update path, logging, recovery, configuration management --
67
67
  not as a compliance checklist that a single-user desktop tool is obligated to
68
68
  satisfy line by line. This is an 80/20 hardening posture: make the obvious
69
69
  low-cost failures impossible, make the unavoidable risks visible, and make the
@@ -85,8 +85,8 @@ Every path in the system should belong to one of four classes:
85
85
  - Operator-configured paths, supplied explicitly and documented as host-specific.
86
86
 
87
87
  Human-facing examples may use `~/repos/...` for readability. Executable logic must
88
- resolve paths through a named accessor — repo root discovery, the workspace
89
- manifold, `$PIPULATE_ROOT`, or an explicit config value — rather than embedding
88
+ resolve paths through a named accessor -- repo root discovery, the workspace
89
+ manifold, `$PIPULATE_ROOT`, or an explicit config value -- rather than embedding
90
90
  `/home/<user>/...`. References to a separate local repository (for example a
91
91
  sibling publishing repo) are operator-configured paths and should be named as
92
92
  such, not treated as portable defaults.
@@ -147,7 +147,7 @@ explicit. A container's writable layer is ephemeral and does not survive the
147
147
  container being destroyed, so the following must be provided as mounted volumes or
148
148
  bind mounts for the tool to behave correctly: local database state, downloads,
149
149
  logs, notebooks, and any operator workspace and `.env`. The container story is
150
- therefore a state contract — these paths must be writable and persistent, these
150
+ therefore a state contract -- these paths must be writable and persistent, these
151
151
  ports are exposed, these capabilities are not required, and these features degrade
152
152
  or disable when run in a constrained container context. Stated that way, "can I
153
153
  just use Docker?" becomes a supported compatibility output rather than an
@@ -235,8 +235,8 @@ to the review function on the same terms it is used here.
235
235
 
236
236
  The correct review of Pipulate is the review of a local-first, single-tenant,
237
237
  reproducible desktop-class tool with a browser-rendered UI. Audit it for its real
238
- risks — local port exposure, credential lifecycle, update provenance, filesystem
239
- writes, dependency freshness, cloud opt-ins, and recovery — and the hardening work
238
+ risks -- local port exposure, credential lifecycle, update provenance, filesystem
239
+ writes, dependency freshness, cloud opt-ins, and recovery -- and the hardening work
240
240
  described here is a translation layer between sovereign local computing and
241
241
  institutional risk language.
242
242
 
@@ -1,6 +1,6 @@
1
1
  # Work-in-progress plugin sketches (xx_ prefix) never ship to PyPI.
2
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
3
+ # -- and the wheel `python -m build` derives from it -- in agreement with
4
4
  # that convention. Fix protects v2.1 forward; the 2.0 artifact is history.
5
5
  exclude apps/xx_*.py
6
6
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipulate
3
- Version: 2.71
4
- Summary: The context compiler that helps you prompt well — local-first, Nix-reproducible, replayable. The successor to AI SEO software.
3
+ Version: 2.72
4
+ Summary: The context compiler that helps you prompt well -- local-first, Nix-reproducible, replayable. The successor to AI SEO software.
5
5
  Author-email: Mike Levin <pipulate@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
7
7
  Project-URL: Homepage, https://github.com/miklevin/pipulate/
@@ -137,7 +137,7 @@ nix develop
137
137
  ### Where your work lives
138
138
  <!-- --- START WORKSPACE TREE --- -->
139
139
  ```text
140
- Workshop/ — the JupyterLab root (NOT Pipulate's own root)
140
+ Workshop/ -- the JupyterLab root (NOT Pipulate's own root)
141
141
  │ FLAT siblings. Nothing nests. Nothing to get wrong.
142
142
  │
143
143
  ├── corporate/ the org's canon · gitignored · its own private repo
@@ -185,13 +185,13 @@ nix develop
185
185
 
186
186
  ## AI On Rails: Structured Workflows for Any AI
187
187
 
188
- **The Challenge with Agentic AI:** Powerful but unpredictable—you never know what you're gonna get.
188
+ **The Challenge with Agentic AI:** Powerful but unpredictable--you never know what you're gonna get.
189
189
 
190
- **The Pipulate Approach:** Structured workflows that can leverage **any AI**—local, cloud, or hybrid—while maintaining complete visibility and control.
190
+ **The Pipulate Approach:** Structured workflows that can leverage **any AI**--local, cloud, or hybrid--while maintaining complete visibility and control.
191
191
 
192
192
  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.
193
193
 
194
- **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.
194
+ **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.
195
195
 
196
196
  ```text
197
197
  🤖 AGENTIC MODE (Chaos) 🚂 AI ON RAILS (Pipulate)
@@ -272,9 +272,9 @@ Pipulate is a **local-first, single-tenant desktop app framework** featuring AI-
272
272
 
273
273
  ### The Magnum Opus: Computing Sovereignty
274
274
 
275
- 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.
275
+ 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.
276
276
 
277
- 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.*
277
+ 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.*
278
278
 
279
279
  ### Core Philosophy: Local-First, WET, and AI-Augmented
280
280
 
@@ -307,8 +307,8 @@ If you are not an Empire builder and prefer craftsmanship over the rat race and
307
307
 
308
308
  ```
309
309
 
310
- - **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.
311
- - **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.
310
+ - **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.
311
+ - **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.
312
312
 
313
313
  - **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.
314
314
  - **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.
@@ -401,7 +401,7 @@ Pipulate integrates a carefully selected set of tools aligned with its philosoph
401
401
  part of the system the entire system
402
402
  ```
403
403
 
404
- 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.
404
+ 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.
405
405
 
406
406
  Pipulate brings back that **"one person, full stack"** philosophy with modern tools:
407
407
 
@@ -410,7 +410,7 @@ Pipulate brings back that **"one person, full stack"** philosophy with modern to
410
410
  - **M**iniDataAPI: Universal SQL simplifier close to Python's core data structures
411
411
  - **P**ython + FastHTML + HTMX: The new web development paradigm
412
412
 
413
- This stack isn't just simpler—it's optimized for AI-assisted development. Here's why:
413
+ This stack isn't just simpler--it's optimized for AI-assisted development. Here's why:
414
414
 
415
415
  * **Minimal Surface Area**: The AI doesn't waste time guessing about complex, out-of-context dependencies. More of the relevant code is directly readable and fits into a single prompt.
416
416
  * **Bedrock Dependencies**: The core components (Python, HTML, HTMX) change at a glacial pace, so they are already well-understood by base AI models, requiring no extra context.
@@ -440,7 +440,7 @@ Pipulate's technology choices form **aligned lenses** that focus ideas from abst
440
440
  AI Help
441
441
  ```
442
442
 
443
- 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.)
443
+ 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.)
444
444
 
445
445
  ```yaml
446
446
  HARDWARE:
@@ -463,7 +463,7 @@ APP:
463
463
 
464
464
  ### Grinding Off the Burrs and Flashes
465
465
 
466
- 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).
466
+ 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).
467
467
 
468
468
  **Pipulate continues this tradition:**
469
469
  - **FastHTML**: Grinds off Jinja2 template complexity
@@ -477,11 +477,11 @@ The result: clean, focused tools that do their job without unnecessary cruft.
477
477
 
478
478
  ## From Flask to FastAPI to FastHTML
479
479
 
480
- 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.
480
+ 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.
481
481
 
482
482
  ### The Evolution: Flask → FastAPI → FastHTML
483
483
 
484
- The revolution isn't just another framework — it's eliminating the template layer entirely:
484
+ The revolution isn't just another framework -- it's eliminating the template layer entirely:
485
485
 
486
486
  ```text
487
487
  🍶 FLASK ERA 🚀 FASTAPI ERA 🌐 FASTHTML ERA
@@ -515,15 +515,15 @@ The revolution isn't just another framework — it's eliminating the template la
515
515
 
516
516
  **The FastHTML Breakthrough:** Python function names directly become HTML elements, eliminating templates and making the server the single source of truth for UI state.
517
517
 
518
- * **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.
518
+ * **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.
519
519
 
520
- * **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).
520
+ * **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).
521
521
 
522
- * **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."
522
+ * **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."
523
523
 
524
524
  ### The Hybrid Advantage: Best of Both Worlds
525
525
 
526
- **Pipulate isn't anti-cloud—it's pro-choice.** Each workflow step can choose the best tool for the job:
526
+ **Pipulate isn't anti-cloud--it's pro-choice.** Each workflow step can choose the best tool for the job:
527
527
 
528
528
  - **Step 1**: Use local AI for sensitive data analysis (privacy-first)
529
529
  - **Step 2**: Call OpenAI's API for advanced reasoning (cloud power)
@@ -532,7 +532,7 @@ The revolution isn't just another framework — it's eliminating the template la
532
532
 
533
533
  **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.
534
534
 
535
- * **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.
535
+ * **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.
536
536
 
537
537
  --------------------------------------------------------------------------------
538
538
 
@@ -574,7 +574,7 @@ We offer two installation paths that lead to the exact same robust, Nix-managed
574
574
  Result)
575
575
  ```
576
576
 
577
- ### PATH 1: Quick Start — Universal Installation (Recommended)
577
+ ### PATH 1: Quick Start -- Universal Installation (Recommended)
578
578
 
579
579
  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.
580
580
 
@@ -815,13 +815,13 @@ Pipulate is built on a radical philosophy that challenges programming orthodoxy:
815
815
 
816
816
  ### The Universal API Pattern: From Quarks to Code
817
817
 
818
- 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.
818
+ 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.
819
819
 
820
820
  **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.
821
821
 
822
822
  ### Durable vs. Ephemeral: Building on Bedrock
823
823
 
824
- 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.
824
+ 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.
825
825
 
826
826
  **Pipulate chooses durable foundations:**
827
827
  - **Linux Kernel**: Version 6 in 30 years
@@ -829,7 +829,7 @@ The tech industry suffers from "hamster wheel syndrome" — constantly breaking
829
829
  - **HTML**: Version 5 and stable
830
830
  - **HTTP**: Version 3 and backward compatible
831
831
 
832
- These are the "laws of physics" for software — stable APIs that enable compound growth rather than constant rebuilding.
832
+ These are the "laws of physics" for software -- stable APIs that enable compound growth rather than constant rebuilding.
833
833
 
834
834
  ### Why WET Works Now
835
835
 
@@ -1023,7 +1023,7 @@ The UI is constructed primarily with server-rendered HTML fragments delivered vi
1023
1023
  └─────────┴───────────┘ - No virtual DOM, JSX, Redux, etc.
1024
1024
  ```
1025
1025
 
1026
- 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.
1026
+ 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.
1027
1027
 
1028
1028
  --------------------------------------------------------------------------------
1029
1029
 
@@ -1048,7 +1048,7 @@ Designed for porting notebook-style processes, workflows are sequences of steps
1048
1048
 
1049
1049
  ### Run All Cells Pattern
1050
1050
 
1051
- **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.
1051
+ **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.
1052
1052
 
1053
1053
  ```text
1054
1054
  📓 JUPYTER NOTEBOOK 🌐 PIPULATE WORKFLOW
@@ -1263,7 +1263,7 @@ When a user hits Enter on an empty key field, this specific sequence occurs:
1263
1263
  Pipulate uses HTMX-driven step progression powered by the brilliantly named `run_all_cells()` method:
1264
1264
 
1265
1265
  1. **Initial Trigger**: After `init`, the `run_all_cells()` method initializes the workflow just like Jupyter's "Run All Cells"
1266
- 2. **Perfect Mental Model**: The method name creates immediate understanding — workflows execute top-to-bottom like notebook cells
1266
+ 2. **Perfect Mental Model**: The method name creates immediate understanding -- workflows execute top-to-bottom like notebook cells
1267
1267
  3. **Step Handlers**: Each step has GET (display) and POST (submit) handlers
1268
1268
  4. **Automatic Progression**: Completed steps trigger next step with `hx_trigger="load"`
1269
1269
  5. **State Persistence**: Each step stores data in pipeline state
@@ -1279,7 +1279,7 @@ async def init(self, request):
1279
1279
 
1280
1280
  # ❌ ANTI-PATTERN: Manual placeholder creation
1281
1281
  async def init(self, request):
1282
- """Manual approach — harder to understand and maintain"""
1282
+ """Manual approach -- harder to understand and maintain"""
1283
1283
  first_step_id = steps[0].id
1284
1284
  return Div(
1285
1285
  Div(id=first_step_id, hx_get=f'/{app_name}/{first_step_id}', hx_trigger='load'),
@@ -1592,11 +1592,11 @@ The system provides comprehensive debugging and state inspection capabilities th
1592
1592
 
1593
1593
  ## The Deeper Philosophy: Why This Matters
1594
1594
 
1595
- Pipulate represents more than technology choices — it's a statement about **computing sovereignty** and the future of human-AI collaboration.
1595
+ Pipulate represents more than technology choices -- it's a statement about **computing sovereignty** and the future of human-AI collaboration.
1596
1596
 
1597
1597
  ### The Inevitable Retcon
1598
1598
 
1599
- In a few years, the industry will pivot away from mutable containers and claim they invented "AI-Native Infrastructure"—declarative, reproducible environments that allow AI agents to write code without breaking dependencies. They will package it in slick UIs and hide the math.
1599
+ In a few years, the industry will pivot away from mutable containers and claim they invented "AI-Native Infrastructure"--declarative, reproducible environments that allow AI agents to write code without breaking dependencies. They will package it in slick UIs and hide the math.
1600
1600
 
1601
1601
  When that happens, remember that **Pipulate was here first.**
1602
1602
 
@@ -1608,11 +1608,11 @@ While others fight to keep their containers from drifting, you will be standing
1608
1608
 
1609
1609
  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."
1610
1610
 
1611
- 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.
1611
+ 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.
1612
1612
 
1613
1613
  ### Every API is a Compromise
1614
1614
 
1615
- 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.
1615
+ 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.
1616
1616
 
1617
1617
  Pipulate chooses these durable APIs deliberately, creating a **future-proof foundation** for AI-assisted development that will outlast the current framework churn.
1618
1618
 
@@ -1630,9 +1630,9 @@ Remember the guiding principles:
1630
1630
  2. **Support local-first with cloud integration options.**
1631
1631
  3. **Embrace the unconventional while remaining practical.**
1632
1632
  4. **Choose durable foundations that work with any approach.**
1633
- 5. **Build for both human creativity and AI collaboration—local or cloud.**
1633
+ 5. **Build for both human creativity and AI collaboration--local or cloud.**
1634
1634
 
1635
- **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.
1635
+ **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.
1636
1636
 
1637
1637
  -----
1638
1638