Changelog

Every update to the website and the server mod, newest first

This is the full history of the CloudRidge website and the server mod, newest first, so you can look back and see when a feature arrived or when a bug was fixed.

By version Clear

Filtered: showing 109 of 127

v1.9.90 Website 2026-11-01

v1.9.90 · New hero layout, and the 3D scene drags again

  • The hero is rearranged: the title gets its own row, the 3D projection sits on the left, and the "join the server" and "online now" cards line up on the right. On phones it stacks into one column.
  • Dragging the 3D scene works again — two transparent placeholder layers used to sit on top of the canvas and swallowed every pointer event. Now only buttons and links take clicks; everywhere else you can drag.
  • The home model is now your black hole projection baked straight from the file (no longer hand-built), with panes, walls and slabs rendered at their real thickness so the openwork structure finally shows.
v1.9.89 Website 2026-11-01

v1.9.89 · The black hole got rebuilt

  • The hero black hole was rebuilt from scratch: a two-layer disc, a much deeper funnel, a real hole at the centre, a glowing event-horizon ring and four spiral arms — from above it now reads as a vortex, not a cake.
  • The camera pitch went from 0.62 to 0.78 so you look straight into the funnel, and the model moved up so it no longer sits on the title or the buttons.
  • Fixed an overlap in the hero: the cloud band used to cut through the server address box, and it now has its own space.
v1.9.88 Website 2026-11-01

Hero recentred, and the black hole is now hand-built

  • The hero is now title on top, model in the centre, buttons below; the live-players card moved to its own strip under the hero.
  • The black-hole schematic has 13.8M blocks on a 565×565 base — squeezed into the hero it is only colour noise. So it was rebuilt by hand: concentric rings, a dark pupil and a machine rim, 5.7k blocks and 33 KB.
  • Phones still get a still poster (the new black-hole image, 54 KB) and only load the renderer after tapping Enter 3D.
v1.9.87 Website 2026-11-01

Finish your account, and changes now need proof

  • Accounts created with QQ must, on their first sign-in, set a password and verify an email address or phone number before they can use the rest of the site.
  • Changing your email or phone number now requires the code sent to the current address or number first.
  • Switching the linked QQ account now requires your current password.
  • When your account signs in from a device it has never used, an alert email goes to your verified address.
v1.9.86 Website 2026-10-31

换页不再白屏一下、注册页的「手机号注册」能点了

  • 点站内链接时,旧页面不再先淡成一片白底 —— 之前新页面要等网络往返才到,中间那一下就是白屏。现在旧页面保持原样,换页后新页面照旧淡入、内容依次上滑。
  • 注册页的「手机号注册」原来点了像是没反应:它只是把单选按钮选中,页面上的提示文案与「发验证码」的去向都没变。现在切一下就整页重渲染,提示、去向、表单都跟着变。
  • 如果站点没有配置短信服务,注册页不会再把你留在「手机号注册」这个空壳上,而是自动退回邮箱注册。
v1.9.85 Website 2026-10-31

One sign-in button in the header, and a 3D hero sized right

  • The QQ entry is gone from the header — signed-out visitors used to see two buttons side by side, now only “Sign in”. QQ shows up on the sign-in and sign-up pages only.
  • The 3D camera now frames by the model height instead of a fixed distance, so the scene no longer swamps a taller window or shrinks to a lump in a shorter one.
  • Block colours are pulled into the cherry palette: crimson planks, nether wart and coral now map onto cherry wood, petals and leaves, so it stops looking like coloured noise. Not a single block moved.
v1.9.84 Website 2026-10-31

The hero is now a 3D scene you can drag around

  • The whole hero is now a 3D garden scene: drag to rotate, scroll to zoom, click a block to break it — it grows back after ten seconds.
  • Phones and browsers without WebGL2 never force-load the 3D: they get a static poster shot from the same angle, with an Enter 3D button in the corner.
  • Page changes flow too: the current page fades out, the next one fades in with its sections sliding up one after another. With reduced motion on, links behave exactly as before.
  • The loud blue QQ tile is gone — it now uses Tencent official smallest 16×16 icon, sitting at the same weight as every other icon.
v1.9.83 Website 2026-10-31

One QQ button, everywhere

  • The login page, the register page, the header and the account page now share a single QQ button: the official Tencent icon inside our own outlined pill. Tencent allows the “small icon + text” form, and the icon itself is still the official one.
  • Account and security now has a QQ binding row: bind, rebind or unbind. Accounts without a login password cannot unbind — a QQ-only account has no password, so unbinding would lock it out for good.
  • Typography and texture: tighter, heavier headings, roomier sections, and a soft glow that follows the pointer across cards.
  • Motion: the hero rises line by line, counters roll, a reading progress bar sits at the top, and home cards drift slightly. Turn on “reduce motion” in your system and all of it switches off; devices without hover never get the glow.
v1.9.82 Website 2026-10-31

QQ sign-in now uses Tencent’s official button — on the login page, the register page and the top nav

  • The login and register pages used to show a hand-drawn penguin icon with the wording “QQ one-click sign-in”. Tencent’s front-end page spec requires the official “QQ登录” mark and forbids modifying it, so both places now use Tencent’s original 230×48 long-icon image at its native size — no stretching, no scaling.
  • The top navigation gets one too: the official 76×24 “QQ登录” button on wide screens, switching to the official 24×24 icon below 375px so the header never needs a horizontal scrollbar.
  • Two details fixed while we were here. The official button never greys out: if the Terms box is unchecked, clicking it scrolls to the checkbox and highlights it in red instead of disabling the button (a greyed-out button looks exactly like a misplaced one). And the login page’s line “this site signs in with email + password” had gone stale — all ten languages now say only the half about registering.
v1.9.81 Website 2026-10-18

On a phone the Server Guide text was hidden under its own contents list — fixed

  • On a desktop the guide sidebar is a narrow column pinned to the top-left. Once the layout collapses to a single column it becomes full-width and more than a screen tall, yet it stayed pinned to the top of the viewport — the article scrolled underneath it, so text looked overlapped, white boxes floated over the words, and the content seemed to be missing. On narrow screens (900px and below) it now scrolls with the page; desktop still pins it. The bug predates this round; it simply had not been noticed on a phone before.
v1.9.80 Website 2026-10-18

Tools fixed up: the tab strip actually works, gradients are freer, and the calculator hands you a checklist you can fill in and start from

  • All ten tools used to sit on one page, and tapping a capsule at the top only jumped to an anchor, so it looked like nothing happened. It is a real tab strip now and only one tool shows at a time; a #t-xxx address still opens that tool directly, and on a phone the strip scrolls sideways. Gradient text went from two hard-coded colors to 2~6 stops: click the bar to add one, drag to move it, select a stop and hit “Remove this color”, and colors interpolate character by character down the string, so § codes / MiniMessage / tellraw / MOTD all change together, and an overlong MOTD gets a warning
  • The server config calculator grew from three budget tiers to nine inputs. Mod count, view distance, simulation distance, whether you run redstone, target TPS and version are all fillable. The output is no longer a few numbers: memory tells you why it grows, and you also get a copy-ready start command with Aikar’s flags, line-by-line advice for server.properties and spigot.yml, and a mod and plugin list split by play style. The three values that change most often — memory per player, the mod factor and the redstone factor — moved into the Tools section of the admin, and a refresh applies them
  • The lag check-up now attributes cost item by item, and compares against this site live data. You now enter four more things: persisting entities, chunk loaders, redstone wire and automatic farms. The output splits MSPT into seven items with each one share and milliseconds, and it only names the culprit — this is what drags — when it really takes the biggest share (over 45%); otherwise it says plainly that the largest item is still modest overall. Every item comes with a fix you can act on, and it also pulls this site live data to tell you how much your scale should cost in theory and how much headroom the site has right now; when the data is unreachable it stays a local estimate and shows no error
v1.9.79 Website 2026-10-18

Liquid glass rebuilt the Apple way: it refracts, it has highlights, and it holds up on white

  • ① Last round the glass was basically a flat wash of white, so it vanished the moment it sat on a white card. This time the material is rebuilt along the iOS 26 lines: a bright line along the top, a dark one along the bottom, a 1px hairline ring outside, a soft glow inside, plus a very light drop shadow; on desktop it still refracts for real (the backdrop is bent slightly, the whole plate lifts 1px on hover and settles back on press). The primary and danger buttons used to be excluded from the glass entirely, and they are in now: the brand gradient stays on the button itself, white text keeps its contrast, and the glass layer only contributes highlight and stroke, no refraction on top. The same material is laid onto inputs, selects, tags, the game, tool and player badges, and the top navigation.
  • ② Phones no longer run refraction (it is the most expensive step) and degrade to blur plus a highlight stroke on their own: it still reads as glass, but costs almost no GPU. Along the way one real bug is fixed: the mobile branch used to return early and never reached the degraded path, which meant there was no glass on phones at all. Desktop got two things as well: plates of the same size share a single displacement map (the 7 plates on the home page use only 4), and ones scrolled off screen are no longer computed; on top of that, a plate over 300,000 pixels or a page with more than 80 of them stops generating new ones — dropping one plate beats a stuttering scroll.
  • ③ The same switch is still under Appearance in the admin, now on by default; browsers without backdrop-filter (Safari, Firefox) fall back to a frosted fill rather than looking broken. No palette and no layout was touched this round, the theme is still Cloudridge Blue; last round’s Apple white background has been rolled back site-wide (admin, forum, gallery and map all returned to their old look), leaving only two genuine bug fixes: the confirmation dialog for dangerous admin actions had no styling at all (all 43 confirm-delete prompts opened as a bare box with no overlay), and gallery titles on narrow screens only appeared on mouse hover.
v1.9.78 Website 2026-10-17

