Tu identidad profesional como código. Un solo source of truth versionado (YAML) → textos optimizados por plataforma (LinkedIn, GitHub, Upwork, X, ResearchGate…) con skills por plataforma que codifican el conocimiento SOTA de cada red.
CLI-first · TypeScript · Sin infraestructura · Tus datos siempre tuyos.
Project page: christianluciani.github.io/profile-as-code — la misma entrada, para quien no llega por el repositorio.
¿Primera vez acá? START-HERE elige la ruta según quién sos (persona sin terminal · contribuidor · agente); USER-GUIDE es la referencia completa.
Es una herramienta para personas técnicas: lo mínimo es una terminal y Node.js ≥ 22. El workspace es una carpeta; un repo es el lugar recomendado para guardarla, no un requisito (SPEC §9). Tres on-ramps, cada uno con su diferencia de capacidades al frente:
| On-ramp | Qué te da | Automatización + historial | Cuenta + repo |
|---|---|---|---|
| Template repo (recomendado) | workspace de ejemplo completo, docs operativas, licencia, automatización | sí | requerido |
pasco init local |
carpeta mínima y válida en segundos | no | ninguno |
| Traé tu almacenamiento | el mismo pasco init, escrito en la ruta que elijas (disco, nube, otro host git) |
igual que pasco init |
ninguno |
El paquete @profile-as-code/cli está publicado en npm (0.4.0 — npm view, checked 2026-11-04), así que los dos
caminos sin cuenta funcionan hoy sin acceso a ningún repo. El template repo (on-ramp A) es
público (verificado 2026-10-23: gh repo view ChristianLuciani/profile-data-template --json visibility → PUBLIC, HTTP 200), así que Use this template resuelve para cualquiera
— la cuenta y el repo siguen siendo el requisito del on-ramp A (STANDARDS community item 10).
El camino hosted — un perfil publicado por nosotros, sin cuenta y sin terminal — es un no-goal declarado de v1: ninguno de estos on-ramps llega ahí, y su trigger de reapertura vive en el SPEC §2. M5 es un renderer de consumo, no un onboarding hosted (SPEC §12).
Instalación, verificación y el paso a paso de cada on-ramp: User Guide (EN). Acá abajo, el qué y el por qué.
El mismo perfil vive en 8+ plataformas, cada una con reglas, límites y audiencias distintas. Se editan a mano, se desincronizan, y los hechos (fechas, proyectos, publicaciones) se contradicen entre redes. No existe forma de versionar tu presencia profesional ni de hacerla consistente sin copiar-pegar.
┌───────────────────────────────────────────────────────┐
│ REPO PÚBLICO (producto) │
│ ┌─────────┐ ┌───────────────┐ ┌─────────────────┐ │
│ │ DATA │→ │ CORE │→ │ RENDERERS │ │
│ │ YAML │ │ validación │ │ linkedin/ │ │
│ │ +schema│ │ normalización│ │ upwork/github/ │ │
│ │ │ │ drift-check │ │ x/researchgate/│ │
│ │ │ │ geo-check │ │ substack │ │
│ └─────────┘ └───────────────┘ └─────────────────┘ │
│ CI: validate · lint · tests · build │
└───────────────┬──────────────────────────┬────────────┘
│ datos del usuario │ outputs listos
┌───────────────▼──────────┐ ┌───────────▼──────────────┐
│ REPO PRIVADO (tuyo) │ │ deploy: pegar (LinkedIn,│
│ content/*.yaml │ │ Upwork…) o git/API │
│ profiles/ (generados) │ │ (GitHub README, web) │
│ CHANGELOG · CHECKLIST │ │ │
└──────────────────────────┘ └──────────────────────────┘
- Hechos y storytelling separados: los datos son deterministas (schema, validación, drift-check); los textos son ángulos por plataforma, generados con IA y elegidos por vos (3 variantes → elegís una).
- Skills por plataforma (una por LinkedIn, Upwork, GitHub, X…): límites oficiales, ranking/SEO+GEO, ángulos por audiencia, trampas y checks ejecutables. Se proyectan a tu skill-studio de agente.
- GEO (generative engine optimization) como capa transversal: los LLM leen y citan perfiles hoy.
La consistencia factual cross-platform ES citabilidad — un modelo que cruza LinkedIn vs GitHub y encuentra
contradicciones te descarta. El
geoCheckdel core garantiza hechos idénticos, anclas semánticas y readiness para datos estructurados (schema.org JSON-LD). - Multilingüe: contenido por idioma (
ENesencial para reclutadores internacionales,ESnativo,FRdeseable). Docs del repo en inglés (D8). - Deploy como checklist: las plataformas sin API (LinkedIn, Upwork) se marcan como "pegar + verificar";
las con API (GitHub) se actualizan por git/API.
pasco status --markconfirma el deploy (attested, §19.5) ypasco status --verify—opt-in, el único camino con red— comprueba que la página viva siga coincidiendo con el ancla, o lo reporta honestamente (unverifiable,out-of-band-drift).
Plataformas (enum D16): 49 (34 Postiz + 15 operator extras) · renderers: 9 · skills: 14.
| Fase | Estado |
|---|---|
| Prior-art research | ✅ docs/research/01-prior-art.md |
| Spec (decisiones en §5) | ✅ docs/SPEC.md (GEO, i18n, profile-data, Substack, brand flavor D15/§17) |
| Investigación SOTA por plataforma | 🚧 skills/github-readme + skills/github-org + skills/kofi + skills/hotmart; resto: asistente SOTA Research, ver docs/research/RUN.md |
| Schema JSON v2.0 (contrato) | ✅ schema/profile.schema.json (person + brand flavor) |
| Core engine (load · drift · geo · compile) | ✅ packages/core (tests, CI) |
CLI pasco |
✅ init·validate·build·diff·status; check ejecuta reglas offline M6/M7/M8 + fact-present (#283) + la advisory text/same-across-platforms (#462); audit --json ✅ (hallazgos: dangling-ref · contradiction · unsourced-claim, sin score); entity --json/--jsonld ✅ (proyección schema.org + bloque JSON-LD paste-ready, #287); refine 🚧; skills:export ✅ — detalle en packages/cli/README.md |
| Renderer GitHub (dogfood) | ✅ github-readme + github-org (brand) + la familia paste (kofi v1.7; buymeacoffee/liberapay/gumroad/payhip v1.8; hotmart v1.9) |
Brand flavor (M6, D15): el mismo engine modela identidades de marca — pasco init --flavor brand, handle matrix (socialHandles), schema.org/Organization GEO,
renderer github-org. Primer workspace brand: Topia — planeado como repo privado
(recomendado, no requisito; la carpeta es el workspace, SPEC §9.1).
pnpm install
pnpm test # workspace tests (vitest)
pnpm build # build (CLI: tsup transpile-only — type gate is pnpm typecheck, #108)
pnpm typecheck # tsc --noEmit, whole workspace (CI-enforced since #108)
pnpm lint # style gate (Biome: lint + format + import order)
pnpm gen:zod # regenera Zod desde schema/profile.schema.json (D3)
pnpm gen:platforms # regenera las superficies derivadas desde platforms/registry.yaml (#154)docs/USER-GUIDE.md— guía de usuario: instalación → workspace → primer load de datos → updates (EN).docs/SPEC.md— el contrato del motor: goals, decisiones (§5), data model, core interfaces, GEO, roadmap, brand flavor (§17).docs/research/— prior-art + prompts de investigación SOTA por plataforma.schema/README.md— el contrato de datos: mapping de archivos, semántica de validación.docs/SCHEMA-CONTRACT.md— el contrato publicado para consumidores sin el engine: URL tag-pinned + sha256 del schema (y qué no cubre).docs/ci-cd.md— protección de main, CI, dependabot (cómo y por qué).packages/core/README.md— el motor: APIs, tests.
- M1 spec + schema + core ✅ → CLI
pasco✅ (init·validate·build·diff·status, audit + entity ✅; refine/check 🚧, skills:export ✅ — detalle enpackages/cli/README.md) - M2 renderer
github-readme+ CI + dogfood - M3 investigación SOTA → skills v1 +
pasco refine(hub local) - M4 renderers linkedin/upwork/x/researchgate/substack + playbooks +
pasco check - M5 renderer web, template
profile-datarelease, CONTRIBUTING completo
profile-as-code/
├── schema/ # EL contrato (JSON Schema, semver, aditivo)
├── packages/
│ ├── core/ # ✅ load · drift · geo · compile (Zod desde schema)
│ ├── renderers/ # github-readme + github-org + kofi — más adapters por plataforma (seam de contribución)
│ └── cli/ # pasco — init·validate·build·diff·status + audit/entity ✅ + edit S1 (preview read-only, #248) (refine/check 🚧, skills:export ✅; check ejecuta reglas offline M6/M7/M8, igual que packages/cli/README.md)
├── skills/ # skills por plataforma (conocimiento SOTA)
├── templates/
│ ├── profile-data/ # on-ramp A: puntero al template repo del workspace (SPEC §9.2)
│ └── profile-data-brand/ # on-ramp B (brand): skeleton brand generado por `pasco init --flavor brand` (multi-workspace, §9.1/§17.2)
└── docs/ # SPEC, research, ci-cd, build prompts
Los datos reales de cada usuario viven en una carpeta propia (privada por recomendación),
nunca aquí. La forma recomendada de crearla es el template repo — on-ramp A, ver
docs/SPEC.md §9.2; los on-ramps B (pasco init) y C (traé tu almacenamiento) no necesitan
cuenta ni repo.
- 💬 Discussions — preguntas, ideas y chat. Issues: bugs y propuestas concretas.
- 🛠️ Contributing — guía completa: qué aportar, reglas, workflow de PR, skills.
- 🤝 Code of Conduct — Contributor Covenant.
- 🏛️ Governance — modelo, aceptación de contribuciones, camino a co-maintainers.
- 🐛 Issues: bug · feature · good first issue
- 🔒 Security — reportes privados vía GitHub Security Advisories.
- PRs de renderers — un adapter por plataforma en
packages/renderers/. - PRs de skills — conocimiento SOTA de una plataforma que no cubrimos (Behance, Xing, Indeed…). Toda skill pasa por review: sanitización + security scan + test de comportamiento.
- Regla de evidencia: toda afirmación cuantitativa de una skill lleva fuente + fecha.
Si el proyecto te resulta útil, podés patrocinarlo desde GitHub Sponsors,
dejar un tip en Ko-fi o apoyar en Patreon.
El patrocinio financia el trabajo sobre el engine (packages/core) y la CLI pasco (packages/cli):
el contrato de docs/SPEC.md, los renderers y las skills por plataforma. Qué no compra: no hay SLA
ni soporte prioritario, y no da influencia sobre el roadmap — las decisiones se discuten a la vista en
los issues y en docs/SPEC.md, y una propuesta se evalúa por sus méritos, no por quién la financia.
El proyecto sigue siendo MIT: el código ya es tuyo, pagues o no.
Sponsors: el nombre y logo de cada tier se publican acá, en orden de tier — no de monto. Si sos el primero en tu tier, tu espacio ya está reservado.
El isotipo, el lockup y la lámina de identidad viven en site/brand/, con
el manual en BRAND.md: construcción, color, tipografía y reglas
de uso. El código es MIT; el nombre y el logo no — ver TRADEMARK.md
y site/brand/LICENSE.
MIT para el código — ver LICENSE. El nombre y el logo quedan fuera de esa
licencia: TRADEMARK.md y site/brand/LICENSE.
