Eigen communityplatform · sinds 2020

Applicaties voor een gamecommunity.

Ik heb The Cantina Network opgericht, een online gamecommunity van meer dan 400 leden, en ik bouw en beheer de tools erachter: ledenaccounts, roosterplanning, automatisering voor de community en chatkoppelingen. Het werk verbindt webdevelopment met identiteit, infrastructuur, gecontroleerde releases en een gedocumenteerde overdracht.

Ik heb deze tools zelf ontworpen en gebouwd, voor onze community. Ik werk samen met het TCN-team en overleg met andere developers, maar de code en de architectuur zijn van mij.

01 / In de praktijk

Tools voor leden en organisatoren.

Ledenaccounts, seizoensplanning en raids

Leden moeten hun game-identiteit koppelen, personages kiezen en meedoen aan een seizoen. Organisatoren van de guild hebben een duidelijk overzicht van aanmeldingen en aanwezigheid nodig.

Ik heb de React-interfaces en API’s achter Accounts en Roster gebouwd. Accounts beheert de koppelingen met providers en de inloggegevens; Roster gebruikt afgebakend bewijs naast gegevens uit de game, en beheert zelf de seizoenskeuzes, raids en aanwezigheid. De eigen raidbot verbindt aanmeldingen en herinneringen met Discord.

Hoe accountbewijs doorstroomt

Inloggen als lid
TCN Accounts
Koppeling met provider
Afgebakend bewijs
WoW Roster

Huidige standAccounts en Roster zijn live. Sommige paden voor inloggen en providerkoppelingen worden nog getest.

Raidplanner met vier groepen spelers, aantallen per rol en een lijst met reservespelers.
Officers slepen spelers naar groepen en zien de rolverdeling in één oogopslag.
Raidplanner met vier groepen spelers, aantallen per rol en een lijst met reservespelers.

Officers slepen spelers naar groepen en zien de rolverdeling in één oogopslag.

Eerste stap van een aanmeldformulier in vier stappen, met de vraag welke groep bij de speler past.
Aanmelden voor het seizoen in vier korte stappen.
Eerste stap van een aanmeldformulier in vier stappen, met de vraag welke groep bij de speler past.

Aanmelden voor het seizoen in vier korte stappen.

In de praktijk / Interactieve demo

WoW Roster: een raid klaar houden.

Speel een voorbeeldraid: meld Tide afwezig, wissel spelers, verander specialisaties of voeg een opgeslagen personage toe. Bekijk Auto-sort en de groepswijzigingen voordat je ze toepast.

Over deze demoEen interactieve lokale preview met fictieve gegevens, ingebouwd in dit portfolio. De demo zelf is in het Engels, net als de applicatie. Een werkende lokale bewerking van de raidplanner, met vier groepen en 23 fictieve aanmeldingen. Opgeslagen personages kiezen, aanwezigheid, plaatsingen en raidinstellingen werken. Accounts, gamediensten en de raidbot zijn niet verbonden. Wijzigingen verdwijnen als je de pagina herlaadt.

Een chat die bij de community past

Een onafhankelijke chatdienst heeft een herkenbare identiteit en goede toegang via web en desktop nodig, en moet onderhoudbaar blijven terwijl het onderliggende product verandert.

Ik pas de gehoste Fluxer-frontend aan en onderhoud een TCN-versie van de Electron-client. Het werk omvat thema’s in eigen huisstijl, een gecontroleerde serverkeuze, gescheiden desktopsessies en een keuzescherm voor als je offline bent. Bij elke wijziging hoort een patchbeschrijving: wat hij doet, van welke upstreamversie hij afhangt en hoe je hem opnieuw toepast en controleert.

Desktopapp (in test)

Fluxer-client
TCN-identiteit
Serverkeuze
Gescheiden sessies
Offline herstel

Huidige standDe gehoste Chat en de thema’s zijn live, met de eigen login van Chat. De desktopapp werkt lokaal, maar is nog niet uitgebracht.

Inlogscherm in eigen huisstijl van de Cantina Chat-desktopapp.
De Cantina Chat-desktopapp.
Inlogscherm in eigen huisstijl van de Cantina Chat-desktopapp.

De Cantina Chat-desktopapp.

