journalctl -u ape-sena --full
APE-SENA Monorepo
Enterprise ecosystem with unified portals, shared auth, and an npm-published rich-text editor.
React portals
npm renderer
less duplication
shared packages
alejandro@codedbyjav.cc :~$ cat context.md
Why?
The Public Employment Agency ran multiple portals (users, transactional, CMS) with divergent codebases. Each team reimplemented auth, tables, and editors. Releases were slow and the design system did not scale across products. Development and operations teams felt the pain: visual inconsistency, duplicated bugs, and weeks of onboarding for each new portal.
alejandro@codedbyjav.cc :~$ grep -E "^\[ \]" objectives.md
Goals
- ○ Unify 6 portals under a monorepo with incremental builds.
- ○ Publish reusable npm packages (@ape/auth, ape-rich-text).
- ○ Establish a design system with Storybook and shared tokens.
- ○ Reduce onboarding time for new developers.
- ○ Keep independent deployments per portal.
alejandro@codedbyjav.cc :~$ ls adr/
Architecture decisions
Turborepo + pnpm workspaces
alternatives: Separate repos, Nx, Lerna
why: Remote cache, parallel pipelines, and simple conventions for mixed teams.
trade-off: Initial configuration curve and strict dependency policies.
Published npm package ape-rich-text
alternatives: Copy code across portals, ad-hoc CDN bundle
why: ~5KB renderer reusable across all portals with semantic versioning.
trade-off: Overhead of coordinated releases between consumers.
React 19 + Vite 7 per app
alternatives: Next.js everywhere, legacy CRA
why: Admin SPAs without SSR; fast HMR and lightweight builds per portal.
trade-off: SEO and advanced routing delegated to specific public portals.
Storybook as UI source of truth
alternatives: Figma-only, Confluence documentation
why: Components tested in isolation before integrating into 6 apps.
trade-off: Dual maintenance of stories and real pages.
alejandro@codedbyjav.cc :~$ tree -L 2 apps/
Architecture
alejandro@codedbyjav.cc :~$ npm ls --depth=0
Tech stack
alejandro@codedbyjav.cc :~$ tail -f results.log
Results
lessons learned
- Versioning internal packages like external products prevents silent debt.
- Storybook pays off when more than 3 consumers share the same component.
- Turborepo shines when teams need independence and coherence at once.
Building something together?
Open to senior full-stack roles and selected freelance work. Reach me on LinkedIn — I read every message.