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.
Officers slepen spelers naar groepen en zien de rolverdeling in één oogopslag.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.
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.
TCN AccountsLeden koppelen Battle.net één keer en bepalen zelf welke apps het mogen gebruiken. Getoond met demogegevens.
WoW Season RosterDe huisstijl van de tool voor planning en het bewijs van lidmaatschap.
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.
RandPublieke DNS & randCloudflareTLS & routeringNGINX Proxy Manager
IdentiteitApplicatie-identiteit · OIDCAuthentik
Koppeling met Accounts & RosterChat heeft een eigen lokale login
ApplicatiesKoppeling met providersAccountsSeizoensplanningWoW RosterAutomatisering & relayManagement BotGebaseerd 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 & releasesGrenzen per dienstPostgreSQLBewijs van buildsGitHub ActionsGecontroleerd uitrollenTCN Delivery
RuntimeGeïsoleerde VM’sProxmoxBeheer van gameserversAMPExterne 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
Beheerders zoeken koppelingen zonder inloggegevens te zien.
Live; sommige inlogpaden voor providers worden nog getest
Seizoensplanning, raids, aanwezigheid en een eigen raidbot
Het seizoensrooster toont wie zich heeft aangemeld, met rol en beschikbaarheid.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
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
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.
01WijzigingPull request met CI-build, tests en imagescan
02Release candidateEén keer gebouwd; images, manifest en bestandshashes bevroren
03StagingAparte omgeving op eigen hardware, door een mens gecontroleerd
04Poort naar productieGroene CI voor die commit en een scan van minder dan 24 uur oud
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.
Controle
Wanneer
Wat het doet
Imagescan (Trivy)
Bij elke pull request, per productie-image
Faalt bij elke ernstige of kritieke bevinding en bewaart het rapport als bewijs
SBOM (Syft, SPDX)
Bij elke pull request, per image
Somt elk pakket in elke image op
Lokale scan voor het pushen
Voor elke push, op de computer van de developer
Draait dezelfde vastgezette scanner, zodat CI niet faalt op iets wat al bekend is
Wekelijkse scan
Elke maandag op de hoofdbranch
Bouwt en scant opnieuw; opent of werkt een issue bij als er nieuwe kwetsbaarheden zijn
Poort naar productie
Voor het uitrollen, en nog eens vlak voor het toepassen
Vereist een scan van minder dan 24 uur oud zonder ernstige of kritieke bevindingen
Scannen op geheimen
Bij elke wijziging
Voorkomt dat inloggegevens in de repositories belanden
Vastgezette afhankelijkheden
Altijd
CI-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
Interactive raid planner · fictional saved characters · changes stay in this demo
Drag to move or swap. Adjust works with keyboard and touch.
Try it: mark Tide absent to bring Moss off the bench, add a saved character, or drag a player to swap places.
Group 15/5
Stone✓ Available
Stone–Demo Realm · Warrior◆ Protection · Tank
Willow✓ Available
Willow–Demo Realm · Druid✚ Restoration · Healer
Ember✓ Available
Ember–Demo Realm · Mage⚔ Fire · Damage
Quill✓ Available
Quill–Demo Realm · Hunter⚔ Marksmanship · Damage
Dusk✓ Available
Dusk–Demo Realm · Priest⚔ Shadow · Damage
Group 25/5
Iron✓ Available
Iron–Demo Realm · Paladin◆ Protection · Tank
Brook✓ Available
Brook–Demo Realm · Shaman✚ Restoration · Healer
Spark✓ Available
Spark–Demo Realm · Shaman⚔ Elemental · Damage
Fern✓ Available
Fern–Demo Realm · Druid⚔ Balance · Damage
Rune✓ Available
Rune–Demo Realm · Mage⚔ Frost · Damage
Group 35/5
Flint✓ Available
Flint–Demo Realm · Warrior⚔ Fury · Damage
Solace✓ Available
Solace–Demo Realm · Priest✚ Holy · Healer
Argent✓ Available
Argent–Demo Realm · Paladin⚔ Retribution · Damage
Vale✓ Available
Vale–Demo Realm · Warlock⚔ Affliction · Damage
Echo✓ Available
Echo–Demo Realm · Rogue⚔ Subtlety · Damage
Group 45/5
Glint✓ Available
Glint–Demo Realm · Mage⚔ Arcane · Damage
Tide✓ Available
Tide–Demo Realm · Evoker✚ Preservation · Healer
Coral✓ Available
Coral–Demo Realm · Shaman⚔ Enhancement · Damage
Thistle◷ Tentative
Thistle–Demo Realm · Monk⚔ Windwalker · Damage
Lyric◷ Awaiting confirmation
Lyric–Demo Realm · Evoker✦ Augmentation · Support
Benched 2
Moss✓ Available
Moss–Demo Realm · Monk✚ Mistweaver · Healer
Bastion✓ Available
Bastion–Demo Realm · Death Knight◆ Blood · Tank
Absent 1
Rowan× Absent
Rowan–Demo Realm · Hunter⚔ Beast Mastery · Damage
Available, Tentative and Late retain a place. Absent releases it. Auto-sort reserves two tank places and balances healers against damage/support; manual moves switch it off. Sample changes reset on reload.