Communityworkflows over chatplatformen heen

Organisatoren moeten deelnemende Discord- en Fluxer-ruimtes kunnen koppelen, keuzes voor doorsturen kunnen beheren en kunnen zien wat er gebeurde als een koppeling faalt.

Ik heb de Management Bot gebouwd, met het dashboard en de duurzame relayworkflow. Gebeurtenissen van de platformen komen in een inbox/outbox-systeem terecht, waarbij afgebakende toestemming en kanaalbeleid bepalen wat wordt doorgelaten. Diagnose van workers en levenscyclus maakt gedeeltelijke storingen controleerbaar. Deze bot staat los van de raidbot van Roster.

Doorsturen van tekstberichten

Discord- / Fluxer-gateway
Duurzame inbox
Toestemming & beleid
Sync-worker
Doeladapter

Huidige standAutomatisering en doorsturen zijn live. Spraakfuncties hebben nog langer lopende tests nodig.

Van raidplan naar de game

Een opstelling die op de website is gepland, moet in de game nog met de hand worden nagebouwd. Organisatoren willen de raidgroepen ingedeeld en ontbrekende spelers uitgenodigd zien zonder iets over te typen.

Ik heb TCN Assistant gebouwd, een World of Warcraft-addon voor raidorganisatoren. Officers kopiëren een geplande opstelling uit het rooster in een klein, streng gecontroleerd tekstformaat en plakken die in de addon. Die deelt de raidgroepen in met één gecontroleerde verplaatsing tegelijk, nodigt ontbrekende spelers uit in rustige rondes en houdt bij wie heeft afgeslagen. De overdracht is kopiëren en plakken: de addon maakt geen netwerkverbindingen en slaat niets op schijf op.

Overdracht van website naar game

Roster-opstelling
Kopiëren voor WoW-addon
Plakken in TCN Assistant
Preview
Indelen & uitnodigen

Huidige standWordt in de game getest. Alleen de organisator hoeft hem te installeren.

Geselecteerde schermen

Interfaces en identiteit.

02 / Systeem

Gescheiden diensten. Duidelijke afspraken.

Accounts en Roster gebruiken Authentik voor identiteit; Chat houdt zijn eigen lokale login. Elke applicatie beheert zijn eigen rechten en gegevens. Dit is een overzicht van functies: de lagen betekenen niet dat elke dienst dezelfde login of database deelt.

Rand
Publieke DNS & randCloudflare
TLS & routeringNGINX Proxy Manager
Identiteit
Applicatie-identiteit · OIDCAuthentik
Koppeling met Accounts & RosterChat heeft een eigen lokale login
Applicaties
Koppeling met providersAccounts
SeizoensplanningWoW Roster
Automatisering & relayManagement Bot
Gebaseerd op Fluxer · lokale loginCantina Chat
In de game
WoW RosterKopiëren voor WoW-addonKopiëren en plakken, geen netwerkverbinding
World of Warcraft-addonTCN Assistant
Data & releases
Grenzen per dienstPostgreSQL
Bewijs van buildsGitHub Actions
Gecontroleerd uitrollenTCN Delivery
Runtime
Geïsoleerde VM’sProxmox
Beheer van gameserversAMP
Externe afhankelijkheidSentinel

Beveiligingsgevoelige topologie, adressen, poorten, identifiers en exacte aantallen deployments zijn bewust niet weergegeven.

03 / Geselecteerde onderdelen

Applicaties en beheer.

Dit zijn geselecteerde voorbeelden van mijn development- en integratiewerk. Fluxer, Authentik, AMP en de andere onderliggende platformen blijven het werk van hun eigen makers.

Gebouwd / aangepast / ontworpen08 geselecteerd

Ledenbewijs gekoppeld aan identiteit

TCN Accounts

TypeScript · Fastify · React · PostgreSQL · OAuth
Beheertabel met demokoppelingen en filters op type en status.
Beheerders zoeken koppelingen zonder inloggegevens te zien.
Beheertabel met demokoppelingen en filters op type en status.

Beheerders zoeken koppelingen zonder inloggegevens te zien.

Live; sommige inlogpaden voor providers worden nog getest

Seizoensplanning, raids, aanwezigheid en een eigen raidbot