The whole site goes Apple style: white background, hairline rules, pill buttons, plus a batch of wrong numbers fixed

  • The whole site look was rebuilt the Apple way: white background, near-black text, a single 1px hairline instead of shadows, buttons and filter chips unified into 44-high pills, and the top bar turning from translucent to solid once you scroll past it. The frosted glass is gone entirely — the blur layers on data cards, the timeline and status cards are all removed, leaving only one very faint translucent layer on the top bar. Chinese headings no longer get negative letter-spacing: Chinese glyphs already fill their em box, so tightening them squeezes the text into a clump that looks like bold; only digits actually need tightening. The admin area was re-laid-out along the way, and one real bug is fixed: confirmation dialogs for dangerous operations had no styling at all in the admin, popping up as a bare box with no overlay and no positioning, affecting all 51 confirm-delete spots across the site; it is now a centred card with a proper overlay and a red title. The whole set hangs off the Apple colour scheme (picked under Admin → Appearance), and switching back to Cloudridge Blue rolls everything back without touching code.
  • The mobile pass this time was aimed squarely at the things that did not feel good to use: the four big numbers on the data page each took a full row, now they fit 2×2 on one screen; the player search box and the Search button used to be stacked (the button covered nearly 70 pixels of the placeholder text), now they sit side by side on one row; on the leaderboard each row had its top and bottom grey lines stacking into one thick bar, now it is a single 1px hairline; the double border of card-inside-a-card on the timeline, the various dashed boxes, and the thick dark grey scrollbar on Windows are all cleaned up together; in the server status sidebar on the guide page the label and the value used to be glued together (showing as Version1.21.1), now they are left-right aligned with a divider between.
  • Ten data problems from the audit are fixed. The two that matter most: the homepage cumulative online time displayed seconds as hours (it said 35.7M h, the real value is 9907 hours, off by 3600 times); and four people on the ban list showed as lifted while actually still in force — when the heartbeat reported already-exists, only the status was quietly flipped back to active, with no history written and no player ban flag restored. The rest: the installed-mods figure on the status page showed 0 / 12 / 160 in three different places (the real value is 160), and the operating system showed a dash, both for the same reason — the underlying query returns a whitelist that does not include those two fields; a string of UUIDs was dominating the leaderboard as names, and now shows as Unknown player · 87274f; the ceiling on availability was hard-coded at 99.2 percent (computed from a fixed 30-second interval, while heartbeats actually arrive every 31 seconds); and K/D produced astronomical numbers when there were no deaths, and now shows a dash. Two more are leaderboard policy (two merging conventions, one by role and one by account, and a shadow account that only has kills) and were not forced — the differences and their cost are written in the code comments for the site owner to decide.
v1.9.77 Website 2026-10-11

Forging your real IP is now closed off from nginx all the way up to the application layer

  • ① Measure before changing: a live probe produced two facts — BT Panel’s nginx uses the PROXY protocol, so the real client address is already there in REMOTE_ADDR (measured as 222.212.76.94, not 127.0.0.1); and client-supplied X-Real-IP / X-Forwarded-For / CF-Connecting-IP are passed through to PHP verbatim, all three forged headers arriving untouched, with nginx overwriting none of them. ② Harden both ends: nginx injects a secret only its own proxy knows (even a client that forges that header gets it overwritten by nginx), and the application adds a second guard — if REMOTE_ADDR is a public address, use it directly and stop looking at proxy headers at all — so even if trust_proxy is ever switched on by mistake, the IP in rate limiting, lockouts and audit logs never becomes a value the visitor chose.
  • Three things done along the way: the misleading comment in site/config/config.php (“set to true when behind a CDN / reverse proxy”) is replaced with the measured conclusion and a warning — following it on this site would only promote a forgeable header to an authoritative value; this change got automated tests (trust_proxy on + public REMOTE_ADDR + forged headers ⇒ the real address is still returned), and the suite went from 81 to 83 checks, all green; the temporary live-troubleshooting probe was removed as agreed, and requesting it now returns 404.
v1.9.76 Website 2026-10-11

Smoother scrolling on phones, a few security holes closed, and chat no longer losing the middle stretch

  • Four mobile-smoothness items: the frosted glass on the header while scrolling, the frosted glass on every card at narrow widths, the compositing layer the entrance animation kept alive for every element, and the reading-progress bar that forced a reflow on every pixel scrolled — all replaced with equivalent but cheaper approaches (the scrolled header is opaque anyway, so that blur was pure waste; and when an animation really starts, the browser promotes the layer itself). Measured on a 390-wide phone viewport with 20× CPU throttling: worst frame went from 364 ms to 57 ms. The difference in overall frame counts sits inside this machine’s noise, so no stable conclusion can be drawn there — which is why each item above was only touched when it made sense mechanically.
  • Three security items (high/medium severity, fixed straight away): ① the local-debug _admlogin.php must now 404 on the live site (it could turn a visitor straight into an administrator), and ?to= can no longer point off-site; ② the speed-test page’s ping / dns sent a hostname to probe a port, which a DNS rebinding attack could steer into the internal network — it now connects only to the already-validated IP; ③ forged X-Real-IP / CF-Connecting-IP headers used to get around per-IP rate limiting, and such headers are now trusted only when the request truly comes from loopback. Closing ③ completely needs X-CDR-Proxy-Secret injected in nginx plus security.proxy_secret set in site/config/config.php — that one touches the server configuration, so it waits for your go-ahead.
  • Three real bugs in the chat log: ① once a day passed 200 messages, that whole middle stretch was permanently invisible on the page (the busiest day has 2796 messages, and the old path could only page back to 500, leaving 2296 of them unreachable); ② messages were ordered by primary key id alone, so on days that straddle a boundary the after-midnight messages got pushed out of the window (measured: 53 newer messages permanently skipped); ③ when sending failed, the interface pretended the message had gone out. It now fetches by time, adds a “load earlier” button to page backwards, and a failed send says so plainly and lets you retry.
  • While at it: pages for visitors are no longer blanket no-cache (back and forward feel a little quicker), while the logged-in state is still never cached at all. All 218 PHP files on the site lint clean, and all 59 self-test scripts were run — the 15 suites related to this change came out exactly the same as before (not one extra locally-failing item).
v1.9.75 Website 2026-10-10

Server-side mod slimmed down: the costs that scale with player count moved off the main thread

  • The biggest block in the mod report is the map: three maps of 256×256 each, roughly 197,000 points. Those points used to be assembled into JSON right inside the server tick, and the server only carried on once the assembly was done — one round every half hour, which lines up exactly with those occasional “it froze for a moment” spikes. Now that tick only hands the data over and the assembly happens on a background thread: the data was already there, and building JSON never needed to hold the main thread.
  • While at it, several other costs that scale with the number of players online were reined in: the numbers in the TAB list (playtime, player count and so on) used to be recomputed for every row of every player, even though they only change once every 30 seconds; looking a player up by name fell back to scanning the whole table row by row (10 players meant 100 lookups); the advancement list walked through a thousand-plus recipe entries every 10 minutes; and once every 30 seconds, just to count entities, every world was traversed in full while the config files and the ban list were read on the main thread. These are now cached, indexed, computed once and read in the background respectively — not a single byte of what gets reported to the site has changed, and the pages look exactly as before.
v1.9.74 Website 2026-10-05

Admin and profile privacy improved

  • The sidebar pending-review badge only counted the forum and gallery queues while the admin panel counted five; everything now comes from one function and each menu item carries its own count. Destructive actions (delete a user group, delete a nav entry, prune the chat log, clear the cache) ran without asking; they now ask first. The skin, avatar-background and chat-log lists were capped at 200 and 60 rows and can now be paged through.
  • The allow-others-to-view-my-profile switch only affected the team page before — your profile stayed visible to everyone. It now really applies, except to yourself. Changing your password and signing out other devices are also written to the audit log now.
v1.9.73 Website 2026-10-05

Red confirm and delete buttons are visible again

  • The confirm button in the retract-message dialog came up blank: with liquid glass on, the glass rule clears a button background but keeps its white text, so a red button turned into white on white. Solid red buttons now stay out of the glass, exactly like the blue primary button.
  • The same problem hit every red button on the site (retract, delete, unbind and more), so all of them are fixed together.
v1.9.72 Website 2026-10-05

Paging no longer jumps back to the top

  • Clicking next page from further down used to fling you back to the very top. The pager now lines up the list above it instead, and does nothing at all when that list is already in view. Back and forward return to the previous scroll position.
  • A few small things along the way: the seed map is now in the Servers menu, in-page anchors are no longer hidden under the sticky header, gallery cards show their author, and the online players on the home page link to their profiles.
v1.9.71 Website 2026-10-05

Tighter backend permissions, smaller fixes

  • Settings, key rotation, backups and system tools are now owner-only — server managers keep content, reports and the whitelist.
  • Several small issues with paging without a reload were fixed: dark mode stays on, forms are no longer submitted twice, the countdown runs at normal speed and the sort dropdown no longer reloads the page.
v1.9.70 Website 2026-10-05

Paging without a full reload

  • Paging, filtering, search and sorting now swap only the content — the address bar still updates and the back button still works.
  • Saving, reviewing and deleting still navigate to a new page as before.
v1.9.69 Website 2026-10-05

Fixed the player-list search box being covered by the cards

  • Elements with reveal animation carry will-change, and will-change creates a stacking context, so the dropdown z-index only counted inside its own card and lost to the stat cards that come later in the DOM
  • The whole search card is now lifted, so the dropdown floats fully on top
v1.9.68 Website 2026-10-04

Fixed the mobile profile page refusing to scroll

  • The 3D skin viewer hard-coded touch-action:none and called preventDefault unconditionally on touchstart/touchmove, so a finger resting on it froze the whole page — vertical swipes now go to the browser and only horizontal ones rotate the model
  • The drag-the-background gesture on the header is now mouse-only as well
v1.9.67 Website 2026-10-04

Server guide rewritten: twice the content, and commands now say which ones are for players

  • All four pages — getting started, rules, FAQ and about — have been rewritten, each explaining why a step matters and what to do when it fails
  • The commands page now opens with a hand-written Player commands section grouped into first steps, travel, chat and status; the full 435-row table is still there below
v1.9.66 Website 2026-10-04

The mobile scroll hint no longer sticks to the table

  • The hint above the table used to sit right on its top border and read as if the two were stacked; it now has proper spacing
  • The header is fully opaque once you scroll: it used to be translucent, letting large page text show through
v1.9.65 Website 2026-10-04

Closed a security hole in uploaded SVG files

  • Previously, a specially crafted SVG avatar or banner could reveal the IP address and browser details of everyone who viewed it. Such external references are now stripped out, without changing how the artwork looks.
  • Also added HSTS and a few conservative content security policies.
v1.9.64 Website 2026-10-04

The review badge no longer stays lit + the status page hides internal IPs

  • The admin “review” badge counted five queues, but the “server management” drawer can only handle two of them — so the badge stayed lit with nothing to review. Both now use the same measure, and the drawer gained a “more pending” row: gallery / skins / forum, each linking straight to its existing admin page.
  • The “web map” row on the status page used to read 127.0.0.1:8100 (an internal address, only used for probing). It now shows the public web map address.
v1.9.63 Website 2026-10-04

Review videos right in the admin card

  • Backgrounds with a dynamic background video now show that video directly on the review card — press play to watch it, loading only the head by default (no wasted bandwidth), with an “has video” tag.
  • Previously the card only showed the separate cover image the player picked, which may have nothing to do with the video. No more approving blind.
  • Also fixed “upload time showing 1970-01-01”: my asset-upload helper wrote the wrong time format. Both the data and the helper are corrected.
v1.9.62 Website 2026-10-04

Sign-in 500 fixed + two visual tweaks

  • Fixed a 500: in the previous release I put the arguments of the post-sign-in audit log in the wrong positions, so every successful sign-in threw an internal error. Signing in now redirects normally.
  • The "I have read and agree to the Terms of Service and Privacy Policy" line has moved to the bottom of the form (after the Sign in button), matching common login pages. You still cannot sign in without ticking it.
  • The player page header scrim is now a smooth gradient — the obvious horizontal line is gone, so it fades out naturally instead of looking like a strip of tape across the header.
