Try it locally • Try it online • Example • How it works
About
portico renders input as a three-layered visual abstraction.
- The LLM reads your input, classifies it, and decomposes it into three layers
_ii^: roof, pillars, base. - The renderer, a pure function from JSON to ASCII, turns those layers into a portico.
- The output is a tiny monument of abstraction that helps clarify concepts.
| Glyph | Layer | Meaning |
|---|---|---|
^ |
Roof | The unifying idea |
ii |
Pillars | The load-bearing components |
_ |
Base | The foundation everything rests on |
Try it locally
Install
uv tool install portico-cli
portico README.md
portico https://example.com/article
portico ./src --no-legend
echo "your text here" | portico -
Try it online
Run portico in your browser, no install required:
The space uses 🦙 Llama 3.3 70B via Groq. Paste input and render.
Example
portico "https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture)"
── encyclopedia article: Transformer ─────────────────────────────────────
◆ ◆
^^^ ▲ ^^^
╔══════════════════════════════════════════════════════════════╗
║ Attention Is All You Need ║
╚══════════════════════════════════════════════════════════════╝
////º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~\\\\
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
▀██▀ ▀██▀ ▀██▀ ▀██▀ ▀██▀
██ ██ ██ ██ ██
██ ██ ██ ██ ██
RNN to Core Training Variants and Broad
Transformer Architecture Paradigm Efficiency Applications
██ ██ ██ ██ ██
██ ██ ██ ██ ██
▄██▄ ▄██▄ ▄██▄ ▄██▄ ▄██▄
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
╔════════════════════════════════════════════════════════════════════════╗
║ Multi-head Attention ║
╚════════════════════════════════════════════════════════════════════════╝
legend:
^ Attention Is All You Need: Replacing recurrence with multi-head self-
attention enables parallel, scalable sequence modelling.
ii RNN to Transformer: Sequential limitations of RNNs and seq2seq models
motivated the shift to parallel attention.
ii Core Architecture: Tokenization, positional encoding, encoder and decoder
layers form the transformer's structure.
ii Training Paradigm: Large-scale self-supervised pretraining followed by
task-specific fine-tuning drives performance.
ii Variants and Efficiency: Encoder-only, decoder-only, and encoder-decoder
designs, plus optimizations like FlashAttention and KV caching, adapt the
architecture to diverse needs.
ii Broad Applications: Transformers have expanded from NLP to vision, audio,
robotics, and multimodal generation.
_ Multi-head Attention: Scaled dot-product multi-head attention is the
mathematical substrate every transformer component rests on.
─────────────────────────────────────────────────────── built with _ii^ ──
Run with claude-sonnet-4-6.
Pipeline
Five stages run in strict order. Each owns one responsibility and hands a typed value to the next. The CLI (cli.py) is the only place that wires them together and translates exceptions into exit codes.
┌──────────────────────────────┐
│ LLM provider │
│ claude / openai / gemini │
└──────────────────────────────┘
▲ ▲
│ (if oversized) │ (analyze + retry)
input ┌────────┐ ┌──────┴─────┐ ┌────────┐ ┌───┴────┐ ┌──────────┐ ASCII
─────▶ │ loader │──▶│ summarizer │──▶│ cache │──▶│analyzer│──▶│ renderer │ ──────▶
└────────┘ └────────────┘ └────────┘ └────────┘ └──────────┘
loaders/ summarize.py cache.py analyzer.py render/
- loader – reads the input (text, file, directory, URL, or repo) into a normalized
LoadedInput. - summarizer – chunks oversized inputs and recursively summarizes them via the LLM.
- cache – hashes
(text, provider, model)to JSON on disk; on hit, skips the analyzer. - analyzer – prompts the LLM for a three-layer decomposition; validates and retries on bad JSON.
- renderer – turns the analyzer's JSON into ASCII; pure function, never calls the LLM.
Inputs
- Raw text or stdin
- Local files and directories
- URLs (page content is extracted)
- Git repositories
When an input doesn't fit a three-layer shape – poems, flat lists, gibberish – portico refuses honestly rather than fake one.
Customization
| Flag | What it does |
|---|---|
--no-legend |
Hide the per-layer summary (legend renders by default) |
--reapex=N |
Pin the apex to seed N (random by default; pool of 600+ variants) |
--json |
Emit the analyzer's JSON instead of rendering |
--diagnose |
Print a pipeline report (input type, model, fit quality) and exit |
Run portico --help for the full list.
Apex
The apex is the ornament crowning the portico -- picked at render time from a pool of 600+ variants.
🎲 --reapex=SEED pins a specific composition to reproduce.
portico https://0trm.blog/data-science-at-camp-nou/ --reapex=0
── essay: Data Science at Camp Nou ─────────────────
▲ * ▲
~~~ ▲ ~~~
╔════════════════════════════════════════╗
║ Data-Driven Ticketing ║
╚════════════════════════════════════════╝
////º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~\\\\
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
▀██▀ ▀██▀ ▀██▀
██ ██ ██
██ ██ ██
Analytics Experimentation Predictive
██ ██ Modeling
██ ██ ██
██ ██ ██
▄██▄ ▄██▄ ▄██▄
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
╔══════════════════════════════════════════════════╗
║ Fan Behavior ║
╚══════════════════════════════════════════════════╝
portico https://0trm.blog/data-science-at-camp-nou/ --reapex=1
── essay: Data Science at Camp Nou ─────────────────
◆ ◆
═══ ◆ ═══
╔════════════════════════════════════════╗
║ Data-Driven Ticketing ║
╚════════════════════════════════════════╝
////º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~\\\\
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
▀██▀ ▀██▀ ▀██▀
██ ██ ██
██ ██ ██
Analytics Experimentation Predictive
██ ██ Modeling
██ ██ ██
██ ██ ██
▄██▄ ▄██▄ ▄██▄
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
╔══════════════════════════════════════════════════╗
║ Fan Behavior ║
╚══════════════════════════════════════════════════╝
portico https://0trm.blog/data-science-at-camp-nou/ --reapex=7
── essay: Data Science at Camp Nou ─────────────────
· · ·
░░░ ▲ ░░░
╔════════════════════════════════════════╗
║ Data-Driven Ticketing ║
╚════════════════════════════════════════╝
////º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~~º~\\\\
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
▀██▀ ▀██▀ ▀██▀
██ ██ ██
██ ██ ██
Analytics Experimentation Predictive
██ ██ Modeling
██ ██ ██
██ ██ ██
▄██▄ ▄██▄ ▄██▄
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
╔══════════════════════════════════════════════════╗
║ Fan Behavior ║
╚══════════════════════════════════════════════════╝
License
MIT
Built by with AI.
© trm
Metadata
Release files for portico-cli 0.1.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| portico_cli-0.1.8.tar.gz | 25.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| portico_cli-0.1.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.9 kB
Release files / portico_cli-0.1.8.tar.gz
| Download URL | portico_cli-0.1.8.tar.gz |
|---|---|
| Size | 25.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9388daaa8f91d11565b833f7d3fe05c004172b6397746fa14597bf6b7a2f599f
|
|
BLAKE2b-256 checksum How to use checksums |
4c2ac2fb34327852c22d938b7a1086585d3b4deeaee77e7268f4aa38c6d65df4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / portico_cli-0.1.8-py3-none-any.whl
| Download URL | portico_cli-0.1.8-py3-none-any.whl |
|---|---|
| Size | 32.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
23200393cd3f179f23f8087a8f95a5ae5028e1774c74e1dded3020fef69f5a29
|
|
BLAKE2b-256 checksum How to use checksums |
52da0904a3457183112303d223a37df27a94b743286734c0952749107441f42e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|