Jovylle Bermudez

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/chatbot for production AI chat, /api/leaderboard proxy 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 buspocket.uft1.com/notifications/index.json feeds 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 repoOPENAI_API_KEY via Netlify env; build hooks via GitHub Actions secrets.
  • Prerender vs live fetch/personal-projects prerendered from CDN JSON at build time; /highlights fetches 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)

  1. User plays the reaction test at fast.jovylle.com.
  2. Score is persisted server-side; top entries exposed at https://fast.jovylle.com/reaction/top.json.
  3. Portfolio widget on jovylle.com fetches via /api/leaderboard and shows live top players with a "Play now" link.
  4. GitHub profile README updated by Actions in the Playbase / profile automation repos (exact pipeline: see playbase and jovylle/jovylle).

2. Visitor uses d1g.uk

  1. Player opens d1g.uk for today's Desert grid visualization.
  2. Tool runs as a Nuxt/serverless front-end (repo: sfl-crab); optional feedback via d1g.uk/feedbacks.
  3. Community history and shared grids live on hub.d1g.uk (separate repo: sfl-digging-hub).
  4. Backend/data-store details per environment: TBD in public docs.

3. Support & notifications on portfolio

  1. Visitor lands on jovylle.com; widget loads notifications from pocket.uft1.com.
  2. #support hash or support action opens ProjectMate overlay (projectmate.uft1.com) for feedback and release notes.
  3. AI chat tab calls Netlify serverless function with portfolio context (when enabled); widget itself carries no third-party analytics.

Impact & metrics

MetricSourceNote
d1g.uk daily visitorsProject catalog metadata~300/day (self-reported in CMS catalog; verify with analytics export)
Portfolio trafficUmami (jovylle.com)Regular daily usage; no public DAU/WAU figure
Playbase leaderboardfast.jovylle.com/reaction/top.jsonPublic JSON; all-time archive on game site
Content freshnessGitHub Actions → Netlify hookRebuild after content.jovylle.com JSON updates
Widget notification reachpocket.uft1.com indexTag-filtered (jovylle.com,all) on portfolio
chat-widget adoptionTBDConfirm embed domains before publishing counts
Cloudflare Web AnalyticsTBDNot wired on jovylle.com today (Umami in use)

What I'd improve next

  1. 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.
  2. Hostname clarity — Playbase (fast.jovylle.com vs playbase.jovylle.com) and the three embed products (portfolio widget, chat-widget, ProjectMate) need a public map so integrators know which script to use.
  3. 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

GitHub


Built by Jovylle Bermudez — infrastructure-minded full-stack engineer. Questions: [email protected].