WoW Season Roster

React · Fastify · PostgreSQL · Accounts-API · Battle.net
Seizoensrooster met tien demospelers, rolverdeling en beschikbaarheid.
Het seizoensrooster toont wie zich heeft aangemeld, met rol en beschikbaarheid.
Seizoensrooster met tien demospelers, rolverdeling en beschikbaarheid.

Het seizoensrooster toont wie zich heeft aangemeld, met rol en beschikbaarheid.

Raidplanning met tabbladen voor geplande, actieve, lopende en afgelopen raids.
Terugkerende raids worden twaalf weken vooruit klaargezet.
Raidplanning met tabbladen voor geplande, actieve, lopende en afgelopen raids.

Terugkerende raids worden twaalf weken vooruit klaargezet.

Live; sommige inlogpaden voor accounts worden nog getest

Hulp in de game voor raidorganisatoren (WoW-addon)

TCN Assistant

Officers kopiëren een geplande opstelling van de roosterwebsite en plakken die in de addon. Die deelt de raidgroepen in, nodigt ontbrekende spelers uit in rustige rondes en houdt bij wie heeft afgeslagen.

Lua · World of Warcraft Retail-API · headless testsuite
Venster van de TCN Assistant-addon met een geplakte opstelling en een controlepaneel.
Plak de opstelling, bekijk de preview en zet de raid daarna in de game klaar. Preview van de interface.
Venster van de TCN Assistant-addon met een geplakte opstelling en een controlepaneel.

Plak de opstelling, bekijk de preview en zet de raid daarna in de game klaar. Preview van de interface.

Wordt in de game getest; alleen de organisator hoeft hem te installeren

Communitydashboard, automatisering en doorsturen tussen platformen

Management Bot

Node.js · TypeScript · Discord.js · PostgreSQL · LiveKitLive; spraakfuncties worden nog getest

Gehoste aanpassingen en een bewerkte desktopversie van het origineel

Aanpassingen voor Cantina Chat

Fluxer · React · Electron · onderhoud van patchesGehoste thema’s live; desktopapp nog niet uitgebrachtBroncode op GitHub

Bouw- en releasepad gestuurd door bewijs

TCN Delivery

Elke image wordt gescand op bekende kwetsbaarheden voordat hij uitgebracht kan worden; een ernstige of kritieke bevinding blokkeert de release.

GitHub Actions · containers · manifests · SBOM · TrivyGebruikt om Accounts en Roster uit te brengen

Geversioneerd identiteitsbeleid en registratie van diensten

Authentik-configuratie

Blueprints · validatie · poorten per omgevingIn gebruik voor Accounts en Roster

Gametemplates die mensen onderhouden, omgezet voor AMP

Pipeline voor AMP-templates

Validatie · gegenereerde deploymentbranch · AMP ADSLive en in gebruikBroncode op GitHub
Geïntegreerde platformen / afhankelijkheden05 geselecteerd

Identiteit & toegang

Authentik en NGINX Proxy Manager zorgen voor identiteitskoppeling, HTTPS en routering.

Platformen van derden die ik configureer en beheer

Hosting van diensten & games

Proxmox scheidt de applicatiediensten; AMP draait op een aparte host voor gameservers.

Verantwoordelijkheid voor infrastructuur en koppeling met gametemplates

Publicatie voor de community

WordPress, de jubileumapplicatie en Strapi ondersteunen de openbare en beheerkant.

Aparte applicaties en gescheiden gegevens

Documentatie

Wiki.js host de documentatie, waaronder een handboek voor developers dat wordt nagekeken.

Gehost; nakijken van het handboek en single sign-on zijn bezig

Externe afhankelijkheid

Sentinel blijft een extern geleverde afhankelijkheid in productie.

Buiten de ontwikkeling en het onderhoud van TCN

04 / Techniek

Releases en overdracht.

Accounts en Roster worden uitgebracht via een gecontroleerde releaseketen, en elke wijziging wordt getest op een aparte stagingomgeving voordat leden hem zien. Handboeken voor developers leggen eigenaarschap, afspraken en het testen van elk onderdeel uit, zodat een andere developer het kan overnemen.

Releaseproces

Niets bereikt leden zonder test.