v1.9.61 Website 2026-10-04

You must accept the terms to sign in

  • The login page now has a checkbox: "I have read and agree to the Terms of Service and Privacy Policy" — you cannot sign in without ticking it. Both entry points are gated (QQ one-click and email + password), and the server checks it too, since disabling a button alone stops nobody.
  • We wrote two real pages, Terms of Service and Privacy Policy, listing item by item what this site stores about you: the nickname and openid QQ gives us, your email and password hash, linked characters, gameplay stats, images you upload, and the IP and time of each sign-in.
  • They also state exactly who we share with — only three parties: QQ Connect (sign-in), mc-heads.net (skin avatar when you have not uploaded one), and 126 Mail (verification codes). No ad networks, and we do not sell data.
  • Retention, how to request deletion or export, and how we treat minors are covered too. Both pages are also linked in the footer under Quick links.
v1.9.60 Website 2026-10-04

Header text is readable on the bright frames now

  • After the video replaced the photo, the white header text sat on bright sky and clouds at a worst case of 1.16:1 — practically invisible. The cause was paint order: the video is a real child element while the darkening gradient lived on body.cdr-body::before (generated content), and generated content always paints before real children, so the video covered the gradient entirely and it did nothing at all
  • The fix turns the darkening into the own background of the header: a single top-to-bottom gradient (62 percent at the top, gone by 350px) that covers only the header strip and leaves the subject, the ground and the water untouched pixel for pixel; no new fixed layer was added, so the page height stays at 6816px
  • On the brightest frame the header contrast rose from 1.16-2.63:1 to 4.85-6.91:1 (the white-text standard is 4.5:1). A live-only regression was fixed along the way: under liquid glass the Back button has a translucent surface, so the scrim darkened it too (5.19:1 fell to 2.14:1); its label now turns white as well, worst case 6.04:1
  • Only pages that have a banner are affected; pages without one are byte for byte unchanged. Wheel scrolling, buttons and video playback were all re-tested
v1.9.59 Website 2026-10-04

Animated backgrounds: the real cause of the dead scroll wheel and click is found

  • The cause was a class-name collision: .pub-bg-video was both the video element class and the toggle class put on <html>. So the whole full-screen fixed video layer rule landed on the root element — the root became position: fixed, the page height collapsed to one screen, and the wheel had nothing to scroll
  • Sneakier still, pointer-events: none is inherited: the entire document tree stopped receiving the mouse, only <html> caught it, and the Back button became unreachable
  • The fix: rename the state class to pub-bg-on and narrow the element rule to video.pub-bg-video, so the two can never collide again
  • The background material is back to the first version (4.50 MB to 4.41 MB) with no darkening baked into the frames, so the colours are normal again; three local inspection harnesses were also corrected — they were measuring <html> while believing they measured the video layer
v1.9.58 Website 2026-10-04

Animated backgrounds: removed a free screen of height, drag is easier to find

  • New video (15.98 MB to 4.50 MB) with the darkening baked straight into the frames; the still on mobile is the very same image
  • Dropped a redundant overlay layer that was invisible yet silently added over a screen of height to every page
  • The cursor now turns into a grab hand over the page header, so you can tell where to drag; the gate is relaxed so touchscreen laptops work too
  • The scroll-wheel issue is still being chased; this release fixes the three above
v1.9.57 Website 2026-10-04

Your profile can have an animated background now

  • Upload a silent clip of 5 seconds to 1 minute; it loops on desktop, while phones keep the still image and download nothing extra
  • Only the banner slot takes a video, and it goes through the same review as images; the limit is 6 MB — over that you get a clear error, never a silent failure
  • The still image phones see is your banner, so pick one that matches the clip
  • This is off by default — turn it on in the admin switches and the upload box appears
v1.9.56 Website 2026-10-03

Fixed: "I picked an image, hit save, and nothing happened"

  • A player uploaded an avatar and a banner — even sent a video — yet nothing showed up for review. The image never reached the server; $_FILES was empty from start to finish
  • The cause was iPhone HEIC: the browser can't decode it, the crop dialog treated that as "cancel", and cancel wipes the file out of the form. With no file in the form, the server could only assume "not changing the image" and replied with a green success message
  • Images the browser can't decode are no longer discarded — the original is uploaded as-is (just uncropped), and you're told why
  • There's also a server-side safety net now: if the browser says an image was picked but no file arrives, it reports an error instead of pretending to succeed. Actually cancelling says so plainly too
v1.9.55 Website 2026-10-03

Fixing "Unknown player" names moved into the admin panel

  • The CLI script .tools/_backfill-names.php is now a button under Admin -> System tools, no command line needed
  • It reads usercache.json from the historical backups, restores real names for rows still named after a UUID, and carries the session log / achievements / skins along
  • The page first shows exactly which rows change and to what; a database snapshot is taken before anything is written
  • Only rows whose whole name is a UUID are touched; if the real name is taken the two rows are merged, and normal players are never renamed
v1.9.54 Website 2026-10-03

Leaderboards: the top ten in nine categories, on one screen

  • This is the "breakdown leaderboards" you asked for. The sort dropdown on the player list shows one dimension at a time, so comparing "who mined the most" against "who died the most" meant switching back and forth. /ranking puts the top ten of nine categories on a single screen
  • One card per category, each listing rank, avatar, name and that category's value —
  • the numbers are identical, character for character, to the player list, because both read the same formatting code. Click a name to open that player's page
  • The "View all" link in each card header opens the full list already sorted by that column (?sort=). The entry point is the "Leaderboards" button under the player-list title. Categories with no data produce no empty card, and bots stay excluded as before
v1.9.53 Website 2026-10-03

The profile background is now draggable

  • On profiles with a banner you can hold the mouse down and drag the background photo — like pushing a landscape print around, with the header, avatar and name sitting firmly on top
  • Only the top area (the page header) responds. Cards, tables and buttons below work as usual and text selection is untouched; pressing a button never starts a drag
  • Let go and it springs back into place; drag to the edge and it stops (a small margin is kept all round), so the photo never leaves the screen and exposes the background colour
  • Mouse and trackpad only. Touch screens and anyone with “reduce motion” turned on are excluded and behave exactly as before
v1.9.52 Website 2026-10-03

“Unknown player” rows will now fix themselves

  • A few rows in the list read “Unknown player · 87274f” — that string is actually the player’s UUID. The server’s name cache only keeps about a month, so once a long-time member stops playing for a while the mod can no longer resolve a name and reports the UUID instead
  • The problem was that such a row could never heal: when the player came back and the server learned their name again, the rename collided with the unique-name constraint (a row for the real name usually already existed), the error was swallowed, and the row kept its UUID
  • Both paths now work: if the real name is free we rename the row and carry its session history, achievements and skin across; if the name is taken we merge into it — playtime added, progress unioned, first/last seen widened
  • Nothing for you to do — it repairs itself the next time they log in. The sync log records “adopted=N”, visible under System tools in the admin panel
v1.9.51 Website 2026-10-03

Your avatar now shows everywhere; login history is paged; soft buttons are no longer washed out

  • The avatar you uploaded used to appear only on your own profile — every other avatar on the site went through a different path that had no idea you had uploaded one. Player lists, comments and the navigation now use it too; players who never uploaded anything look exactly as before
  • The recent login history showed 30 rows at once. It is now 10 per page, with the same pager the rest of the site uses (hidden when there is only one page)
  • The "expand all badges" button looked grey and disabled — a specificity problem: the soft button's blue tint lost to the base white layer, and its own background was wiped as well. Fixed
  • The empty space under the left column of a profile: the left column now stretches to match the right one, with the rank card filling the rest, so there is no gap whether badges are folded or expanded. The radar notes are now collapsed by default too
v1.9.50 Website 2026-10-03

Liquid glass rewritten from the reference: this time it is actual glass

  • The previous version was just "one gradient map + a displacement", and no amount of tuning made it look right. Comparing line by line with the reference showed three missing pieces; all three are here now
  • Refraction is now real optics: glass thickness, bezel width, index of refraction (1.0-3.0) and the rounded surface all feed the calculation, which is what gives the edge that "thick glass" magnification
  • A specular layer was added - a rim reflection along the edge facing one direction. It is the single most recognisable feature of liquid glass and the previous version had none
  • Saturation is restored after the displacement (refraction greys colours out) plus a touch of antialiasing. Blur stays at 0.3px: any more and neighbouring pixels stop differing, which erases the refraction entirely
v1.9.49 Website 2026-10-03

You can crop your avatar now — drag it, and what is in the frame is what you get

  • Previously you uploaded the whole image and the site scaled it down from the centre — if your face sat off to one side, that was just how it looked. Now picking an image opens a crop frame: drag to reposition, scroll or use the slider to zoom, and what is inside the frame is your final avatar
  • The export is 512×512 (the same cap the server uses) in WebP. Small images are never upscaled — that only makes them blurrier, so they are cropped at their own size. The frame narrows automatically on small screens, so it works on a phone too
  • Two kinds of image are deliberately left alone: animated GIFs (cropping would keep a single frame and kill the motion) and SVG — both go through the old path unchanged. If anything fails mid-crop (unsupported browser, out of memory) the original file is sent instead, so you can never get stuck on "I picked a file and nothing happened"
  • Banners are not cropped — they are wide by nature and squaring them makes no sense. The frame only appears when you upload an avatar under Me → My profile.
v1.9.48 Website 2026-10-03

Frosted glass drops a notch on narrow screens, so mobile stutter should ease

  • The jank on the mobile profile page was not a badly written animation — the blur itself was too expensive: every card carried blur(32px) saturate(180%), and seven or eight glass surfaces are visible at once on this page, so every scrolled frame had to re-sample all the pixels behind them
  • The difference between 32px and 14px is almost invisible to the eye — the cards already sit on .70–.78 white and the blur only softens the photo behind them; but sampling cost scales roughly with the square of the radius. Saturation drops from 180% to 150% too; nothing on this page needed more vivid colour
  • Only narrow screens drop a notch: desktop is unchanged, not a pixel moved. This is a pure performance change you will barely see — but scrolling on a phone will feel a lot smoother
  • This is a pure performance change you will barely notice — if scrolling still feels rough on your phone, tell me which screen and I will keep digging.
v1.9.47 Website 2026-10-03

The mobile status page is far shorter; the ban list no longer repeats "QQ not linked" on every row

  • On phones, every service row used to wrap onto two or three lines. The reason was concrete: the row was a three-column grid whose minimum widths added up to 504 px, while a phone viewport is only 492 px — just barely too narrow, so each row was forced to wrap. Narrow screens now use two columns with the note on its own line, cutting over 500 px off the page
  • Panel padding, the availability strip and the node cards were tightened a notch on narrow screens too. These changes live only in a style block inside the status page itself — not a single pixel moves on any other page
  • In the ban list, every row carried the identical line "QQ not linked" under the player name, making the table look broken. It turned out the back-office "hide QQ on the ban page" switch was computed and then never used — the setting had always been dead
  • All three places now honour that switch: the list row, the QQ badge and tooltip on the avatar, and the expanded detail. Ban reasons are still hard-coded in Chinese (all ten languages show Chinese); I will handle that separately
