Ecosystem Architecture
How production projects connect as one intentional platform — shared ingress, embeds, and ops habits.
These projects share ingress patterns, embeddable services, and repeatable ops habits—not five unrelated demos. The portfolio is the hub; production apps feed data back into it and into GitHub.
Architecture overview
flowchart TB
Users["Users / browsers"]
subgraph apps["Apps"]
Portfolio["jovylle.com<br/>Nuxt portfolio + widget"]
Playbase["fast.jovylle.com<br/>Playbase reaction game"]
D1G["d1g.uk<br/>Desert digging tool"]
ChatW["chat-widget.uft1.com<br/>Embeddable GPT chat"]
end
subgraph shared["Shared services"]
CDN["content.jovylle.com<br/>Project catalog JSON"]
Pocket["pocket.uft1.com<br/>Notifications + highlights"]
PMate["projectmate.uft1.com<br/>Feedback & updates overlay"]
end
subgraph platform["Platform layer"]
Netlify["Netlify<br/>Build + serverless functions"]
GH["GitHub<br/>Repos + Actions"]
end
Obs["Umami analytics<br/>jovylle.com"]
Users --> Portfolio
Users --> Playbase
Users --> D1G
Users --> ChatW
Portfolio --> Netlify
Portfolio --> Playbase
Portfolio --> Pocket
Portfolio --> PMate
Portfolio --> CDN
Playbase --> GH
GH --> CDN
GH --> Netlify
Users --> Obs
Alt text: Architecture diagram showing browsers connecting to portfolio, Playbase, d1g.uk, and chat-widget; shared CDN and notification services; Netlify and GitHub as platform; Umami for site analytics.
Products in the ecosystem
Portfolio — jovylle.com
Problem: Recruiters need one place to see shipped work, not a scatter of repos.
Role in the platform: Central hub. Nuxt 3 site on Netlify with a floating widget (AI chat, Playbase leaderboard, notifications), ProjectMate embed for feedback/updates, and a prerendered project archive fed by content.jovylle.com.
Case study: Personal projects archive · GitHub
d1g.uk — d1g.uk
Problem: Sunflower Land players need a fast, visual way to plan Desert digs when the in-game API only shows today.
Role in the platform: Highest-traffic standalone product in the ecosystem. Companion hub at hub.d1g.uk for saved/shared community grids. Shares the uft1/d1g domain family with other tools.
Case study: GitHub — sfl-crab · User feedback
Playbase — fast.jovylle.com
Problem: A lightweight, replayable skill game that keeps score across sessions and surfaces results outside the game tab.
Role in the platform: Gamification layer. Reaction-test game with an all-time leaderboard JSON API (/reaction/top.json). The portfolio widget proxies this via /api/leaderboard and links directly to play. Repo describes an automated seasonal leaderboard synced through GitHub Actions.
Note: Live game is at fast.jovylle.com. A playbase.jovylle.com hostname is planned in ecosystem docs but not verified in current deployment config.
Case study: GitHub — playbase
chat-widget — chat-widget.uft1.com
Problem: Drop a GPT-powered chatbot onto any site without rebuilding the host app.
Role in the platform: Reusable embed product (separate from the portfolio's own AI widget). Standalone script + Netlify/serverless backend pattern, same "one script tag" philosophy as ProjectMate.
Consumer sites: TBD — embed is site-agnostic; confirm specific hosts before listing publicly.
Case study: GitHub — chatbot-widget
ProjectMate — projectmate.uft1.com
Problem: Visitors need in-context feedback and release notes without leaving the page or opening GitHub Issues.
Role in the platform: Cross-site support overlay. Loaded on jovylle.com via embed.js with projectId: jovylle-com — feedback, updates, and about panel; chat disabled on portfolio. Same embed pattern can attach to other properties in the uft1.com family.
Case study: GitHub — projectmate-embedded-app
Infrastructure highlights
- Netlify for jovylle.com — static Nuxt build,
/.netlify/functions/chatbotfor production AI chat,/api/leaderboardproxy in dev and prod. - Decoupled content CDN — project catalog at
content.jovylle.com; portfolio rebuild triggered by GitHub Actions → Netlify build hook after CDN publish (hook URL in GitHub secrets, not in git). - Notification bus —
pocket.uft1.com/notifications/index.jsonfeeds the portfolio widget's alert tab; highlights JSON on the same host powers/highlights. - Embeds over iframes where it matters — ProjectMate overlay, portfolio widget (
embed-inline.js), and chat-widget each ship as a single async script. - Secrets out of repo —
OPENAI_API_KEYvia Netlify env; build hooks via GitHub Actions secrets. - Prerender vs live fetch —
/personal-projectsprerendered from CDN JSON at build time;/highlightsfetches live at runtime (different freshness tradeoffs, intentional). - GitHub as integration bus — profile automation repo (
jovylle/jovylle, GitHub Actions), content rebuild webhooks, and Playbase leaderboard automation. - Edge / CDN provider for uft1.com & d1g.uk: TBD — confirm Cloudflare (or other) before claiming in public docs.
Cross-project flows
1. Play → score → portfolio (and GitHub)
- User plays the reaction test at fast.jovylle.com.
- Score is persisted server-side; top entries exposed at
https://fast.jovylle.com/reaction/top.json. - Portfolio widget on jovylle.com fetches via
/api/leaderboardand shows live top players with a "Play now" link. - GitHub profile README updated by Actions in the Playbase / profile automation repos (exact pipeline: see playbase and jovylle/jovylle).
2. Visitor uses d1g.uk
- Player opens d1g.uk for today's Desert grid visualization.
- Tool runs as a Nuxt/serverless front-end (repo:
sfl-crab); optional feedback via d1g.uk/feedbacks. - Community history and shared grids live on hub.d1g.uk (separate repo:
sfl-digging-hub). - Backend/data-store details per environment: TBD in public docs.
3. Support & notifications on portfolio
- Visitor lands on jovylle.com; widget loads notifications from
pocket.uft1.com. #supporthash or support action opens ProjectMate overlay (projectmate.uft1.com) for feedback and release notes.- AI chat tab calls Netlify serverless function with portfolio context (when enabled); widget itself carries no third-party analytics.
Impact & metrics
| Metric | Source | Note |
|---|---|---|
| d1g.uk daily visitors | Project catalog metadata | ~300/day (self-reported in CMS catalog; verify with analytics export) |
| Portfolio traffic | Umami (jovylle.com) | Regular daily usage; no public DAU/WAU figure |
| Playbase leaderboard | fast.jovylle.com/reaction/top.json | Public JSON; all-time archive on game site |
| Content freshness | GitHub Actions → Netlify hook | Rebuild after content.jovylle.com JSON updates |
| Widget notification reach | pocket.uft1.com index | Tag-filtered (jovylle.com,all) on portfolio |
| chat-widget adoption | TBD | Confirm embed domains before publishing counts |
| Cloudflare Web Analytics | TBD | Not wired on jovylle.com today (Umami in use) |
What I'd improve next
- Single observability layer — Umami covers the portfolio; d1g.uk, Playbase, and uft1 subdomains lack a unified dashboard. I'd add consistent uptime checks and error logging across the ecosystem, not just the main site.
- Hostname clarity — Playbase (
fast.jovylle.comvsplaybase.jovylle.com) and the three embed products (portfolio widget, chat-widget, ProjectMate) need a public map so integrators know which script to use. - Document cross-repo data contracts — leaderboard JSON, notification index, and CDN project schema are integration APIs today but undocumented for external consumers; I'd version and publish them.
Explore the ecosystem
Live
- jovylle.com — Portfolio & widget hub
- d1g.uk — Desert digging tool
- hub.d1g.uk — Community digging hub
- fast.jovylle.com — Playbase reaction game
- chat-widget.uft1.com — Embeddable chatbot
- projectmate.uft1.com — Feedback & updates overlay
- uft1.com — Utility tools hub
GitHub
Built by Jovylle Bermudez — infrastructure-minded full-stack engineer. Questions: [email protected].