pipulate 2.71__tar.gz → 2.73__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.71 → pipulate-2.73}/.agents/skills/journal/references/index.md +7 -5
- {pipulate-2.71 → pipulate-2.73}/AGENTS.md +6 -6
- {pipulate-2.71 → pipulate-2.73}/AUDIT.md +7 -7
- {pipulate-2.71 → pipulate-2.73}/MANIFEST.in +1 -1
- {pipulate-2.71 → pipulate-2.73}/PKG-INFO +42 -42
- {pipulate-2.71 → pipulate-2.73}/README.md +40 -40
- {pipulate-2.71 → pipulate-2.73}/__init__.py +5 -5
- {pipulate-2.71 → pipulate-2.73}/apps/015_config.py +1 -1
- {pipulate-2.71 → pipulate-2.73}/apps/040_hello_workflow.py +2 -2
- {pipulate-2.71 → pipulate-2.73}/apps/400_botify_trifecta.py +1 -1
- {pipulate-2.71 → pipulate-2.73}/imports/ascii_displays.py +92 -92
- {pipulate-2.71 → pipulate-2.73}/imports/durable_backup_system.py +1 -1
- {pipulate-2.71 → pipulate-2.73}/pipulate/core.py +1 -1
- {pipulate-2.71 → pipulate-2.73}/pipulate.egg-info/PKG-INFO +42 -42
- {pipulate-2.71 → pipulate-2.73}/pyproject.toml +15 -15
- {pipulate-2.71 → pipulate-2.73}/server.py +1 -1
- {pipulate-2.71 → pipulate-2.73}/tools/dom_tools.py +1 -1
- {pipulate-2.71 → pipulate-2.73}/tools/llm_optics.py +10 -10
- {pipulate-2.71 → pipulate-2.73}/tools/scraper_tools.py +1 -1
- {pipulate-2.71 → pipulate-2.73}/.agents/skills/gsc-readonly/SKILL.md +0 -0
- {pipulate-2.71 → pipulate-2.73}/.agents/skills/hello-workflow/SKILL.md +0 -0
- {pipulate-2.71 → pipulate-2.73}/.agents/skills/journal/SKILL.md +0 -0
- {pipulate-2.71 → pipulate-2.73}/.agents/skills/pipulate/SKILL.md +0 -0
- {pipulate-2.71 → pipulate-2.73}/.agents/skills/roles/SKILL.md +0 -0
- {pipulate-2.71 → pipulate-2.73}/.agents/skills/sheets-readonly/SKILL.md +0 -0
- {pipulate-2.71 → pipulate-2.73}/LICENSE +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/010_introduction.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/020_profiles.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/025_aspect.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/030_roles.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/050_documentation.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/060_tasks.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/070_history.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/110_parameter_buster.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/120_link_graph.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/130_gap_analysis.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/200_workflow_genesis.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/210_widget_examples.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/220_roadmap.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/230_dev_assistant.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/240_simon_mcp.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/300_blank_placeholder.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/440_browser_automation.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/450_stream_simulator.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/510_text_field.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/520_text_area.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/530_dropdown.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/540_checkboxes.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/550_radios.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/560_range.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/570_switch.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/580_upload.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/610_markdown.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/620_mermaid.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/630_prism.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/640_javascript.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/710_pandas.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/720_rich.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/730_matplotlib.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/810_webbrowser.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/820_selenium.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/apps/830_pico_slider.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/cli.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/config.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/__init__.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/ai_dictdb.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/ai_tool_discovery_simple_parser.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/append_only_conversation.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/botify/__init__.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/botify/code_generators.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/botify/true_schema_discoverer.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/botify_code_generation.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/crud.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/database_safety_wrapper.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/dom_processing/__init__.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/dom_processing/ai_dom_beautifier.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/dom_processing/enhanced_dom_processor.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/mcp_orchestrator.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/server_logging.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/stream_orchestrator.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/imports/voice_synthesis.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/pipulate/__init__.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/pipulate.egg-info/SOURCES.txt +0 -0
- {pipulate-2.71 → pipulate-2.73}/pipulate.egg-info/dependency_links.txt +0 -0
- {pipulate-2.71 → pipulate-2.73}/pipulate.egg-info/entry_points.txt +0 -0
- {pipulate-2.71 → pipulate-2.73}/pipulate.egg-info/requires.txt +0 -0
- {pipulate-2.71 → pipulate-2.73}/pipulate.egg-info/top_level.txt +0 -0
- {pipulate-2.71 → pipulate-2.73}/setup.cfg +0 -0
- {pipulate-2.71 → pipulate-2.73}/tests/test_apply_airlock.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/tests/test_mck_rep2.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/tools/__init__.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/tools/advanced_automation_tools.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/tools/botify_tools.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/tools/connector_tools.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/tools/conversation_tools.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/tools/keychain_tools.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/tools/mcp_tools.py +0 -0
- {pipulate-2.71 → pipulate-2.73}/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.
|
|
5
|
+
> the rest of the repo is newer than this map. 1505 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,8 @@ 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] [Layered Reality and Operator Overloading: Reading the Physics of CPython in the Age of AI](https://mikelev.in/futureproof/layered-reality-operator-overloading-cpython/index.md)
|
|
31
|
+
- [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
32
|
- [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
33
|
- [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
34
|
- [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)
|
|
@@ -45,13 +47,13 @@ URL as: `https://mikelev.in/futureproof/{slug}/index.md`
|
|
|
45
47
|
- [2026-09-19] [Dual-Model Failover: Engineering Independent Backoff Clocks for LLM APIs](https://mikelev.in/futureproof/dual-model-failover-independent-backoff/index.md)
|
|
46
48
|
- [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
49
|
- [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
|
-
- [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
|
|
51
|
+
## Compact slug index -- pattern: https://mikelev.in/futureproof/{slug}/index.md
|
|
52
52
|
|
|
53
|
-
Format: `[date] [size] slug`
|
|
53
|
+
Format: `[date] [size] slug` -- fetch any entry as `https://mikelev.in/futureproof/{slug}/index.md`
|
|
54
54
|
|
|
55
|
+
- [2026-09-19] [294k] edna-mode-rules-for-ai-workflows
|
|
56
|
+
- [2026-09-18] [207k] the-one-door-threshold-replayable-ai-workflows
|
|
55
57
|
- [2026-09-18] [292k] the-first-ten-minutes-reproducible-ai-workflows
|
|
56
58
|
- [2026-09-17] [184k] retrieval-cue-memory-consolidation-selective-hydration
|
|
57
59
|
- [2026-09-17] [239k] the-voice-asks-first-verifiable-consent
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# AGENTS.md
|
|
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`
|
|
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`
|
|
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
|
|
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/
|
|
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`)
|
|
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
|
|
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
|
|
89
|
-
manifold, `$PIPULATE_ROOT`, or an explicit config value
|
|
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
|
|
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
|
|
239
|
-
writes, dependency freshness, cloud opt-ins, and recovery
|
|
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
|
-
#
|
|
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.
|
|
4
|
-
Summary: The context compiler that helps you prompt well
|
|
3
|
+
Version: 2.73
|
|
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/
|
|
@@ -62,13 +62,13 @@ Dynamic: license-file
|
|
|
62
62
|
3. For the Why: `.agents/skills/journal/` (the journal index, an Agent Skills reference; served at https://pipulate.com/AI_CONTEXT.md )
|
|
63
63
|
|
|
64
64
|
```text
|
|
65
|
-
(
|
|
66
|
-
|
|
67
|
-
>
|
|
68
|
-
>
|
|
69
|
-
>
|
|
70
|
-
>
|
|
71
|
-
>
|
|
65
|
+
( Do you put your name on it because Claude said so? )
|
|
66
|
+
O /) __
|
|
67
|
+
> Do you think the Aviation industry o /)\__// / \ "What Claude said" is a Cockpit
|
|
68
|
+
> vibe-codes without checking for ___(/_ 0 0 | | Voice Recorder (CVR) hear-say of a
|
|
69
|
+
> confident hallucinations? So then *( ==(_T_)== QA | subcontractor. This tool is a Flight
|
|
70
|
+
> why should you? If anyone relies on \ ) ""\ | | Data Recorder (FDR) for High Reliability
|
|
71
|
+
> your work then you should Q/A it. |__>-\_>_> \__/ Organizations (HROs). Use when it matters.
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
## If you can't reproduce it, it didn't happen
|
|
@@ -137,7 +137,7 @@ nix develop
|
|
|
137
137
|
### Where your work lives
|
|
138
138
|
<!-- --- START WORKSPACE TREE --- -->
|
|
139
139
|
```text
|
|
140
|
-
Workshop/
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
311
|
-
- **WET Workflows, DRY Framework:** Workflows are intentionally "WET" (explicit & step-by-step) for maximum clarity and customizability
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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"
|
|
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
|
|
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**
|
|
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
|
|
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
|
|
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
|
|