v1.9.46 Website 2026-10-03

Background images move now, and they lean away from your mouse

  • Animated GIF banners are supported now. It was never "unsupported" — it was "supported, then flattened": every upload was re-encoded to WebP, and decoding a GIF yields only its first frame, so an animation arrived as a still image
  • The fix: a multi-frame GIF is stored byte-for-byte, without re-encoding, so the animation survives. The trade-off is that animated banners are not resized to 1920x1080 — re-encoding would kill the animation, so this is deliberate
  • The background now follows your mouse: as the pointer moves, the background layer drifts up to 10 pixels the other way, so the photo reads as having depth
  • Each frame only changes one CSS variable, so the photo itself is never redrawn; once the pointer settles the loop stops, leaving an idle page exactly as cheap as before. Mouse and trackpad only, and fully off under reduced-motion
v1.9.45 Website 2026-10-03

The cross on the Back button: four rounds, and the cause was inside a comment

  • The cross is gone. It was a bright spot the browser leaves at the top-centre edge when it samples the backdrop on a small box —— this button is only 58x35, so the spot covers a noticeable share of it; on a large card the same spot is diluted and invisible
  • The fix: this small button no longer carries a backdrop sample, and its tint went from 8% to 14% to keep it feeling translucent. The cost is zero: with and without refraction this button differs by 0 of 1,766,688 pixels (max channel difference 1)
  • The harder layer came next: the rules were right but had no effect. Quoting the reference CSS verbatim inside a comment, I wrote /* 6% */ —— CSS comments do not nest, so that */ closed the outer comment early, the following } closed the rule early, and the parser swallowed every rule after it
  • That bad comment had been there since 1.9.42, so for three whole versions the button glass was missing its inner glow and outer shadow —— both are back now. The lesson is now a test: never put anything in a comment that ends the comment early (the same trap has already caught me twice in PHP)
v1.9.44 Website 2026-10-03

That flickering line on mouse move: eight versions later, the cause was a 2px hover lift

  • The cause was not the highlight, and not the area of frosted glass — it was a site-wide hover rule: every time the pointer crossed a card, the card was lifted 2px. The cards carry a frosted backdrop, so the moment one moves the browser has to re-sample the image behind it, and that sampling is cut into tiles — the tile seams are the line
  • Five dead ends along the way (moving the highlight from the background to a pseudo-element, switching it to transform, making it a real child element, moving it out of the glass, deleting it entirely). Each looked like it «should» work, and none of them touched the cause
  • The fix: glass surfaces no longer move on hover — they answer with a border and a shadow instead. Two full-width frosted bars (the nav bar and the pinned name row) also lost their blur; large-area sampling is the most expensive kind
  • Two visible things came out of the same batch: the pointer-following highlight is gone entirely (too distracting), and the button glass was rewritten into the reference's three layers (refraction and tint separated)
v1.9.43 Website 2026-10-03

The admin login button vanished: a specificity bug I introduced in the previous version

  • The button glass added in v1.9.42 had a specificity mistake: the base 8% white tint layer counted as "five classes plus two elements", while the primary button's navy gradient counted as only "three classes" —— so the base layer always won and the gradient never rendered. On top of that, background: none in the same block stripped the primary button's own gradient. Navy background with white text therefore became white on white, and the button disappeared entirely
  • Fix: solid brand buttons (the primary button) no longer take part in the glass at all. It is a navy button with white text; this glass treatment only suits light buttons. The primary button is back to its original solid style
  • The same bug had also been silently eating the hover highlight (it counted as "four classes" and lost to five) —— so the previous version's "hovering now makes a difference" never actually took effect. It does now
  • One more knock-on bug: background: none also wiped busy buttons, while the glass layers skip them —— so a loading button went completely transparent for those few seconds. Busy buttons now get their background back
v1.9.41 Website 2026-10-02

The pointer-following glow is gone

  • What was removed: the cool blue soft light that followed the cursor across the cards. The whole thing is gone — the variables, the switch, the layer, the script, every fragment of it
  • Why: you reported the same problem four times — "a patch flickers as soon as the mouse moves" / "a horizontal line". I rewrote it four ways (painted into the card background, moved into a pseudo-element, made into a real child element, moved out to a full-page standalone layer) and none of them cured it. Your last word on it was "delete the pointer glow, it is too distracting" — so it is gone
  • A side benefit: with it removed, moving the pointer no longer causes any repaint at all. That also turned out to be the last piece of the flickering-line puzzle — while anything inside a frosted-glass element changes frame by frame, the browser has to keep recomputing the picture behind it, and it recomputes that picture in tiles, so the tile seams are the line you saw
  • Nothing else changed: the glass transparency, the photo-only first screen, the pinned name row and the liquid-glass buttons are all exactly as they were. Visitors without a mouse and touch visitors never saw this glow in the first place, so for them this update is a no-op
v1.9.36 Website 2026-10-02

The pointer glow no longer jumps between elements, and the buttons got a stronger liquid glass

  • The pointer glow no longer "jumps": moving the pointer from one card to another used to teleport the glow —— the old one vanished and the new one appeared instantly. Now the old one fades out where it sits while the new one fades in under the pointer, with the centre point gliding along; the whole move takes about 180ms
  • Why not a CSS transition: transition replaces an entire declaration, and there is no way to add a transition to just one property; doing it that way would need a selector that also overrides the card entrance and hover animations, turning the scroll-in from a fade-and-rise into a hard cut. So the script instead eases a single number (the glow intensity) frame by frame, and stops as soon as it settles
  • The buttons' liquid glass is stronger: the refraction displacement went from 14 to 50, the bevel band was widened, and the things that actually make it read as glass were added —— a specular highlight along the top edge, warm and cool dispersion fringes on the left and right edges, and an inner sheen. The blur was tightened from 1.5px to 0.8px at the same time (blur erases exactly the detail the displacement needs to chew on)
  • The honest caveat stands: only Chrome and Edge render it, and refraction is only visible when there is something to refract —— on a plain white card it is essentially zero, while over a banner photo with real light and shade it shows. The switch lives in the admin panel under "System settings → Appearance effects" and is off by default
v1.9.35 Website 2026-10-02

The first screen is just the photo now, the content rises on scroll, and the buttons got liquid glass

  • The first screen became a hero: on a player page with a banner, arriving shows only the page head and the background photo filling the viewport — the content area is not displayed at all. One turn of the wheel down fades and lifts the whole content block in (still at 28% transparency), and scrolling back to the top tucks it away again, so you can watch it repeatedly
  • Why the content blocks themselves move instead of a wrapper: any ancestor with an opacity below 1 creates a new backdrop root, and every backdrop-filter surface inside it then samples an empty background — the frosted glass breaks completely. Fading the blocks individually has no such ancestor. The only two position: fixed elements in the body (the background layer and the pinned name row) are outside that set, so moving them is safe
  • Liquid-glass refraction on buttons (a new switch under Admin → System Settings → Appearance Effects, off by default): a button edge now bends the pattern behind it slightly, the way a thick piece of glass would. It uses an SVG displacement map plus backdrop-filter; the map is drawn once with canvas when the page opens, and there is no per-frame script
  • Only Chrome and Edge render it: Safari and Firefox do not support this CSS feature and fail silently (no error, no drawing), so they fall back to the frosted glass you already have. And refraction needs something to refract — over a flat surface like a white card the effect is essentially zero; it only shows over something with light and dark detail, such as the banner photo
v1.9.34 Website 2026-10-02

The cards let a little more photo through, the pointer glow is smaller, and the pinned row slides in

  • What changed: on a player page with a banner, the big cards now let roughly 28% of the photo through instead of 5-10% (you can actually see it), and the stat chips and the radar card were lightened to match
  • Why the stat chips looked like two different colours: the pointer-follow glow used to be a 320px-radius blob of cool blue at alpha .22. When it covered the left half of the card, chip 1 measured rgb(189,193,197) while chip 4, outside the blob, measured rgb(245,246,247) —— a 56-level spread in one row. The blob is now 200px at alpha .10, and the chips no longer light up on their own (the outermost card is always the lit one); the same row now measures a 3-level spread
  • The other half of the "flicker": moving the pointer from empty card space onto a chip used to flip the script's target between the whole card and that single chip, so the glow jumped from a large wash to a tiny spot. Taking the chips out of the glow removes that jump
  • Pinning now has a slide: the name row drops 10px and fades in below the navigation over 180ms. With "reduce motion" enabled, that animation and the button spring turn off (the pointer glow stays)
v1.9.33 Website 2026-10-02

The name row now pins itself below the navigation as you scroll

  • What changed: on a player page with a banner, scrolling down pins the "avatar + name + level + badges" row just below the site navigation while the cards slide underneath it. The signature is not part of that row and scrolls away as before; the Back button pins along with the name
  • Why `position: sticky` could not do it: the row's parent is .cdr-container, which is only as tall as the page head, so sticky's travel range is trapped inside it —— past the head the row walks away with everything else. The row is therefore position: fixed, and a script inserts an equal-height placeholder where it used to sit (fixed removes it from the flow; without the placeholder the whole page jumps up by 86px the moment it pins)
  • Pinning also has to flip the ink colour: this row normally carries white text over the banner photo, but once pinned it sits on light glass, and white on white is invisible (a measured build showed the avatar and the "online" badge fine with the name cell completely empty). The pinned state therefore switches the name, level and badges to the ink colour used on glass surfaces
  • Only pages whose player uploaded a banner are affected —— pages without one (say /players/zlc) were not touched by a single byte
v1.9.32 Website 2026-10-02

The pointer highlight now lights only the one surface it should

  • The root cause was custom-property inheritance. The script puts .is-lit on the card under the pointer, and --glass-spot then travels down the inheritance chain into every .stat-mini inside that card —— one switch became seven or eight lit surfaces. That is exactly what you saw: "my pointer is somewhere else, why did everything light up?" The evidence: the probe status bar gained a spot= counter that counts not how many elements have .is-lit but how many computed --glass-spot values are not transparent —— before the fix, parking the pointer on a card's blank title area read lit=1 spot=8/27
  • The fix: every glass surface now resets --glass-spot to transparent for itself, so the inheritance chain stops right there; whichever surface the pointer actually sits on gets .is-lit from the script. After the change: spot=1/27
  • A second trap fixed along the way: that reset has the same specificity as the .is-lit rule and is written later, so by "last one wins" a bare body.cdr-body .is-lit would be overridden entirely and the highlight would vanish (measured lit=1 spot=0/27). The .is-lit rule therefore has to list all four selectors and raise its specificity. Miss this step and the bug goes from "lights up too much" straight to "lights up nothing at all"
  • The coordinates are also written synchronously on entering a new element instead of only waiting for requestAnimationFrame: otherwise the first frame has no coordinates and the glow flashes in the middle of the card before jumping to the pointer. One .is-lit is now one lit surface —— wherever the pointer is, that is what lights up