Een aparte stagingomgeving spiegelt de live opzet dienst voor dienst, op eigen hardware. Elke wijziging wordt één keer gebouwd tot een bevroren release candidate, uitgerold op staging en door een mens gecontroleerd. Precies dezelfde bestanden gaan daarna naar productie. Als er iets misgaat, staat de vorige versie klaar om terug te zetten.

  1. 01WijzigingPull request met CI-build, tests en imagescan
  2. 02Release candidateEén keer gebouwd; images, manifest en bestandshashes bevroren
  3. 03StagingAparte omgeving op eigen hardware, door een mens gecontroleerd
  4. 04Poort naar productieGroene CI voor die commit en een scan van minder dan 24 uur oud
  5. 05LedenDezelfde bestanden gaan live; de vorige versie blijft klaarstaan

Een mislukte build, scan of controle op staging gaat terug naar de developer. Alleen de goedgekeurde, gescande candidate gaat live.

Eén keer bouwen, dezelfde bytes uitrollen
Productie krijgt de geteste candidate ongewijzigd, dus wat getest is, is precies wat draait.
Snel naar staging
Eén commando bouwt de candidate, vervangt alleen de gekozen diensten en controleert of ze klaar zijn. Een wijziging is in ongeveer vijf minuten te testen op staging, terwijl de volledige CI-run doorloopt.
Terugdraaien zit in het ontwerp
De vorige versie blijft staan, en een herstelworkflow kan elke goedgekeurde release terugzetten.
Databasewijzigingen apart
Deployments voeren zelf nooit databasemigraties uit. Een migratie wordt eerst als aparte stap toegepast en gecontroleerd.
Geversioneerde releases
Elke app houdt een releaselogboek bij met semantische versies, zoals roster 1.15.0; candidates op staging zijn genummerde release candidates.
Echte ledengegevens blijven in productie
Development, CI en staging draaien op synthetische gegevens met een nep-inlogprovider. Daarom zijn de screenshots op deze pagina ook veilig om te delen.

Bewijs, nooit inloggegevens

Apps krijgen bewijs dat een personage van jou is, nooit je wachtwoorden of logintokens.

Accounts houdt de inloggegevens van providers binnen zijn eigen grens. Andere tools krijgen afgebakend, geversioneerd bewijs dat een concrete vraag beantwoordt, zonder toegang tot het oorspronkelijke account.

Elke applicatie beslist zelf

Elke app bepaalt zelf wie wat mag; geen enkel systeem kan ze allemaal overrulen.

Accounts en Roster gebruiken Authentik voor identiteit, maar beheren hun eigen productrechten en gegevens. Chat houdt zijn lokale login.

Eerst opslaan, dan doorsturen

Een bericht tussen Discord en de chat wordt eerst opgeslagen, zodat er niets verloren gaat als één kant plat ligt.

Tekstberichten tussen platformen gaan eerst een inbox/outbox-workflow in voordat ze worden bezorgd. Workers bewaren voortgang en controleerbare uitkomsten bij gedeeltelijke storingen, en onopgeloste bezorgingen blijven expliciet zichtbaar.

Gegevens hun eigen levenscyclus geven

Ontkoppelen, toestemming intrekken en gegevens verwijderen zijn aparte, bewuste acties.

Een provider ontkoppelen, toestemming intrekken en een account wissen zijn aparte handelingen. Doorsturen vereist afgebakende toestemming; intrekken haalt berichten die al in de wachtrij staan niet overal terug. Het gedocumenteerde spraakontwerp streamt audio zonder opnames te bewaren, terwijl operationele metadata een eigen levenscyclus heeft.

Onveranderlijk bewijs van releases

Elke release houdt een vast verslag van precies wat er is getest en uitgebracht.

Beoordeeld bouwbewijs en een overeenkomende goedkeuring op staging koppelen een release aan het exacte manifest en de exacte image-digests. Delivery plant de wijziging, brengt de bevroren images uit en controleert het resultaat onafhankelijk. Schema- en datawijzigingen krijgen een eigen beoordeling en generale repetitie.

Aanpassingen aan het origineel onderhouden

Wijzigingen aan de opensource-chatapp worden bijgehouden als patches, zodat updates eenvoudig blijven.

