Ethereal Solace HEXA
Fourth site on the same setup, and the first one nobody was paying for.
- Role
- Designer, Full-Stack Developer
- Year
- 2026
- etherealsolacehexa.com
- Live
The clan was doing fine on a Facebook page and a group chat, so I built the site anyway.
- Problem
- Nothing was broken, so there was no brief to write and nobody asking for a website.
- Built
- A live clan site with a roster, a match center, tournaments with brackets, a journal, and a private admin, built solo on the same Cloudflare setup as three client sites.
- Result
- Designed and built from April 2026, live at etherealsolacehexa.com since July, and still getting adjusted. The editing rules I worked out here went back into the paid builds.
Ethereal Solace HEXA is a Philippine Call of Duty Mobile clan with 176 members on the roster. I co-run it and I play in it, so on this one I was the client, the user, and the developer, and that was the whole client relationship.
This is the finding solutions to a problem that doesn't exist type of trap, and I knew that going in. I find this kind of build fun, so I made it anyway. What I wanted was a roster that stays put, a match record that survives the scroll, and a bracket I could point people at without linking out to a platform that might delete it.
Three things made this different from the client builds.
Nobody was paying and nobody set a date
Client work arrives with a budget and a launch date, and those two decide the scope before I do. Here I set the scope, so the only person it could run away from was me. What kept it bounded was the same written spec I use on paid builds.
I am the user, so the research cost nothing
I play in this clan and help run it, so I already knew what a roster page has to say and what a match record has to keep. On a client build that knowledge takes interviews. The risk flips, though, since being the user makes it easy to stop questioning my own habits.
Rules from the paid work carried straight over
Never invent a player, a match, a date, or a result. IGN is the only public identity, and no ages, schools, or locations go on the site anywhere. I wrote both rules down before building anything, and they matter here because a clan roster skews young.
- 176 Clan members on the private roster
- 4 Public routes people actually came for
- 375px Width the admin gets edited at
- 0 Invented players, matches, or results
Four kinds of reference, and each one settled a different question.
Reading started in April alongside the build, not ahead of it. Clan pages, global orgs, Philippine orgs, and bracket platforms each answered something different, and two of them answered by showing what to leave out.
CODM clan pages barely exist as pages
Most clans in this scene live on a Facebook page and a group chat, which is exactly where HEXA started. Beating that takes almost nothing, so the question worth answering was what to build once it was beaten.
Team Liquid and its peers show what a roster page owes a reader
Large org sites answer who plays, for which team, in which game, and what that team has won, in that order. I took the ordering and dropped everything that needs a marketing department behind it, like the sponsor walls and the merch.
Philippine orgs set the register HEXA competes in
Blacklist, Omega, and TNC operate at a scale HEXA does not, and their sites still read as the same country and the same scene. That tier decided the tone, so the copy stays plain and the site never claims a record it has not earned.
Bracket platforms decided how a tournament page behaves
Battlefy, Toornament, and Challonge already settled how a bracket, a group stage, and a battle royale leaderboard read. I rebuilt that behavior on the site itself, since a clan site that links out to a bracket hosted somewhere else loses it the day that link dies.
The build came down to four things.
- 01
Tournaments, brackets, and battle royale scoring
A stage is a bracket, a group, or a battle royale leaderboard, and every standing derives from recorded results rather than a hand-typed table. Battle royale scoring runs on placement points plus points per kill, and ties break by points, then first places, then kills. Other clans enter as guest teams, so they can be opponents without appearing on the public teams page.
The bracket editor takes a drag, a tap, or the keyboard, since a tournament often gets run from a phone. - 02
Per-game results with the scoreboard attached
A Call of Duty Mobile match is a series, so a result of 3 to 1 hides which modes were played and how each one went. Every game gets its own row with its mode and its map, Hardpoint through Search and Destroy to battle royale, and each row holds fixed screenshot slots. The match page then shows the scoreboard the players actually saw.
A match page lists each game with its mode, map, and score, and attaches the result screenshot to the game it belongs to. - 03
An admin the clan can run from a phone
Every editor runs one save model, so the screen tells the truth about unsaved work at all times. Photos upload from the record they belong to rather than a separate library trip. Deleting an image is blocked while anything still references it, and removing a member closes their history with a departure date instead of erasing the row.
The admin holds at 375px, which is the width most of this gets edited on. - 04
Pages that are already readable when they arrive
Brackets, filters, standings, and match pages all come down finished, so nothing on a public page waits for a script before it can be read. This is a mobile game, so the site gets opened on phones on mobile data more than on anything else, and it behaves the same there as it does on my desktop. The admin is the only part behind a login, and it stays shut when anything about that login goes wrong.
The same bracket with scripts switched off in the browser, still complete and still readable.
Four public routes and the private side that fills them.
A tournament page holds the bracket, the standings, and the entrant list, and every number on it comes from a result somebody recorded.
Roster, match center, tournaments, and a journal, and every one of them arrives finished rather than waiting on a script to fill it in.
Five collections behind one login, with a single save model, photos uploaded from the record they belong to, and a bracket editor I wrote from scratch.
Live and in use, with nothing worth printing on traffic yet.
The site is live at etherealsolacehexa.com and the clan uses it. There are no traffic figures worth printing, no conversion numbers, and one public team whose competitive record is still short, so this page carries scope and craft rather than results. Daitoku Ramen shipped in the same position, and I would rather say so than invent something.
What the build gave back is easier to check. Nobody was waiting on me, so I could redo the editing rules until they were right, and they came out as two documents, one on how an admin should behave and one on how article sections should work. Both are in use on the paid builds now.
- Live In production at etherealsolacehexa.com
- 4th Site built on this same setup
- 2 Write-ups on how an admin should behave, now used on paid builds
What's on the bench right now.
The site is live and the clan keeps playing, so the work never fully closes. Two items are open on the bench and one is solved and written up. Open a card to read where each stands.
I have not read the tournament editor at the width I edit at
- Creating a tournament runs as one guided page covering event details, entries, and stages, which is a lot of form on one screen.
- I have checked it locally and never sat in front of the live one, logged in, at my working width.
The editor works. Whether it reads well when there are six stages on the page, or whether it needs to break into steps, stays open until I use it for a real tournament.
The live site still needs a walk from 375 to 1440
- Brackets are the widest thing on the site, so they are the most likely to push a phone page sideways.
- I checked five widths locally and the live check ran at one width only, on a browser that could not resize.
A results grid labelled its fourth column Game 2.5
- The grid numbered its columns off a running value instead of counting games, so the fourth one read Game 2.5.
- Somebody entering a result has to trust the column header, since that is the only thing telling them which game they are typing into.