v1.9.31 Website 2026-10-02

Liquid glass gains two tactile touches: pointer-following highlight and a springy button

  • Pointer-following highlight: as the pointer moves across any glass surface, a small pool of cool blue-white light follows it —— only the card under the pointer lights up, everything else stays as it was. It is a radial-gradient layer painted into the card's background, reading --glass-mx / --glass-my as the script writes them. No extra nodes, no stacking-context games, no interference with the card's blur. Light mode uses cool blue-white rather than plain white: a white card (rgb 229~245) can only be lifted 6 levels by white light, which the eye simply does not register
  • Taller page-head photo band: .page-head's bottom padding went from 30px to 160px (about 317px in total), pushing the whole row of white cards down so the avatar, name and level badge now sit directly on the banner image —— that is the "show more of the background" you asked for. Height only, no new content, and it narrows to 72px on small screens. The content was deliberately not shifted down as a block: that would waste the darkest part of the top mask and make the whitened lines unreadable
  • Springy buttons: pressing compresses to .955 and releasing eases back with cubic-bezier(.34, 1.56, .64, 1) —— the second control point has y = 1.56 > 1, so the curve overshoots its target and settles back; that overshoot is the "spring". Pure CSS, no JavaScript and no physics engine
  • The prefers-reduced-motion fallback now reduces autonomous motion only: the button spring (which bounces on its own after release) becomes a plain short transition, still with press feedback, while the pointer highlight is kept —— following the pointer is direct manipulation; the pointer moves, the page does not. Your own liquid-glass reference says exactly this: drop displacement, keep blur + highlight. It is also the only way this machine can see the highlight at all: Windows animation effects measure as off here (MinAnimate = 0 / DragFullWindows = 0 / VisualFXSetting = 2), which browsers truthfully report as reduce —— gating the highlight on that would hide it forever
  • Everything above applies only to profiles with an uploaded banner (the block is still inside $pubBgCss !== ''); every other page —— including profiles without a banner —— was not changed by a single byte, and four assertions in the test suite guard exactly that
  • One honest note: both of these are "feel" effects and cannot be seen in a static screenshot —— you have to actually move the pointer across a card and actually press a button. It is also worth switching Windows animations back on (Settings → Accessibility → Visual effects → Animation effects), otherwise your browser tells every website that the user asked for reduced motion
v1.9.30 Website 2026-10-02

Liquid glass rebuilt: card colour no longer shifts as you scroll

  • The cause was not the rendering engine. Profile pages hung the banner image on body with background-attachment: fixed. That statement means "the image stays pinned to the viewport", and it is not its own composited layer —— the browser has to re-sample it every frame for each card's backdrop-filter; when the sampling window and the scroll position drift apart you get a colour jump. At the same time the cards move while the image does not, so every translucent card sweeps across the whole photo. Both effects together are what produced "sometimes dark, sometimes light, sometimes normal"
  • Fixing the flicker while scrolling: the background moved off body into a dedicated position: fixed layer (body::before, z-index: -1, pointer-events: none, will-change: transform). A dedicated layer can be promoted to a composited layer, so the sampling source is one already-composited bitmap for the entire scroll instead of being re-sampled every frame
  • Fixing the steady-state difference: the cards now set their own colour. This is based on a linear extrapolation from measurement —— drift ≈ (1−alpha)×53, so keeping it under 4 levels needs alpha ≥ .925. Large cards go from 72% → 95% at the top edge and 60% → 90% at the bottom; stat chips 80%/70% → 97%/94%; the radar card 76%/66% → 96%/92%. The photo still shows through by 5~10%, which is where the glass gets its tint
  • The glass is now a multi-layer material: noise layer + vertical gradient + edge grazing highlight + inner refraction bevel, with every parameter exposed as a variable (--glass-blur --glass-sat --glass-highlight --glass-displacement --glass-noise). One honest note: true SVG feDisplacementMap refraction is not achievable here —— Chromium and Safari accept only filter functions in backdrop-filter, never url(#svgfilter), so an inner refraction bevel approximates that look instead of pretending otherwise
  • Result: across scroll positions the same spot now differs by only 3~6 levels (18 in the previous release, 100 originally), with overall brightness at 229~245; dark mode differs by just 1~3 levels. The text-shadow halo on glass surfaces was removed as well —— with a stable card it no longer helps and only eats the stems of 12px text
  • Also fixed "the ability radar labels are hard to read": no transparency was touched. The "server average" sub-labels simply went from .76rem to the main row's .84rem, from muted grey to body-text colour, plus a little weight. The real cause is that 12px and 13px CJK take different antialiasing paths on Windows. All of the above affects only profiles with an uploaded banner; pages without one did not change by a single byte
v1.9.29 Website 2026-10-02

Card brightness no longer shifts while you scroll

  • The cause was not a rendering bug. Profile pages set background-attachment: fixed for the banner, so the photo stays pinned to the viewport while the cards scroll past it —— every translucent card sweeps across the entire image: dark sky makes it dim, bright buildings make it wash out. The same card measured anywhere from rgb(99,107,125) to rgb(201,197,200) depending on scroll position, a 100-level swing
  • The fix is to make the glass itself denser, because alpha is the only lever that preserves both transparency and stability: large cards go from 56% → 72% at the top edge and 34% → 60% at the bottom; stat chips 76%/60% → 80%/70%; the radar card 70%/52% → 76%/66%. The density order (large cards lightest, chips densest) is unchanged
  • Result: the same spot now varies by only 14 levels across scroll positions instead of 47, and overall brightness sits at 163~206 —— a clearly light frosted panel rather than a murky grey. Dark mode was densified to match (the 82%/72% tier), where the remaining drift is just 4~8 levels
  • Only profiles with an uploaded banner are affected. Pages without a banner (such as /players/zlc) never emit this glass stylesheet at all, so not a single byte changed for them
v1.9.28 Website 2026-10-02

"86 hours of play per day" is fixed

  • The old formula was "lifetime playtime ÷ days that have session records" —— the numerator spans ten years, but the denominator only covered the 11 days since 2026-09-12. Dividing two different eras gave "86 hours a day". The numerator was never wrong; the denominator was missing most of the history
  • The denominator is now your lifetime active days: chat messages, achievement unlocks and play sessions are unioned per calendar day —— 423 days for this account. 941 hours ÷ 423 days = 2 hours a day, which is finally the right order of magnitude
  • Two more things fixed along the way: login count now uses the lifetime total (1,655, where 929 older players used to show 0), and longest single session can no longer show the impossible pair "21 minutes average, 0 hours longest"
  • Three achievements were also unblocked: 7 / 30 / 100 active days could never be earned because of that same denominator —— server-wide session records only ever covered 16 days, so the thresholds were unreachable
  • Security audit, part one: several genuinely exploitable issues were closed —— CSS escapes could hide an external URL inside an uploaded SVG (an avatar could be used to leak visitor IPs), the admin panel could delete files outside uploads, login had an open redirect, a script inside a backup archive could land as a web shell, and two local debug scripts were reachable on the live site
  • Security audit, part two: API and admin hardening —— an empty ban list can no longer wipe every ban on the server in one request, uploads of server reports now have row caps, whitelist names are validated, one bad chat line no longer fails the whole batch, and database errors no longer echo their details to visitors
v1.9.27 Website 2026-10-02

The fine print in the radar panel is legible now

  • The small text in the ability-radar panel (axis names, the numbers on the right, the "server average" rows and the note underneath) sat on 34% glass whose darkest spots gave only 3.3 : 1 contrast —— below the 4.5 : 1 that small type needs. That is the "I can't read this" you reported, and it was my miss in the previous release
  • Two changes: the secondary text colour was pushed one step darker, and the radar panel got a backing of its own —— nearly every line in that card is small print, so it should not share one transparency with the big cards
  • The big cards were left alone: the skin panel, the achievements card and the footer are still at 34%, with the image showing through as before, and the stat chips keep the denser backing they already had
  • The dark theme got the same treatment. And this still only happens on pages whose owner uploaded a banner —— character pages without one did not move a single pixel
v1.9.26 Website 2026-10-02

One notch clearer, and the text still holds up

  • Profiles: the top went from 62% to 56% and the bottom from 40% to 34%. You can genuinely see the image behind now —— the vertical tower lights, the horizon and the blocky skyline all read through, instead of a slab of frosted panel
  • "Seeing the image" and "reading the text" pull against each other, so they are handled separately: the stat chips (the small-print areas like "time played" and "logins") keep a denser backing of their own (76% → 60%), while the large cards stay very clear. Small is more solid, large is clearer —— the opposite of the usual Apple hierarchy, and deliberately so
  • The text gained a very faint halo in the same direction (text-shadow) —— invisible when the backdrop is bright, only showing up when it is dark, so the type carries its own local backing. That is what makes 34% safe to ship
  • The dark theme got matching dark-glass and dark-halo values. And this still only happens on pages whose owner uploaded a banner —— character pages without one did not move a single pixel
v1.9.25 Website 2026-10-01

More translucent glass, and more Apple-like

  • Profiles: no longer a flat 68% white —— it is now a vertical gradient that is bright at the top and clearer at the bottom (62% → 40%), the gaussian blur went from 22px to 32px, plus saturate(180%) and brightness(1.12). Apple-style glass picks up the colour behind it and lifts it slightly; blur alone just looks frosted
  • The glass now has a refraction edge all round —— a 1px grazing highlight along the top plus a very faint inner stroke. The shadow is split into two layers (a tight contact shadow and a wide ambient one), so the pane reads as floating above the image instead of lying on it like paper
  • Fixed something that only surfaced once it got clearer: secondary labels like "time played" and "logins" were close to invisible —— the grey they use only reaches 2.5:1 on translucent white. They now get a darker shade inside the glass, while the small print that sits directly on the banner is left untouched
  • The dark theme got a matching set of dark-glass values. And all of this still only happens on pages whose owner uploaded a banner —— character pages without one did not move a single pixel
v1.9.24 Website 2026-10-01

Profiles went "liquid glass"

  • Cards, the skin panel, the six stat tiles and the whole footer are now translucent glass (68% white + a 22px gaussian blur), with your banner showing through, blurred, behind them. The text stays dark so it is still legible on top of the image; the dark theme swaps in dark glass
  • The achievements card header now has Collapse all / Expand all, folding all 8 categories at once —— no more scrolling to the bottom of the 98-badge wall to reach that button
  • The admin drawer in the bottom-right corner has a fourth tab, Avatars / Backgrounds, where pending uploads can be approved or rejected. It is the same data as "Players & data → Avatars / backgrounds", so reviewing from either place does the same thing
  • All of this only happens on pages whose owner uploaded a banner —— character pages without one did not move by a single pixel (I compared the before and after screenshots pixel by pixel)
  • Where glass is not available (older browsers) it falls back to the old solid cards. It deliberately does not follow the system "reduce transparency" preference —— the site owner's own Windows has transparency effects switched off, so honouring it would mean he never sees the glass at all
v1.9.23 Website 2026-10-01

Your profile page can now fill the screen

  • Background —— if you have uploaded a banner, your character page uses that image to fill the whole browser window, with your avatar, name, level and location sitting on top of it. Pages without a banner do not change by a single pixel
  • Location —— in Me → Personalise you can pick a country (plus a province if you choose China); it shows up on your profile next to "offline / rank #8". Leave it unset and nothing is shown
  • Avatars in the player list now prefer the one you uploaded. They used to always fetch the official skin avatar from an overseas host, which mostly fails to load here —— which is why you only ever saw coloured letter tiles
  • Uploaded avatars and backgrounds are reviewed before they go live. While a new one is waiting, the old picture keeps showing, so you never get a half-new page; removing one takes effect immediately
  • The upload limit is wider: banners up to 3840×2160 (was 1920×1080), and SVG is now accepted —— SVGs are sanitised, so scripts, external references and embedded HTML are all stripped out
v1.9.22 Website 2026-10-01

A new look for pop-ups · and old bans are back

  • All 16 pop-ups across the site now use the site's own dialog. They used to be the browser's own boxes, topped with "cloudridge.cn says", which looked out of place on mobile and ignored the site's styling entirely. Titles, body text and buttons are now ours; destructive actions get a red button, Esc cancels, Enter confirms, and focus returns to the button you clicked
  • The 8 players and 3 IPs still banned when the old server shut down have been restored to the ban list — the public page now shows 12 players and 7 IPs. Names, IPs, ban times and the operator who issued them are copied verbatim from the archives; nothing was invented. One caveat: the mod only reads the server's ban files and reports them — who actually gets blocked in game is still decided by the server's own list, so the entries take effect once the server reloads it
v1.9.21 Website 2026-10-01

That "Unknown player" was the same person all along

  • The player list always carried a row reading 「未知玩家 · 000000」 (unknown player), looking like a fourth person nobody had counted. Now it is clear: the old server's floodgate handed Bedrock players a UUID in the 00000000-0000-0000-0009-… placeholder range, and the mod could only report a *name* —— which at that moment happened to be that very UUID. It was really birdzhonghuifei playing on Bedrock, and it has been merged back into its owner
  • The rule for merging: counters (playtime, logins, deaths, blocks mined and placed, distance) are added up, advancements are unioned, and first-join takes the earlier of the two while last-seen takes the later —— timestamps must never be added. All nine badges on the stray row already existed on the owner, so the duplicates were dropped. The board is one row shorter, and birdzhonghuifei's numbers are now more complete
v1.9.20 Website 2026-10-01

Jump straight to any month on the calendar

  • The calendar popup now has a year and a month dropdown in its top-left corner: pick a year, pick a month, and you are two clicks away from any month —— no more tapping ‹ one month at a time. The back/forward buttons and "Today" are still there, and the dropdowns follow along as you page around
  • Also fixed a sorting quirk: sorting by "first joined" used to push rows with an unknown date to ranks 1–4, which made the whole board look broken —— "no value" is not the same as "the earliest". Such rows now sink to the bottom of the list, in either direction
v1.9.19 Website 2026-10-01

229 more chat lines recovered

  • The TrChat plugin log only starts on 2023-09-01, so parts of late 2024 were missing. Three old CoreProtect databases that had never been imported turned up 34,417 chat lines from 2024-07 to 2024-12; after de-duplication that is a net 229 messages across 37 days, the earliest from 2024-07-11
  • De-duplication works on "this player already said this within ±5 seconds" —— the same message is recorded once by TrChat and once by CoreProtect, their timestamps usually differ by a second and occasionally straddle a minute boundary, so comparing by minute would let those few dozen back in as duplicates
  • Those 37 days were not blank to begin with —— TrChat had recorded most of the conversation; what came back are the scattered lines it missed. Browsing those July–December 2024 days now shows a more complete picture of what was said
v1.9.18 Website 2026-10-01

Small accounts unfold inside their main row

  • Rows on the player list that own more than one character now start with a caret: collapsed by default, and one click unfolds each character into its own line with its own playtime, login count, last-seen and status (the main row is the sum, the sub-rows are the parts). Click again to fold back
  • Searching for a small account's name unfolds that row automatically —— searching for Winter shows its own figures right next to Fruity_oxygen's, instead of making you guess whose row it hides in. Also fixed an old glitch: sorting by player name left the header one column short of the body, which skewed the whole table
v1.9.17 Website 2026-10-01

Player board now ranks accounts · three years of chat recovered

  • The player list is now one row per website account: characters under the same account are added together (Fruity_oxygen and Winter merge into one row, ElfinLettuc and Faithe into another), while players who never linked an account keep a row each. The "N characters" badge next to a name opens up who was merged into whom — the old board split an alt from its main and made the alt look like wasted time
  • A new account page (/accounts/<id>): every character under the account is listed with its own playtime and login count, and the summary figures above are the sum of them. The page is fully public — no login needed. A stale row was cleaned up along the way: one character pointed at an account id that no longer exists
  • Three fields that had been stuck on placeholder values are now filled in: last seen (929 characters all claimed 2026-09-13), first joined (936 equally fake 2026-09-13), and login count (291 across the whole site, with 928 players showing "—"). Last seen comes from the server save files' modification time; first joined and login count come from the logs of every server generation. wwwsum now honestly reads 2024-08-22 and 7Strawberry 2024-03-07, and the login total went from 291 to 21,766
  • The chat panel has recovered everything since the server opened: from the very first line on 2022-12-16 up to where the mod took over live reporting on 2026-09-25, that is 174,457 messages and join/leave records (124,024 chats, 25,424 joins, 25,009 leaves). Previously only the few days with the mod installed had any history; now any day you click on the web map shows the conversation from that day
  • The calendar used to mark only the last 400 days as clickable, so 492 of the 729 recovered days could not be opened — restored but unreachable. Every day with records is clickable now. Also, the "registered players" figure differed by 2 between the home page and the player list (791 vs 789); both now use the account count
v1.9.16 Website 2026-09-30

Outbound requests now verify TLS certificates

  • Every outbound HTTPS request the site makes — skin host, IP geolocation, SMS gateway, mail server, QQ login, and the admin panel's test buttons — used to be sent with certificate checking switched off, so anyone on the path could answer with a self-signed certificate and take the request over. All of them now verify properly, against a root certificate bundle shipped with the site (Mozilla's, 121 roots).
  • The mail connection mattered most: with checking off, someone on the path could collect the mailbox password and the full text of every message. The 126 mailbox's certificate is valid, so sending is unaffected.
  • There is a cost: when a remote certificate really is broken, the request now fails with an error instead of quietly connecting. The admin panel's test buttons call this case out separately as "certificate failed validation". And if the bundle ever goes missing, the code still refuses to fall back to no checking — it simply fails more clearly.
  • Also fixed an old blemish: the v1.9.6 and mod 1.6.0 entries in the changelog showed the literal word "title" as their heading — they only ever had body text, while the page renders a heading unconditionally, so the missing key fell back to the last segment of its own name. The headings are filled in now