Chat blijft een product op basis van Fluxer. Gehoste en desktopwijzigingen hebben aparte patchbeschrijvingen over doel, upstreamversies, opnieuw toepassen, controleren en uitfaseren. Naamsvermelding en een herhaalbaar upgradepad horen bij het werk.

Mensen schrijven de bron, de rest wordt gegenereerd

Mensen bewerken de leesbare bron; de bestanden die draaien worden daar automatisch uit gemaakt.

Gametemplates blijven onderhoudbaar in een overzichtelijke structuur voor mensen, en worden omgezet naar de platte structuur die AMP kan indexeren. De gegenereerde deploymentstatus wordt nooit de bron om in te werken.

Het systeem overdraagbaar maken

Met handboeken en runbooks kan iemand anders het overnemen zonder de oorspronkelijke maker te hoeven vragen.

Handboeken voor developers per dienst leggen gebruikersroutes, afspraken, gegevensgrenzen en het testen van elk onderdeel uit. Overdrachtsoefeningen vanaf een schone kopie van de broncode bevestigden dat de builds en tests reproduceerbaar zijn.

Kwetsbaarheden komen er niet in

Software met een bekend ernstig beveiligingsprobleem kan leden niet bereiken.

Elke containerimage wordt gescand voordat hij uitgebracht kan worden, en elke ernstige of kritieke bevinding laat de build falen. Dezelfde scan draait op de computer van de developer voordat code wordt gepusht, en elke week opnieuw op de live code, zodat nieuw gepubliceerde problemen als ticket opduiken in plaats van als verrassing.

Automatische beveiligingscontroles

Een gemarkeerd pakket of basisimage oplossen is routinewerk, gedaan in een eigen kleine wijziging en via staging uitgebracht zoals elke andere release.

ControleWanneerWat het doet
Imagescan (Trivy)Bij elke pull request, per productie-imageFaalt bij elke ernstige of kritieke bevinding en bewaart het rapport als bewijs
SBOM (Syft, SPDX)Bij elke pull request, per imageSomt elk pakket in elke image op
Lokale scan voor het pushenVoor elke push, op de computer van de developerDraait dezelfde vastgezette scanner, zodat CI niet faalt op iets wat al bekend is
Wekelijkse scanElke maandag op de hoofdbranchBouwt en scant opnieuw; opent of werkt een issue bij als er nieuwe kwetsbaarheden zijn
Poort naar productieVoor het uitrollen, en nog eens vlak voor het toepassenVereist een scan van minder dan 24 uur oud zonder ernstige of kritieke bevindingen
Scannen op geheimenBij elke wijzigingVoorkomt dat inloggegevens in de repositories belanden
Vastgezette afhankelijkhedenAltijdCI-acties staan vast op exacte commits, basisimages op exacte digests, en het lockfile moet door de supply-chaincontroles

05 / Huidige stand

Opgeleverd en in uitvoering.

Stand van zaken .

Gecontroleerde productiereleases van het rooster sinds 1.0.0
25
Geautomatiseerde browsertestscenario’s, op desktop- en mobiele layouts
228
Unittestbestanden in Accounts en Roster
86
Van commit tot testbaar op staging
~5 min
Live
  • Accounts en Roster, inclusief de raidbot van Roster
  • Automatisering met de Management Bot, en gehoste Chat op basis van Fluxer met communitythema’s
  • Gecontroleerde releases via TCN Delivery, en de pipeline voor AMP-templates
  • Twee communityvragenlijsten in Roster, en een handboek voor developers dat wordt nagekeken
In ontwikkeling
  • TCN Assistant-addon voor WoW: wordt in de game getest
  • Desktopapp voor Chat: werkt lokaal, nog niet uitgebracht
  • Losse Polls: wordt klaargemaakt om te testen
  • Gedeelde login voor de webapps: in ontwikkeling, nog niet ingeschakeld
Nog af te ronden
  • De resterende paden voor inloggen, providerkoppelingen en rechten
  • Spraakfuncties en langer lopende integratietests
  • Consistent bewaren en verwijderen van gegevens in alle diensten
  • Hersteltests voor nieuwe releases, en de laatste correctieronde van het handboek