← back to projects
journalctl -u ape-sena --full

journalctl -u ape-sena --full

APE-SENA Monorepo

Enterprise ecosystem with unified portals, shared auth, and an npm-published rich-text editor.

0

React portals

0KB

npm renderer

0%

less duplication

0

shared packages

alejandro@codedbyjav.cc :~$ cat context.md

Why?

context.md

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

objectives.checklist
  • 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

architecture.flow
Users Portal Transactional CMS @ape/* pkgs Storybook

alejandro@codedbyjav.cc :~$ npm ls --depth=0

Tech stack

Turborepo React 19 TypeScript Vite 7 Tailwind 4 TipTap Storybook pnpm Turborepo React 19 TypeScript Vite 7 Tailwind 4 TipTap Storybook pnpm

alejandro@codedbyjav.cc :~$ tail -f results.log

Results

results.log
[OK] [OK] 6 portals deployed with shared components
[OK] [OK] ape-rich-text published on npm with ~5KB renderer
[OK] [OK] 40% less duplicated code across portals
[OK] [OK] Onboarding reduced from 3 weeks to 5 days

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.

LinkedIn →