v1.9.15 Website 2026-09-30

A security sweep: six issues fixed

  • The admin area had a door left ajar: anyone in the Owner / Admin / Manager groups could log into the front end with their ordinary site password and walk straight into /admin/** — the email verification step was skipped entirely (only the admin login page itself had been closed off). There is now a "this session really did pass the code step" credential, so a front-end login is no longer an admin login. The UI has always claimed that /admin/** only accepts admins-table accounts; the implementation finally matches that
  • When the mod could not read the ban list it reported an empty list, and the site read "the list is empty" as "every ban has been lifted" — overwriting the whole ban table, fabricating an unban entry in the history and clearing players.is_banned along with it. The mod now declares the list authoritative only when it genuinely read one, and the site runs the unban reconciliation only when it receives that declaration (or a non-empty list). This one needs mod 1.6.6 to take full effect; the site side already holds the line
  • A player profile banner URL is supplied by the player, and it was pasted straight into style="…url(URL)". One ) in that URL is enough to append arbitrary CSS declarations — and profiles are public, so every visitor is hit (position:fixed for full-screen phishing, or a tracking pixel leaking each visitor IP and browser). Escaping cannot save this one: HTML turns &quot; back into a quote before CSS ever sees it. URLs now go through a whitelist, and anything else simply shows no banner
  • The card on /whitelist titled "My applications" was in fact querying the 5 most recent applications site-wide — any logged-in user could read other people game IDs, QQ numbers and review notes. It is filtered by ownership now; the admin and server-manager pages still show the site-wide view
  • The tools page DNS lookup was the one entry point that never blocked private addresses: 127.0.0.1 and internal hostnames resolved fine, and an SRV record (whose target is dictated by somebody else DNS) offered a way around it. The host:port port check also ran before the colon was split off, so 8.8.8.8:53 could probe any port it liked. All three are fixed, and AAAA records pointing at ::1 are covered too
  • Three more: ① a javascript:… value in the next= parameter of the login redirect was a one-line XSS (Url::ensure() let anything through untouched as soon as the string contained index.php, without ever looking at the scheme); ② after running the password-recovery script, the admin login page displayed the new plaintext password to anyone who opened it — that password is already printed to the server console, so the copy on the page is gone; ③ with the CDR_DEBUG_CSRF switch on, the log recorded the first 160 bytes of the login request, which is the plaintext password — it now records field names and lengths only
v1.9.14 Website 2026-09-26

Fixed achievements flickering between more and fewer

  • A player's achievements were lit while they were online in game and went dark the moment they logged off — because when the mod cannot read the progress file it reports an empty list, and the site treated that as "this player has no achievements" and wrote it to the database, wiping what was already stored. An empty list is now never written: better to keep the old data than reset it to zero (same for adv_done, which is only accepted when above zero)
  • Also fixed a sorting problem that split one series across a category: "achieved badges first" pushed 跳跃 10,000 / 100,000 (achieved) and 跳跃 500,000 (not achieved) to opposite ends of the group with the End and Nether progress badges in between. Badges are now grouped by series first (1 km / 10 km …, 10k jumps / 100k jumps …) and sorted achieved-first inside each series — folding still hides unachieved ones in place, so achieved badges remain immediately visible
v1.9.13 Website 2026-09-26

Fixed who a backfilled name belongs to

  • The same name can appear more than once in the backfill table — a player may have both an old offline UUID (00000000-0000-...) and a genuine one, with both pointing at them. The original code was first come, first served in file order: on this site birdzhonghuifei maps to both a 106.4-hour and a 1.9-hour row, and it only landed correctly because the longer row happened to come first. A different order would have handed the name to the wrong person. It now goes to the row with the most playtime, regardless of order
v1.9.12 Website 2026-09-26

All 863 "unknown players" got their names back

  • The server's usercache.json only keeps about a month, so in a world upgraded all the way from the 1.21 survival server to 1.21.11 the old players' names had long expired — the site could only use their UUID and showed "Unknown player · xxxxxx". So we went digging through the backup archive: merging the usercache / whitelist / ops / banned-players of every past server chronologically recovered all 863 names, none missing (the 395-hour entry on the leaderboard is iRXC). The v13 upgrade backfills them once: only rows still named after a UUID are touched, an existing real name is not altered by a single byte
  • Also covered an edge case: players.name is a unique index, so if a name to be backfilled is already held by another row, that row is skipped and noted — a uniqueness conflict can never fail the whole upgrade. Better to leave one player shown as "Unknown" than to wedge the migration
v1.9.11 Website 2026-09-26

Admin player names fixed · real names are no longer overwritten

  • The admin player list / dashboard / bans / whitelist / skins / users pages used to paste a raw UUID for players whose name could not be resolved — the public site has always shown "Unknown player · xxxxxx"; the backend simply missed a few spots, and now they match. There are 863 such players here: the server's usercache.json only keeps about a month, so the names this old world brought along expired long ago and the site can only use the full UUID as the identifier (not a rendering failure — there genuinely is no name left to show)
  • Also fixed a data-loss hazard: when the mod cannot resolve a name it reports an empty one, and the old code wrote the UUID over the stored value. A veteran who stops playing for over a month would have their real name permanently erased on the next sync — now an existing real name is kept, and the UUID fallback applies only when there genuinely is no name
v1.9.10 Website 2026-09-26

Fixed "225 hours played in one day" on player pages

  • Fixed the absurd figure in the "last 30 days" chart on player pages — when the server crashes or a leave event is lost, it leaves behind an online record that never closes, and reconciliation used "last time this player was seen" as the end time, so a session opened on 09-13 was counted all the way to 09-23 and those 225 hours all landed on the day they joined. Reconciliation now has three ceilings: the 6-hour cap, the start of that player's next session, and a last-seen value that can only tighten the estimate, never stretch it
  • The few bad rows already stored in the database now display correctly without touching the database (the same rule is applied when reading them), and "recent sessions", "total playtime", "this week" and "per-server time" now share one rule — each of them used to sum raw seconds on its own, so the same number contradicted itself across the page
v1.9.9 Website 2026-09-26

Mobile calendar overflow fixed · yearly online is now each day's peak

  • Fixed the date picker in the mobile chat spilling outside the panel border (on narrow screens it no longer floats over the panel but fills a line of its own, so its width is simply the container's width)
  • The yearly online count went from a 6-day average to each day's peak — a server that is only busy in the evening may average 2 players while a dozen were on at once; drawn as an average, a whole year flattens into a line that says nothing. 24 hours / 7 days / 30 days still use the average, where a point covers only tens of minutes and the average is what tells the story
v1.9.8 Website 2026-09-26

Chat: server start and stop now appear in the live chat

  • Server start and stop (with their times) now show as a line in the chat panel, using a small vertical bar instead of an avatar and a colour that sets them apart from player messages
  • Changelog text now supports code and bold markup (previously only backticks were handled, so bold showed its asterisks literally)
v1.9.7 Website 2026-09-25

Chat: browse by date, easier posting, real dialogs

  • Chat is now browsed by date: pick a day on the calendar to read that day's chat, with days that have messages shown in bold. Switching days no longer reloads the whole page.
  • Posting is easier: signing in is enough — linking a game character is no longer required. If you have one linked, your character name is used; otherwise your website nickname is, and the game marks it as [web · unlinked] so it stands apart from real characters.
  • Nicknames can only be changed once every 15 days (the very first one is free), and your profile shows how long is left. A nickname may not duplicate an existing game character or an admin, so nobody can rename themselves to impersonate someone.
  • Reporting now uses a proper dialog with a character-counted reason box instead of the browser's tiny built-in prompt; the retract confirmation and several admin confirmations were replaced too — native browser dialogs block the whole page.
  • The admin chat page marks unlinked senders; delete, report handling and mutes work as before.
v1.9.6 Website 2026-09-25

Web chat panel is live: two-way with in-game chat

  • New chat panel under the web map: public chat, joins and quits, deaths and advancements from the game show up on the site in real time, each with its send time
  • Two-way: messages you post in the web chat appear in game chat with a [网页] prefix; the name shown is the same everywhere (your linked character name), so nobody can impersonate anyone
  • Chat is invisible when signed out — not hidden in the UI, the server simply sends none of it; you can post only after signing in and linking a game character
  • Chat is grouped by server run, so you can switch back through previous runs and the history survives restarts
  • Every message carries an avatar and a timestamp; you can retract your own and report anyone else's
  • New admin "Chat" page: delete messages (takes effect on the site and in game at once), handle reports, mute accounts, and keep an audit trail (the original text is preserved on delete)
v1.9.5 Website 2026-09-25

Changelog can now be filtered by kind, month and version

  • The changelog is filterable now: the three counters at the top (website / mod / server) became clickable chips — click to show only that kind, click again to clear
  • Added month filtering and version search — typing "1.9" pulls up 1.9.0 through 1.9.4, and the two can be combined
  • Filter state lives in the URL, so you can copy the link and whoever opens it sees the same result
  • Counts stay at the full totals (they do not shrink when you filter), plus a new empty state for "no updates match these filters"
v1.9.4 Website 2026-09-25

Login fix, backup safety net, and API docs

  • Fixed being unable to get past the admin two-step verification. The root cause was a write transaction whose commit was silently skipped on the PHP version the server runs, so verification codes were never stored — the email arrived, but entering the code said "request a code first", and the resend throttle failed too (it reads that same table). Transactions are now tracked by the site itself, behaving the same on old and new PHP
  • Fixed three more latent cases of the same bug (player lookup, heartbeat metrics, session log); they only triggered under specific version combinations
  • Backup pruning now uses per-category quotas: pre-upgrade and pre-restore safety snapshots have their own quota and are no longer squeezed out by routine backups, and backups exported by hand are never deleted automatically. Simulated against the real live inventory: the old rule would have deleted 8 files (6 of them upgrade safety nets), the new rule deletes none
  • Fixed the public players API ignoring its search parameter: on servers with more than 500 players, anyone ranked below 500 by playtime could not be found in the data-card tool. Switched to substring matching and closed a wildcard-injection hole along the way
  • Oversized submissions no longer show a blank page; they return a clear "too large" message. Also fixed oversized forms being misreported as "please fill in XX"
  • The API contract document now covers all 5 public read-only endpoints (parameters and privacy masking), and a previously miscited reference was corrected
  • Fixed the "back to username/password" link on the admin login page leading to the wrong step
v1.9.3 Website 2026-09-23

Collapsible badge wall, chart explanations and a 24-hour trend fix

  • The achievement system grew from 28 badges to 98, sorted into 8 groups (survival / building / exploration / redstone / farming / combat / social / collecting) and each group shows how many you have out of its total; 35 of them map straight onto real in-game advancements, and the date shown is the moment the game actually granted it
  • Every axis of the five-dimension radar chart now explains itself: what it measures, how it is calculated and what counts as full, so you no longer have to guess from the shape; there is also a legend — the solid shape is you, the grey dashed line is the server average
  • Fixed the 24-hour trend chart not matching reality: the stored history kept the mod's raw player count (including the always-on bot) while the page showed the filtered number, so the two never agreed; heartbeats and the chart now use one and the same number, and hovering the line shows the time plus the player count
  • Charts can switch their time range now: 24 hours / 7 days / 30 days / 1 year, so one glance tells you how the server has been; the line breaks while the server is offline instead of drawing those days as zero players
  • The badge wall on player pages can be collapsed: earned badges are always shown (they are your record), the locked ones tuck away behind each group heading or the “show all” button at the bottom, and the choice is remembered so a refresh looks the same; with JavaScript off all 98 badges are still displayed
  • Fixed session records: the “online now” mark used to look only at whether a session had an end time, so a crash or a missed disconnect left it stuck on “online now” — even showing one person as online in two sessions at once. It now follows the roster the server reports live, unmatched sessions show “ended abnormally” and are closed automatically, and a repeated disconnect report no longer opens a second session
  • Fixed the in-game advancement badges never lighting up: the lookup key carried an extra prefix that did not match the advancement names the game reports, so all 35 real achievements stayed marked as locked — they merely looked grey, exactly like ones you had not earned yet, so nothing on the page gave it away. The keys now match, earned ones light up and show the actual day the game granted them
v1.9.2 Website 2026-09-22

Security and privacy hardening, uploads and polish

  • QQ sign-in is wired up: the AppID, AppKey and callback URL are configured, so it goes live as soon as Tencent approves the app and the switch is turned on in the admin panel; until then the login page hides the button, so there is no entry that does nothing when clicked
  • Security: the /storage/ directory can no longer be opened directly (database backups, skin caches and other files that should not be public live there)
  • Plaintext admin passwords left in the database are gone; only the encrypted digest remains
  • The claim confirmation endpoint now limits failures: repeated wrong short codes are blocked for a while, so nobody can brute-force them
  • Player filters, SVG checks and field validation now use allow-lists and bound parameters: only explicitly allowed values get through, and outside input is no longer spliced into queries
  • All 74 JSON outputs across the site now carry the safe-escaping flags, so data embedded into pages can no longer be parsed as markup
  • Privacy: the profile visibility switches still had 5 places where they could be read around (including the public player API that needs no key); all of them are closed now — switched off really means off, even through the public API
  • WebP uploads: avatars, banners, the image library, the forum and more — 8 entry points in total accept WebP directly
  • Fixed the admin setting where the allowed-format list got corrupted into the string "array": that was the root cause of upload formats silently falling back, and saving it no longer breaks
  • Playtime is shown in hours everywhere (hours as the main figure, days as a small subtitle); the leaderboard now shows exactly the column you sorted by
  • Old-browser fallbacks: the activity heatmap, growth bars and the upload area tint / focus ring no longer turn transparent in browsers without color-mix()
  • The public player page shows a level badge (Lv.N) next to the name, and it does not overflow on narrow phones
  • Brand images: the logo and icons that a test upload had overwritten are restored, and brand assets now have an offline archive plus a brand-restore.php tool, so a future overwrite can be rolled back right away
v1.9.0 Website 2026-09-19

Player hub and a rebuilt image upload

  • Your profile page got a rework: progress, this week's activity, achievement badges, your community footprint and the recent activity timeline now sit on one page
  • New game level: it comes from your total playtime, one level per 10 hours played and starting at Lv.1, and it shows on your profile page and on the public player page
  • New visibility switches: total playtime, last seen, first joined and the online player list are yours to make public or not, and once switched off they cannot be found on the other pages either
  • Avatars and banners now take an image upload directly and are stored as WebP (smaller files, faster loading); avatars are cropped to a square from the centre and banners are scaled down to fit within 1920×1080
  • Images can be PNG / JPG / WebP / GIF; AVIF gets a hint to save it as PNG or WebP first
  • New media library: uploaded images are managed in one place in the admin panel, with dimensions, file weight and where each image is used
  • Upload security tightened: the type is decided by the real file content, so renaming the extension to fake it is always rejected; attempts to escape the upload folder are blocked, SVG only passes from an approved list, and unreferenced orphan files get cleaned up
  • Claiming a game character now works as apply on the site, then run /cdr claim with the short code in game, and only that character itself can confirm
  • The profile page gained a 3D skin preview; the Seed Map and the Live Map now both load over HTTPS
v1.9.1 Website 2026-09-19

Permission table rebuilt around the mods we actually run

  • The permission checklist was rebuilt around the mods actually installed here: only entries with a real permission node are left, and ticking one really takes effect
  • Abilities that need a mod we do not run (land claims, /hat, /back, chat colours and so on) are gone from the checklist; a section below says honestly what is missing and which node to fill in later
  • Every permission now spells out what it actually lets you do in game, so Spectator mode for example never unlocks Creative mode as a side effect
  • Creative mode is its own entry: only the owner and the staff group save it without a second confirmation, any other group gets a confirmation dialog first. Site accounts for the owner and the staff group can now sign in to the admin panel directly
v1.8.2 Website 2026-09-18

CloudRidge Blue, and sign-in that holds up

  • The site palette is now "CloudRidge Blue": the colours are taken straight from the server logo, so the site and the logo never clash
  • Fixed the human check failing for absolutely everyone in production (behind the reverse proxy the real IP was unavailable and rate limiting treated every visitor as one person)
  • When the check has passed but the page does not navigate, the submit button no longer stays stuck; it recovers after 8 seconds
  • The home page buttons no longer overflow the screen on phones
v1.8.1 Website 2026-09-18

Human check upgraded

  • The human check moved to ALTCHA 2.x with an image captcha as a fallback, so if your browser cannot compute a solution you can just type the characters
  • Registration, whitelist applications and code resends are now behind the human check too, which blocks using someone else's email to burn our quota
  • The home page has a one-click "join our QQ group" button that opens QQ on both desktop and mobile
  • Site icons now cover every size, so "add to home screen" on a phone gets a proper icon
v1.8.0 Website 2026-09-18

Achievements, remembered devices and a new look

  • Player pages gained achievement badges and an ability radar, so you can see at a glance what someone is good at
  • New "remember this device": tick it and you stay signed in for 30 days (a password change or signing out everywhere cancels it instantly)
  • Admin sign-in now has a second step with an emailed code, plus an offline recovery key for when email cannot reach you
  • The whitelist page now shows different content depending on your status: pending, approved, or the reason you were rejected plus a resubmit form
  • The whole site moved to the green-and-ink palette taken from the server logo, with serif headings, for a calmer, more spacious feel
  • Forum category icons no longer use emoji (they showed as empty boxes on some systems) and now use our own icons
v1.7.0 Website 2026-09-18

Guide search and live facts

  • The server guide is searchable by title or body text
  • A live server panel in the guide sidebar shows version, loader and mod version without leaving the page
  • The command list and mod list have their own addresses, which makes them easy to share with new players
  • On phones the guide sidebar moves above the text and the live panel no longer eats a whole screen
v1.6.0 Website 2026-09-18

Skin site sync

  • Skin site sync: register on the skin site under the same name, upload your skin there, and the website can pull it over automatically
  • The first time a player page meets an unknown name it looks the name up on the skin site and displays the result
  • A "re-sync skin" button in your profile updates it in one click after you change your skin there
  • The skin site address is configurable in the admin panel (LittleSkin by default), so switching sites needs no code change
v1.4.0 Website 2026-09-18

Account and security

  • Your profile was rebuilt with "Account & security" and "Personalisation" sections: sign-in history, rebinding and password changes live there
  • "Sign out everywhere" is supported: after a password change or a sign-out elsewhere, other devices are logged out immediately
  • Verification codes are now device-locked: at most 5 per device per day, which stops scripts from burning SMS and email quota
  • If your email or phone is not verified yet, a banner reminds you once; only then can you apply for the whitelist, post or link a character
  • Your profile shows a summary of your footprint across all servers
v1.5.0 Website 2026-09-18

Repackaged release

  • Identical to v1.4.0, only repackaged for release; nothing changed
v1.3.8 Website 2026-09-17

Sign-in options documented

  • The password sign-in page now lists all three account types (email, phone, linked game name), matching what actually works
  • Translations brought up to date
v1.3.7 Website 2026-09-17

Background images for the sign-in pages

  • Login, registration and password recovery pages accept a custom background image (uploaded from the admin panel), with frosted-glass cards
  • The appearance section can upload the home hero image, the site logo, the browser icon and the sign-in background
  • Besides email and phone, you can sign in with a game name you have already linked
v1.3.6 Website 2026-09-17

SMS key check restored

  • The key check is back, but only warns in the case that really is wrong: a 32-character hex string, which is an MD5 hash and not the plaintext KEY
  • The warning now says exactly where to copy the KEY again, instead of leaving you with "invalid key"
v1.3.5 Website 2026-09-17

SMS key hint corrected

  • Removed a false alarm about SMS key length (it demanded 32 characters, but the platform's real key is 16)
  • Whether the key is correct is now answered by the SMS platform itself instead of being guessed from its length
v1.3.4 Website 2026-09-17

Sign-in fixed and hardened

  • Fixed email and phone password sign-in failing every time (it used to return a 500)
  • Too many failed attempts now leads to a temporary lock, which stops scripted password guessing
  • When the current page belongs to a navigation group, the group button is highlighted too, so you can see where you are
  • A divider on the sign-in page separates QQ login from email login, so they are no longer easy to confuse
v1.3.3 Website 2026-09-16

SMS settings self-check

  • New zero-cost self-check for SMS: verify the username, key and template without sending a single message
  • It says plainly whether the account and key are wrong or the template is still awaiting approval, so there is no guessing
  • A scheduled task rechecks the SMS template status and reminds you to enable it once approved
v1.3.2 Website 2026-09-16

Multiple servers supported

  • Multiple servers: each one has a type (survival, creative, minigame) and the site shows different content per type
  • Creative servers show a building panel, minigame servers show match info and a PvP ranking
  • Whitelist and ban changes are confirmed per server, so nothing silently goes unsynced
  • The admin panel can send a change to one specific server only
v1.3.1 Website 2026-09-16

Admin audit log and message centre

  • New audit log in the admin panel: who changed what, and when, is all searchable instead of digging through the database
  • New message centre: mail and SMS delivery records, so "I never got the code" can be checked directly
  • New bulk whitelist tools: add, remove or prune stale entries in one go
  • Fixed user group permissions never matching, so group permission settings now actually apply
  • The dashboard gained a 14-day trend chart: new users, whitelist applications, visits and new players
v1.3.0 Website 2026-09-16

Player skins and grouped navigation

  • Player skins: upload a 64×64 skin and your profile and player page render it as a 3D model (no external library loaded)
  • A new "My skin" section in your profile, where you can upload or remove it at any time
  • The header navigation is now grouped into dropdowns (Servers, Community) and no longer wraps onto two lines on phones
  • Fixed placeholders like [[mods]] and [[server-facts]] showing up as raw brackets on some guide pages
  • The footer now carries the ICP filing number and the police filing icon
v1.2.3 Website 2026-09-13

SMS channel and a batch of fixes

  • SMS verification codes are connected, so phone registration and password recovery work (just fill in the platform settings in the admin panel)
  • Fixed "changed a setting in the admin panel but the site ignores it": mail, SMS, bot and whitelist settings now all take effect
  • Fixed the node detail page on the status page returning a 500; unknown nodes now show a normal message
  • Fixed ban reasons showing as the English "Banned by an operator."; they are now displayed in Chinese
  • Clicking the whitelist application while signed out now asks you to sign in first and returns you there afterwards
v1.2.2 Website 2026-09-13

Accounts and online whitelist applications

  • Account system: register with an email or phone verification code, sign in with a password, and reset a forgotten password
  • Online whitelist applications: fill in your game ID and one contact method, and approval syncs straight into the server
  • If you gave a QQ number, joined the group and your QQ level is high enough, the bot approves you automatically
  • The owner and staff approve applications, add or remove whitelist entries and edit the server config from the floating ball in the corner
  • New one-click "publish update post" in the admin panel, so every future update is recorded automatically
v1.2.1 Website 2026-09-13

Tools and a rebuilt status page

  • New tools page: gradient text generator, server status lookup, server address checkup, tick converter and player lookup
  • The status page was rebuilt with 24-hour uptime, a service list and machine health, and each node opens a detail view
  • One account can link several game characters and pick a main one (also switchable in game with /cdr main)
  • The build gallery now uses a large-photo view, which is much nicer for browsing
  • The command list and mod list in the guide now follow the server automatically, so nobody has to copy them by hand
v1.2.0 Website 2026-09-13

Player data since day one

  • Server save statistics are in: playtime, deaths, kills, blocks mined and placed, and distance travelled since the server opened
  • The player list can be ranked by total playtime, and each entry opens a detailed page
  • AFK dummies and bots are detected and excluded, so they no longer take up ranking spots
  • The ban list gained a banned-IP section showing where each address comes from
  • Fixed MSPT not showing up; TPS and MSPT now each have their own scale
v1.1.1 Website 2026-09-13

Avatar fallback and a new admin panel

  • Fixed screens full of broken images when avatars fail to load: if the third-party avatar is unreachable we draw one from the player's initial
  • New admin layout: top bar plus a searchable sidebar menu, so you can find any setting by typing a keyword
  • Fixed the human check crashing and pages failing to open on some servers
  • Fixed the trap where the mod's API address was redirected, so the API looked fine but no data ever arrived; the admin self-check now says so outright
  • The live map now shows a clear message when it cannot connect instead of a blank frame
v1.1.0 Website 2026-09-13

Accounts and the build gallery

  • New build gallery: upload screenshots of what you have built, and others can like them or open the full-size view
  • New player list and player pages: playtime, deaths, blocks mined and distance travelled at a glance
  • Admin panel arrives: news, pages, gallery, users and settings are all editable in the browser
  • Multiple languages and colour schemes, and you can switch between light and dark yourself
  • Ban records are public, including how each case was handled
v1.0.0 Website 2026-09-12

The website goes live

  • The site opens to everyone: home page, server status, player guide, ban list, news and forum
  • The home page shows live player count, TPS and machine load, reported by the server mod every 30 seconds
  • One-click QQ login; once signed in you can link your game character and post on the forum
  • No external CDN anywhere, and the human check is hosted on our own server, so it loads fast at home
  • Works on both phones and desktops; the navigation collapses itself on narrow screens

Dates are the release date of each version. Found a new problem? Tell us on the forum or contact the server owner.