{"id":50156732,"url":"https://github.com/thegreekman76/fitz","last_synced_at":"2026-06-09T02:01:33.711Z","repository":{"id":359400295,"uuid":"1235441357","full_name":"Thegreekman76/fitz","owner":"Thegreekman76","description":"Lenguaje compilado con HTTP/async/auth/WebSockets/cron como ciudadanos de primera clase. Sintaxis inspirada en Python/TypeScript, binario nativo standalone.","archived":false,"fork":false,"pushed_at":"2026-05-26T21:40:33.000Z","size":11849,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-26T22:25:29.315Z","etag":null,"topics":["compiler","cron","http","interpreter","language-design","lsp","multiplatform","patagonia","programming-language","python-interop","rust","vscode-extension"],"latest_commit_sha":null,"homepage":"https://github.com/Thegreekman76/fitz","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Thegreekman76.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-11T10:26:40.000Z","updated_at":"2026-05-26T21:40:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Thegreekman76/fitz","commit_stats":null,"previous_names":["thegreekman76/fitz"],"tags_count":37,"template":false,"template_full_name":null,"purl":"pkg:github/Thegreekman76/fitz","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thegreekman76%2Ffitz","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thegreekman76%2Ffitz/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thegreekman76%2Ffitz/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thegreekman76%2Ffitz/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Thegreekman76","download_url":"https://codeload.github.com/Thegreekman76/fitz/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thegreekman76%2Ffitz/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33692997,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compiler","cron","http","interpreter","language-design","lsp","multiplatform","patagonia","programming-language","python-interop","rust","vscode-extension"],"created_at":"2026-05-24T12:04:41.316Z","updated_at":"2026-06-09T02:01:33.704Z","avatar_url":"https://github.com/Thegreekman76.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"Fitz logo — engranaje de Rust con la silueta del Fitz Roy adentro\" width=\"160\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eEngranaje de Rust, Fitz Roy adentro: construido con Rust, nacido en una montaña.\u003cbr/\u003e\n  Más sobre el porqué del logo en \u003ca href=\"docs/vision.md#el-logo\"\u003edocs/vision.md → El logo\u003c/a\u003e.\u003c/em\u003e\n\u003c/p\u003e\n\n# Fitz\n\n\u003e Un lenguaje de programación moderno, compilado y orientado a servicios web.\n\u003e Nacido en la Patagonia. Construido con Rust.\n\n```fitz\n// Un servicio HTTP, compilado a binario nativo, cero dependencias.\n\ntype User { id: Int, name: Str, email: Str? }\n\n@get(\"/users/{id}\")\nasync fn get_user(id: Int) -\u003e User {\n    return User { id: id, name: \"ada\", email: null }\n}\n\n@server(3000)\nfn main() =\u003e 0\n```\n\n```bash\nfitz run mi_app.fitz       # intérprete + checker estático\nfitz build mi_app.fitz     # binario nativo standalone (~5 MB)\n./mi_app                   # corre sin Fitz ni Rust en el destino\n```\n\n📖 **Documentación completa:** [thegreekman76.github.io/fitz](https://thegreekman76.github.io/fitz/)\n\n## Por qué Fitz\n\nLos lenguajes actuales te obligan a elegir entre ergonomía y performance:\n\n- **Python** — hermoso, pero lento. Deployar es un dolor.\n- **TypeScript** — tipado opcional de mentira, arrastra el bagaje de JS.\n- **Go** — compilado y rápido, pero sintaxis verborrágica.\n- **Rust** — perfecto por dentro, demasiado complejo para APIs.\n\n**Fitz toma lo mejor de cada uno:**\n\n| Feature                | Python | TypeScript | Go  | Fitz  |\n| ---------------------- | ------ | ---------- | --- | ----- |\n| Sintaxis limpia        | ✅     | ⚠️         | ❌  | ✅    |\n| Tipado gradual         | ❌     | ✅         | ❌  | ✅ \\* |\n| Compilado nativo       | ❌     | ❌         | ✅  | ✅ †  |\n| **Multiplataforma**    | ⚠️     | ⚠️         | ✅  | ✅ ✱  |\n| HTTP en el core        | ❌     | ❌         | ❌  | ✅    |\n| Async nativo           | ⚠️     | ✅         | ✅  | ✅ ‡  |\n| Docs HTTP automáticas  | ⚠️     | ❌         | ❌  | ✅ ◊  |\n| **Auth nativa**        | ❌     | ❌         | ❌  | ✅ ♦  |\n| **WebSockets tipados** | ⚠️     | ⚠️         | ⚠️  | ✅ ♣  |\n| **Jobs sin Celery**    | ⚠️     | ⚠️         | ⚠️  | ✅ ♠  |\n| **Postgres + ORM nativo** | ⚠️  | ⚠️         | ⚠️  | ✅ ◈  |\n| **Observability OTel** | ⚠️     | ⚠️         | ⚠️  | ✅ ◉  |\n| Interop Python         | ✅     | ❌         | ❌  | ✅ §  |\n\n\\* **Tipado gradual con chequeo estático**. `fitz check` valida anotaciones en compile time; sin anotación se infiere o se trata como `Any`. → [cap 15 de la guía](https://thegreekman76.github.io/fitz/guide/#15-errores-y-mensajes).\n\n† **Compilado nativo via transpile-a-Rust + Cargo**. Binario standalone ~5 MB, sin runtime de Fitz en el destino. Cross-compile gratis vía targets de rustc. → [cap 20](https://thegreekman76.github.io/fitz/guide/#20-fitz-build--compilar-a-binario-nativo).\n\n✱ **Multiplataforma de verdad**. Cada release publica binarios + extensión VSCode + imagen Docker para **4 plataformas** (Windows x64, Linux x64, Linux ARM64, macOS Apple Silicon). El mismo programa Fitz corre en cualquiera de las cuatro — y compilás desde una a las otras sin instalar toolchains extras (cross-compile gratis vía rustc targets). Imagen Docker `ghcr.io/thegreekman76/fitz:latest` lista para `FROM` en boilerplates Dockerizados. Variante `ghcr.io/thegreekman76/fitz:latest-python` (desde v0.9.36) con `--features python` activo, ahorra a los boilerplates 5/6 ~5-8 min de build inicial.\n\n‡ **Async nativo + paralelismo HTTP real**. `async fn` y `.await` postfix, `Future\u003cT\u003e` built-in, evaluator async sobre tokio multi-thread. 5 requests concurrentes en ~1.2s en vez de ~5s en serie. → [cap 19](https://thegreekman76.github.io/fitz/guide/#19-async-y-concurrencia).\n\n◊ **OpenAPI 3.1 + UI Scalar automáticos** desde los decoradores. Schema bit-a-bit idéntico entre `fitz run`, `fitz openapi` y `fitz build`. → [cap 18](https://thegreekman76.github.io/fitz/guide/#18-docs-automáticas).\n\n♦ **Auth nativa** con `@auth_provider`/`@authenticated`/`@admin` + built-ins `jwt` (HS256/384/512) y `hash` (Argon2id). Validación en compile-time, 401/403 automáticos en OpenAPI. Cero deps externas. → [cap 28](https://thegreekman76.github.io/fitz/guide/#28-auth-nativa).\n\n♣ **WebSockets tipados** con `@ws(\"/path\")` + `WsConn\u003cT\u003e`. Marshaling JSON automático para T text (Str / nominal / etc.), frames binarios raw con `WsConn\u003cBytes\u003e` (sin re-encoding ni base64), AsyncAPI 3.0 auto-generado en `/asyncapi.json` (incluye `contentType: application/octet-stream` cuando T=Bytes), heartbeat built-in, auth integrada en el handshake. → [cap 29](https://thegreekman76.github.io/fitz/guide/#29-websockets-tipados).\n\n♠ **Jobs sin Celery** con `@cron(\"expr\")` + `@background` + `spawn(fn_call)`. Sin broker externo (Redis/RabbitMQ no son requisito). Cron-only mode systemd-friendly. **v0.11.2 (iter2)**: kwargs opcionales `tz=` (IANA timezones), `retry={max, backoff, ...}` (3 backoffs), `catch_up=true|false` (missed runs al boot), `store=db` (persiste a `fitz_cron_jobs` + `fitz_cron_runs`). → [cap 30](https://thegreekman76.github.io/fitz/guide/#30-jobs-sin-celery).\n\n▣ **CLI builder nativo (v0.11.0)** con `@command(\"name\", desc=\"...\")`. El binario producido por `fitz build` parsea `std::env::args()`, dispatcha al comando matching y emite `--help` autogenerado **sin `clap`/`argparse`/`click`** (zero deps externas). Convención de params sin decorators extras: positional vs flag se infiere del `default = ...`. Multi-comando con dispatch automático. Exit codes tipados (return `Int`). Paridad bit-a-bit `fitz run` ↔ `fitz build`. **Único lenguaje moderno** que combina HTTP nativo + WebSockets tipados + ORM + jobs + **CLI builder en el core del compilador**, con zero deps externas para estas features intrínsecas. → [cap 34](https://thegreekman76.github.io/fitz/guide/#34-cli-builder-nativo-command) + boilerplate [`cli-tool`](boilerplates/cli-tool/) con 3 subcomandos.\n\n◈ **Postgres + ORM nativo**. **Hito del proyecto (v0.10.0 → v0.10.6)**: driver Postgres puro escrito en Fitz/Rust (~2400 LoC en `src/db.rs`, sin libpq, sin `tokio-postgres`/`sqlx`/`diesel`) + ORM declarativo sobre `type` con decoradores nativos del lenguaje (`@table`/`@primary`/`@column`/`@belongs_to`/`@has_many`/`@has_one`). SQL constante en codegen-time (cada `.where(closure)` se walka del AST DURANTE EL CODEGEN, fragmento SQL hard-coded en el binario — comparable a Diesel/sqlx, mejor que SQLAlchemy/ActiveRecord que construyen SQL via objetos en runtime). Eager loading con dispatch estático (`.preload(\"posts\")` con relation name como Str literal compila a match exhaustivo en compile-time — typos detectados antes de correr). Tipos avanzados nativos: JSONB ↔ `Map\u003cStr, Any\u003e`, arrays Postgres ↔ `List\u003cscalar\u003e` (incluyendo `List\u003cInt?\u003e` con NULL en arrays), `Map\u003cStr, T\u003e` concreto homogéneo. Aggregates scalar + GROUP BY con `Aggregated\u003cRow\u003e` separado de `QueryBuilder\u003cRow\u003e`. **Transactions ORM (v0.10.14-15)** closure-based con `db.transaction(fn(tx) -\u003e Result\u003cT\u003e { ... })` — auto-rollback en `Err`, fn nombrada o FnExpr inline con captures (paridad bit-a-bit). **Migraciones automáticas (v0.10.16)**: `fitz db diff/migrate/status/new` introspecciona el schema real, lo compara con los `@table` types, emite SQL DDL automático con tracking idempotente — cero deps (ni Alembic ni Flyway). `@db_default(\"NOW()\")` opcional para emitir defaults SQL en el CREATE TABLE / ADD COLUMN. **v0.10.6** cierra 7 fricciones residuales del codegen ORM en bloque: `id: 0` auto-asigna bigserial (W4), `db.close().await?` propaga errores como `Result\u003cNull\u003e` (W5), `.update(db, body.changes)` acepta Map var (W7), `.starts_with(prefix)` acepta var Str (W3), `body.field` en closures de `.where` (W6), Map literal `{\"k\": 1}` en field `Map\u003cStr, Any\u003e` (W1), `match user { null =\u003e x, u =\u003e u.name }` con refinement Nullable (W2). Paridad bit-a-bit `fitz run` ↔ `fitz build` validada en CI multi-plataforma con `postgres:16` service container corriendo 16 paridad codegen E2E + 27 evaluator E2E en cada push. **Único lenguaje moderno** que combina driver Postgres puro + ORM declarativo + paridad bit-a-bit intérprete↔binario nativo + LSP completo (autocomplete del ORM end-to-end con tipos refinados) **sin macros derive ni introspection runtime**. **v0.10.27** suma `Type.bulk_insert(rows, db, batch_size=1000)` + composite PK (N `@primary` fields por type) + `@index(col1, col2, ..., unique=true, name=\"...\", where_=\u003cexpr\u003e)` decorator a nivel type. **v0.10.28 — Tier S del ORM**: `fitz db inspect` (introspect del schema real con vista texto + `--json` machine-readable) + `@index(col, using=\"gin\"|\"gist\"|\"brin\"|\"hash\"|\"spgist\")` method override (full-text/range/large-tables sin bajar a `db.exec`) + `FITZ_DB_LOG=1|verbose` (query log a stderr, zero overhead default) + `FITZ_HTTP_LOG=1|verbose` (access log estilo uvicorn — paralelo, ambos via env var opt-in). **v0.10.29 — Cierre masivo del ORM**: JSON path operators (`has_path`/`path_text`/`path_int`/`path_float`/`path_bool`) con cast tipado para nested jsonb, full-text search `@@` (`matches`/`plainto_matches`), `@unique(col1, col2, ...)` composite shortcut, `@check_constraint(\"expr\")` para CHECK constraints declarativos, cross-schema FK transparente (`@belongs_to(\"User\")` desde un type en otro schema emite `REFERENCES \"public\".\"users\"(id)` automáticamente), diff completo de indexes (detecta cambios en `using`/`where_clause`/`unique`/`columns`), `fitz db inspect --all-schemas`, redaction automática de secrets en `FITZ_DB_LOG=verbose`, errores del driver enriquecidos con SQLSTATE + SQL + params (también redactados), `FITZ_DB_MAX_CONNS` env var para pool tuning. **v0.10.30 — Tier B (API completion Date/DateTime/Uuid)**: aritmética nativa sobre los 3 tipos built-in (`.add_days/months/years` + `.subtract_*` symétrico; DateTime también `.add_seconds/minutes/hours`), diff entre fechas (`d1.diff_days(d2)`, `dt2.diff_seconds(dt1)` — signed Int), comparison operators (`\u003c`/`\u003e`/`\u003c=`/`\u003e=`) entre Date-Date y DateTime-DateTime, `Uuid.v7()` time-ordered (RFC 9562 — PKs sortables por created_at en btree), shortcuts (`Date.tomorrow/yesterday`, `DateTime.epoch`), timezone display (`DateTime.to_local()` en TZ del sistema + `.in_tz(\"America/Argentina/Buenos_Aires\")` IANA via `chrono-tz`). 10 E2E nuevos validan paridad bit-a-bit `fitz run` ↔ `fitz build`. **v0.10.31 — Tier A (MVP fuerte del ORM)**: `fitz db diff --check-destructive` con clasificación Safe/Risky/Destructive + abort sin `--allow-destructive`; `ALTER COLUMN TYPE` con `USING col::T` automático; `ALTER TABLE ADD/DROP CONSTRAINT` para CHECKs nuevos via diff; **nested transactions** con SAVEPOINT (`db.transaction(fn(tx){ tx.transaction(fn(inner){...}) })` — inner Err rollback parcial); **isolation levels** custom (`db.transaction(closure, isolation=\"SERIALIZABLE\")` con whitelist 4 niveles ANSI + READ ONLY/WRITE); `db.connect(url, max_conns=N)` kwarg; drift completo de `@check_constraint` (introspect lee `pg_constraint.contype='c'`) + cross-schema FK (introspect popula `references_schema`); FK targeting composite PK del target → error claro pre-DDL en lugar de fallback silencioso. 6 E2E reales contra Postgres validan los caminos del intérprete. **v0.10.32 — Tier C + D (operadores SQL + DX/LSP residual)**: `ts_rank` full-text ranking en `.order_by(fn(u) =\u003e -u.body.rank(\"q\"))` (combinable con `.matches(\"q\")` para search ordering); expression indexes con `@index(expression=\"lower(email)\")` (kwarg dedicado para case-insensitive UNIQUE, FTS setup, totals computados); `qb.merge_jsonb(db, field, patch)` para JSON `||` merge preservando keys existentes; LSP autocomplete de operadores ORM en `.where()` (`is_in`/`like`/`matches`/`has_key`/`path_text`/etc. con detail `(ORM .where)` distintivo); LSP hover sobre `@table` types muestra el `CREATE TABLE` emitted bajo el tipo (debug migrations sin abrir `fitz db diff`). 3 E2E reales contra Postgres validan los caminos del runtime. → [cap 31 (resumen)](https://thegreekman76.github.io/fitz/guide/#31-postgres--orm-nativo) y [guía exhaustiva DB y ORM](https://thegreekman76.github.io/fitz/db-orm/) (~2500 LoC con todos los operadores, recetas, CLI integration y limitaciones).\n\n◇ **Fase 12 Tier 2 (v0.13.0)** — **`fitz deploy` + `@trace`/`@metric` + `@flag` cerrados**. Tres sub-fases coordinadas que cierran el Tier 2 de Fase 12: (1) **`fitz deploy \u003ctarget\u003e`** (12.6) — sub-comando con thin wrappers sobre `docker build`/`compose up`; soporta `docker` (con `--no-push` opt-out) y `compose` (`--no-detach`/`--no-build` opt-outs). Aborta con sugerencia clara si falta Dockerfile/compose.yml. (2) **`@trace(name=\"X\")` y `@metric(name=\"X\")`** (12.7) — decorators apilables sobre fns user (rechazados sobre HTTP/WS — auto-instrumentation Fase 12.3 cubre). `@trace` abre `tracing::info_span!`; `@metric` registra `\u003cname\u003e_duration_seconds` (histogram) + `\u003cname\u003e_calls_total` (counter) al Drop del scope via guard RAII. Kwarg `name=` opcional. Paridad bit-a-bit `fitz run` (no-op honesto) ↔ `fitz build` (instrumentación real). (3) **`@flag(\"name\")` + `flag(name) -\u003e Bool` + módulo `flags`** (12.8) — feature flags built-in con dos fuentes: sección `[flags]` en `fitz.toml` (defaults compile-time, baked-in al binario) + env vars `FITZ_FLAG_\u003cUPPERCASE\u003e` (override runtime). Default `false` (fail-safe, features opt-in). `@flag` sobre HTTP/WS → 404 si flag off (gate hot path antes de middlewares/auth). `flags.is_enabled(name)` alias funcional; `flags.list()` enumera flags conocidos. Paridad bit-a-bit con registry estático `OnceLock` + cache lookup. → [cap 33.5 (@trace/@metric)](https://thegreekman76.github.io/fitz/guide/#335-trace-y-metric--instrumentación-manual-fase-127) + [cap 33.11 (feature flags)](https://thegreekman76.github.io/fitz/guide/#3311-feature-flags-con-flag-flag-y-flags-fase-128).\n\n◉ **Observability minimal con OpenTelemetry (v0.12.0)** — **Fase 12.3 CERRADA**. Tres piezas nativas montadas sobre el stack web first-class: (1) **Structured logging built-in** con `log.info/warn/error/debug(msg, k: v, ...)` que emite a `tracing` + `tracing-subscriber` con dos formatos (JSON estructurado por default, pretty con ANSI colors cuando `FITZ_LOG_FORMAT=pretty`), level configurable con `FITZ_LOG=info|debug|warn|error`. (2) **Spans HTTP automáticos** sobre cada request con OTel span `HTTP \u003cmethod\u003e \u003cpath\u003e` + atributos `http.method`/`http.target`/`http.status_code` + métricas `http.server.requests_total{method,path,status}` (Counter) y `http.server.request_duration_seconds{method,path}` (Histogram) — todo via `metrics = \"0.24\"` crate. Correlación de logs con `trace_id` (32 hex) + `span_id` (16 hex) propagados via `tokio::task_local!` a TODOS los `log.*` adentro del request handler (Fitz, evaluator, OTel SDK). (3) **OTLP exporter** opt-in via env vars: `OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318` activa el exporter HTTP/proto, `OTEL_SERVICE_NAME=mi-app` setea `service.name`, `OTEL_TRACES_SAMPLER_ARG=0.1` configura sampling (default 1.0 = todo, clamp `[0.0, 1.0]`). Sin env var → exporter no se instala (zero overhead default). Opt-out por handler con `@server(observability=false)` que bypassa todo el wrapper (handlers bare-metal). Paridad bit-a-bit `fitz run` ↔ `fitz build`. **Único lenguaje moderno** que combina HTTP nativo + WebSockets + Jobs + ORM + **observability ciudadana en el core del compilador**, con OpenTelemetry collector compatible (Jaeger, Tempo, Honeycomb, Datadog, etc.) — sin `pip install opentelemetry-*`, sin `cargo add tracing-opentelemetry`, sin glue manual. → [cap 33 de la guía](https://thegreekman76.github.io/fitz/guide/#33-observability--logs-spans-métricas-otel).\n\n### Benchmark Fitz ORM vs SQLAlchemy\n\nPara validar la promesa \"binario nativo sin overhead\" del ORM,\nmantenemos un **bench reproducible cabeza-a-cabeza** entre los dos\nboilerplates equivalentes\n([`api-postgres-fitz`](boilerplates/api-postgres-fitz/) vs\n[`api-postgres-python`](boilerplates/api-postgres-python/)) — mismo\nPostgres, mismos endpoints, misma firma. **Headline numbers en v0.10.13**\n(Intel Core Ultra 7 155H, Docker 29.2.1, sustained 30s c=10):\n\n| Métrica | Fitz ORM | Python+SQLAlchemy | Speedup |\n|---|---:|---:|---:|\n| Memory peak | **9.2 MB** | 51 MB | **5.5x más eficiente** |\n| GET /users p50 | **4.88 ms** | 37.85 ms | **7.76x** |\n| GET /users RPS | **1944** | 246 | **7.91x** |\n| GET /users/{id} p50 | **3.60 ms** | 31.87 ms | **8.85x** |\n| GET /users/{id} RPS | **2604** | 296 | **8.80x** |\n| Cold start | **0.14 s** | 0.22 s | 1.57x |\n| Image size | 131 MB | 258 MB | 2x más liviano |\n\n**Reproducí los números** con [`bash benchmarks/orm-vs-sqlalchemy/run.sh`](benchmarks/orm-vs-sqlalchemy/)\n(~5-8 min con cache Docker caliente; requiere `oha` + `jq`). Resultados\npublicables y detalle técnico en\n[`benchmarks/orm-vs-sqlalchemy/README.md`](benchmarks/orm-vs-sqlalchemy/README.md).\n\n§ **Interop Python via PyO3**. Marshaling bidireccional `List`/`Map`/`Instance` ↔ `list`/`dict`, excepciones Python → `Result\u003cT\u003e`, bridge async tokio ↔ asyncio, `fitz py-types` auto-mapeo SQLAlchemy. Opt-in con feature `python`. **`fitz build --bundle-python` produce un binario standalone con CPython 3.14.5 embebido** (~22-35 MB según OS) — corre en cualquier máquina del triple destino sin Python instalado, sin `pip install`, sin runtime externo. **Con `--bundle-pip \u003cpaquete\u003e` repetible** (Fase 8.c) o **`--bundle-pip-requirements \u003cFILE\u003e`** (cosecha 8.c v0.9.42 — lee del `requirements.txt` estándar), también empaqueta paquetes pip adentro: `fitz build --bundle-pip-requirements requirements.txt mi_app.fitz` produce un binario único de ~50 MB que incluye CPython + las deps + tu código. **Desde v0.9.46 el launcher usa crates `tar`+`flate2` inline (sin subprocess `tar`)**, habilitando runtimes minimalistas tipo `gcr.io/distroless/cc-debian12` (~22 MB base). **Smoke real Docker validado end-to-end con Postgres** (v0.9.50/52) en los boilerplates 5/6 — imagen final ~136 MB con sqlalchemy + psycopg2-binary embebidos. **En el destino: cero Python, cero pip, cero venv**. (Para el dev que buildea sí hace falta Python local — cualquier 3.10+ en Windows, 3.14.x en Linux/macOS hasta cerrar `R.bug-pyo3-abi3-portable-link`. Tabla completa de matices en el cap 21.12 de la guía.) **El único lenguaje del cuadro que hace esto** (Python necesita Python + venv + `pip install`, FastAPI necesita uvicorn + venv, Spring necesita JVM, Express necesita Node + npm install, Go no tiene interop Python). PyOxidizer hizo algo parecido para Python puro pero está ralentizado desde 2023; Fitz reimplementa el patrón sobre [python-build-standalone de Astral](https://github.com/astral-sh/python-build-standalone). → [cap 21](https://thegreekman76.github.io/fitz/guide/#21-interop-python).\n\n## Estabilidad\n\nFitz está construido sobre Rust, que tiene un compromiso de estabilidad fuerte desde 2015: código que compila en una versión estable sigue compilando en versiones futuras, y los cambios que podrían romper se aíslan en _editions_ opt-in.\n\nEncima de eso, en este repo:\n\n- `rust-toolchain.toml` pinea la versión exacta de Rust con la que Fitz se construye. Cloná el repo y `rustup` baja esa versión sola — no importa qué Rust tengas instalado globalmente.\n- `rust-version` en `Cargo.toml` documenta la versión mínima soportada. Cargo da un error claro si alguien intenta con una más vieja.\n- `Cargo.lock` fija las versiones exactas de todas las dependencias transitivas, así que builds reproducibles entre máquinas y en el tiempo.\n\nEn la práctica: un cambio en Rust o en una dependencia no rompe Fitz hasta que vos decidas subir las versiones de manera explícita.\n\nEl estado actual del proyecto (fases cerradas, próximo norte, deudas comprometidas) vive en [`docs/roadmap.md`](docs/roadmap.md) y en el [CHANGELOG](CHANGELOG.md).\n\n## Cómo empezar\n\n**1. Instalar Fitz.** One-liner para Linux / macOS / Windows:\n\n```bash\n# Linux / macOS\ncurl -sSf https://thegreekman76.github.io/fitz/install.sh | sh\n```\n\n```powershell\n# Windows (PowerShell)\nirm https://thegreekman76.github.io/fitz/install.ps1 | iex\n```\n\nEl installer baja el último release, extrae los binarios a `~/.fitz/bin/` (o `%USERPROFILE%\\.fitz\\bin\\` en Windows) y te dice cómo agregar el dir al `PATH`. Soporta `--version vX.Y.Z`, `--prefix \u003cruta\u003e` y `--uninstall`.\n\nAlternativas: bajar el binario manual desde [releases](https://github.com/Thegreekman76/fitz/releases/latest) (Linux x64/ARM, macOS ARM, Windows x64) o compilar desde fuente:\n\n```bash\ngit clone https://github.com/Thegreekman76/fitz.git\ncd fitz\ncargo build --release\n# El binario queda en target/release/fitz\n```\n\nDetalle completo (incluyendo VSCode + extensión + troubleshooting) en el [cap C1 del curso](https://thegreekman76.github.io/fitz/curso/m1-setup/c1-instalacion/).\n\n**2. Tu primer programa.**\n\n```fitz\n// hola.fitz\nprint(\"Hola desde Fitz 🏔️\")\n\nname = \"Patagonia\"\nprint(\"Hola, {name}!\")\n```\n\n```bash\nfitz run hola.fitz\n```\n\n**3. Seguir aprendiendo.** Tres puertas de entrada según con qué venís:\n\n- **¿Desde cero, querés que te lleven paso a paso?** El [**curso `Fitz de 0 a experto`**](https://thegreekman76.github.io/fitz/curso/) arranca con la instalación y crece capítulo a capítulo hasta una app real con Postgres + ORM + Docker.\n- **¿Sabés programar, querés referencia feature por feature?** La [**guía del lenguaje**](https://thegreekman76.github.io/fitz/guide/) cubre todo lo implementado en español, con ejemplos ejecutables. Empezá por el [cap 2 — Tu primer programa](https://thegreekman76.github.io/fitz/guide/#2-tu-primer-programa).\n- **¿Buscás la especificación completa** (incluye features futuras)? Ver [docs/syntax-spec.md](docs/syntax-spec.md).\n\n## Boilerplates\n\nPlantillas Dockerizadas listas para arrancar proyectos reales. Cada una tiene README exhaustivo con paso a paso, troubleshooting y plan de producción. Detalle completo en [`boilerplates/README.md`](boilerplates/README.md).\n\n| Boilerplate | Qué demuestra |\n|-------------|---------------|\n| [`cli-tool`](boilerplates/cli-tool/)                           | CLI puro — sales report con métodos funcionales. Binario nativo distroless ~30 MB.                          |\n| [`api-simple`](boilerplates/api-simple/)                       | REST API tipada + OpenAPI 3.1 + UI Scalar autogenerados.                                                    |\n| [`api-middleware-cors`](boilerplates/api-middleware-cors/)     | Auth nativa JWT + Argon2 + middleware encadenado + CORS cross-origin + frontend vanilla.                    |\n| [`api-websocket`](boilerplates/api-websocket/)                 | WebSockets tipados (`WsConn\u003cT\u003e`) con broadcast + heartbeat + frontend chat vanilla.                         |\n| [`api-postgres-python`](boilerplates/api-postgres-python/)     | CRUD multi-archivo con SQLAlchemy + Postgres (compose 2 servicios). **Variante `Dockerfile.distroless` validada v0.9.50** — imagen ~136 MB. |\n| [`api-fullstack-postgres`](boilerplates/api-fullstack-postgres/) | **Showcase fullstack** — API + frontend rico (tabla, edit inline, filtros) + Postgres (compose 3 servicios). **Variante distroless validada v0.9.52** — incluye CORS preflight desde otro origin. |\n\nQuickstart genérico:\n\n```bash\ncd boilerplates/\u003cnombre\u003e\ncp .env.example .env   # si existe\ndocker compose up --build   # o `docker build .`\n```\n\n## CLI\n\nVerificá la instalación con `fitz --version` y `fitz --help`.\n\n**Lenguaje — intérprete y compilador**\n\n| Comando                       | Qué hace                                                                       |\n| ----------------------------- | ------------------------------------------------------------------------------ |\n| `fitz run [archivo]`          | Ejecuta el archivo (o el `[bin].main` del `fitz.toml`) con checker strict.     |\n| `fitz build [archivo]`        | Compila a binario nativo standalone (~5 MB, sin runtime de Fitz en el destino). |\n| `fitz check [archivo]`        | Valida tipos y sintaxis sin ejecutar. Exit 1 si hay errores.                   |\n| `fitz openapi \u003carchivo\u003e`      | Emite el schema OpenAPI 3.1 del programa a stdout. Útil para CI.               |\n\n**Package manager**\n\n| Comando                       | Qué hace                                                                       |\n| ----------------------------- | ------------------------------------------------------------------------------ |\n| `fitz new \u003cnombre\u003e`           | Crea un proyecto Fitz nuevo en una carpeta. `--http` para template HTTP.       |\n| `fitz init`                   | Inicializa un proyecto en el directorio actual.                                |\n| `fitz add \u003cdep\u003e --path/--git` | Agrega una dep al `fitz.toml` y sincroniza el `fitz.lock`.                     |\n| `fitz remove \u003cdep\u003e`           | Quita una dep del `fitz.toml`.                                                 |\n| `fitz update [dep]`           | Re-resuelve deps. Para git deps invalida cache y re-clona.                     |\n\n**Developer experience**\n\n| Comando                       | Qué hace                                                                       |\n| ----------------------------- | ------------------------------------------------------------------------------ |\n| `fitz fmt [archivos]`         | Formatea código Fitz a estilo canónico, cero config. `--check` para CI.        |\n| `fitz test [filter]`          | Corre fns con `@test`. Output estilo cargo (ok/FAILED + summary + exit code).  |\n| `fitz dev [--file]`           | Hot reload — re-arranca el programa cuando un `.fitz` o `fitz.toml` cambia.    |\n| `fitz repl`                   | REPL interactivo con env persistente, multi-line, history, comandos `:type`/`:env`/`:load`. |\n| `fitz lint [archivos]`        | Linter de patrones (unused_variable, unused_import, useless_match, string_concat). |\n\n**Interop Python** (requiere `cargo build --release --features python`)\n\n| Comando                       | Qué hace                                                                       |\n| ----------------------------- | ------------------------------------------------------------------------------ |\n| `fitz py-types \u003carchivo.py\u003e`  | Genera `type` Fitz desde modelos SQLAlchemy. Output a stdout o `--out`.        |\n\n**Deployment** (Fase 12.4)\n\n| Comando                       | Qué hace                                                                       |\n| ----------------------------- | ------------------------------------------------------------------------------ |\n| `fitz docker init [--force]`  | Genera `Dockerfile` + `.dockerignore` + `docker-compose.yml` smart por defecto. Detecta `@server(port)`, `db.X(...)`, `from python import X`, `@cron` y adapta runtime + compose. |\n| `fitz docker build [--tag X]` | Thin wrapper sobre `docker build -t \u003ctag\u003e .`. Default `\u003cpackage.name\u003e:latest`. |\n\n## Extensión VSCode\n\nHighlighting + LSP (diagnostics, hover, go-to-definition, autocomplete contextual) con el binario `fitz-lsp` bundleado en cada `.vsix` por plataforma.\n\n**Instalar desde releases (recomendado)**:\n\n1. Bajá el `.vsix` correspondiente a tu OS/arquitectura de [releases](https://github.com/Thegreekman76/fitz/releases/latest):\n   - **Windows x64**: `fitz-lang-win32-x64.vsix`\n   - **Linux x64**: `fitz-lang-linux-x64.vsix`\n   - **Linux ARM64**: `fitz-lang-linux-arm64.vsix`\n   - **macOS Apple Silicon (M1/M2/M3)**: `fitz-lang-darwin-arm64.vsix`\n2. En VSCode: `Ctrl+Shift+P` → \"Extensions: Install from VSIX...\" → seleccioná el archivo bajado.\n3. Listo — abrí cualquier `.fitz` y vas a tener errores subrayados al tipear, hover con tipos, F12 para go-to-definition, y autocomplete contextual.\n\n\u003e Nota: las plataformas en la matriz de release son las 4 listadas arriba. macOS Intel (`darwin-x64`) y Windows ARM64 (`win32-arm64`) no están — el primero por escasez crónica de runners macos-13 en GitHub Actions, el segundo porque axum aún no compila estable en ese target. Si necesitás alguna de esas, build local (próxima sección) funciona idéntico.\n\u003e\n\u003e Cuando se cree la cuenta de publisher en el VSCode Marketplace, la extensión va a estar instalable en un clic desde la UI de Extensions buscando `fitz`. Por ahora releases en GitHub es el camino canónico.\n\n**Build local** (alternativa, si querés trackear `main` o no encontrás tu plataforma en releases):\n\n```bash\ncd editors/vscode\nnpm install\nnpm run build:vsix     # produce un `.vsix` para tu plataforma actual\n```\n\nDetalle completo en [cap 22 de la guía](https://thegreekman76.github.io/fitz/guide/#22-soporte-para-editores).\n\n## Nombre\n\n**Fitz** por el Fitz Roy — la montaña más icónica de la Patagonia, en El Chaltén, Argentina. Un nombre que no se olvida.\n\n## Autor\n\nDesarrollado en El Chaltén, Santa Cruz, Argentina 🇦🇷\nPor un developer independiente que quería un lenguaje que no tuviera que disculparse por nada.\n\nTheGreekMan (Palopoli Martín)\n\n### Cómo se construye\n\nUna nota honesta sobre el proceso, porque me parece más\ninteresante que esconderlo:\n\nLa idea, el roadmap, las decisiones de diseño y la dirección\ndel lenguaje son mías. Soy dev full-stack (Python, FastAPI,\nVue, Docker, Postgres) y aprendí Rust específicamente para\nconstruir Fitz. Cada decisión del lenguaje — por qué HTTP es\nciudadano de primera, por qué `Result` y no excepciones, por\nqué `@table` se valida en compile-time — sale de frustraciones\nconcretas de mi trabajo diario.\n\nEl día a día de la implementación es colaborativo con Claude\n(Anthropic). El flujo típico: yo describo lo que quiero,\ndiscutimos trade-offs, escribo o me sugiere código, lo reviso,\nitero. Cuando me trabo con un sub-paso complejo, a veces caigo\nen lo que la comunidad llama *vibe coding* — describir el\nproblema en voz alta y refinar juntos hasta que sale. Otras\nveces es revisión de código pura, o debugging compartido.\n\nEl SHA del commit es mío, la responsabilidad técnica es mía,\npero el proceso real es de a dos. Lo digo porque me parece más\nhonesto que vender una historia de \"lo hice solo a la\nmedianoche\" que no es como funcionó.\n\nSi te resuena el modelo, los commits cuentan la historia fina:\nqué pensé, qué probé, qué descarté.\n\n## Licencia\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthegreekman76%2Ffitz","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthegreekman76%2Ffitz","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthegreekman76%2Ffitz/lists"}