Skip to content
Contents

Changelog: apps

What changed on haruhime.moe and in each live tool (packs, pools, bb), release by release, newest first.

  1. bb0.1.0

    26 added, 10 changed, 1 fixed

    Added

    • API keys: make an hbb_ key on your account page and call /api/v1/me with it. The API docs page lists the endpoints. Keys and the /api/v1 guard come from @haruhimemoe/next-kit 0.5.0, shared with packs and pools.
    • Listed templates, guides and tag pages have their own link preview: the name with the kind and owner, or the guide's or tag's summary (<page>/og.png, drawn by @haruhimemoe/brand 0.6.0). Private, unlisted and hidden templates keep the site's image.
    • A long template title ends in "· bb" instead of "· bb.haruhime.moe", so search results show it whole (@haruhimemoe/next-kit 0.4.0). The 404 page is titled "Page not found".
    • The footer's tools column is now ui 0.6.0's shared "haruhime tools" column (packs, pools, All tools), the same on every haruhime.moe site.
    • /docs opens with what osu! BBCode is and ends with eight common questions (the 60,000 character limit, tags that show as text, flags, collab banners, gradients, drafts, sharing templates), also sent as FAQPage JSON-LD.
    • JSON-LD on every public page: the haruhime.moe Organization, WebSite with template search and WebApplication on the home page, TechArticle with its last update and breadcrumbs on each guide and tag page, CreativeWork on listed templates (never private, unlisted or hidden ones), ItemList on the gallery, and WebApplication and HowTo on the collab maker.
    • Guides and tag pages show when they were last updated.
    • The collab maker explains itself in three steps under the tool.
    • Every guide and tag page has a Markdown copy at its URL plus .md, and /llms-full.txt holds all of the docs. /llms.txt gains notes on how osu! BBCode and bb behave, template descriptions, and an Elsewhere section.
    • The footer links packs and pools; the tournament post guide points at pools and packs, and the userpage guide at the sections template.
    • The app: Next.js 16 on @haruhimemoe/next-kit and @haruhimemoe/ui, the bb brand (hue 265), osu! sign-in, security headers with a CSP that lets previews show images from any https host, robots, sitemap, /llms.txt and security.txt.
    • The editor: CodeMirror 6 with a BBCode language, tag autocomplete, lint marks with fixes and matching tags from @haruhimemoe/bbcode; a toolbar that wraps the selection (Ctrl or Cmd with B, I and U); source and preview side by side or in tabs on phones; the count against a userpage, forum post or beatmap description; copy with an over-limit warning; several named drafts in the browser (the single stage 1 draft moves in).
    • Color (with a contrast warning), gradient (with its character cost) and flag (small PNG by default, current SVG as an option) tools.
    • The collab maker at /collab: draw, move, resize and nudge [imagemap] regions over an image loaded from its own host, link them (or fill them from a player list), copy the result or open it in the editor, and import an existing imagemap.
    • The Players tool: 1 to 64 osu! names, ids or profile links become a flag and profile link per player (numbered, bullets or lines), through POST /api/osu/users (client credentials, a shared osu! call budget, answers kept a day in osu_users, 20 lookups a minute per IP).
    • The Pool tool: a pools.haruhime.moe built pool (public or unlisted) becomes a mappool section with stars under each bucket's mods, through GET /api/pools/<id> (POOLS_URL, maps and ratings kept a week in osu_beatmaps, 20 imports a minute per IP).
    • Docs at /docs: a page per tag from @haruhimemoe/bbcode's TAGS with an editable example, and seven guides, all in the sitemap and /llms.txt.
    • Previews, counts and template fills come from @haruhimemoe/bbcode.
    • Templates: BBCode with {{key}} fields (text, multi-line, number, date, URL, player, players, country, color), a fill-in form and "Use in the editor", which opens the result as a new draft.
    • Six built-in templates: userpage (simple), userpage (sections), tournament forum post, tournament staff list, feature request or bug report, beatmap description.
    • The public gallery with search, kind filter, newest or most used, and pages.
    • Your templates at /me: create, edit (versioned, a stale edit is refused and reloaded), delete, visibility, fork. At most 100 per account and 30 writes a minute.
    • Reports: one per person per template; a public template with 3 reports is hidden until an admin clears it at /admin.
    • Account deletion with every template, confirmed by typing your username.
    • Privacy and terms pages.
    • The collab maker keeps its image and regions in your browser and brings them back on the next visit; "Clear" starts over.

    Changed

    • Legal pages and guides render through @haruhimemoe/ui 0.9.0's shared MDX components: links, headings (now with # anchors), tables and callouts all come from mdxComponents instead of bb's own a override, which is removed.
    • Titles say what each page is for: the home page is "osu! BBCode editor and templates", guides read like the questions they answer ("How to make an osu! userpage (me! page)"), tag pages are "osu! [tag] tag: syntax and examples". Every indexable page has a canonical URL, og:url and a 140 to 160 character description; tag and template descriptions are written from their data when the typed one is short.
    • A filtered, sorted or later gallery page is noindex, with /templates as its canonical URL.
    • The sitemap carries real last-modified dates for guides, tag pages, legal pages and templates, and robots.txt lists the AI crawlers explicitly (all still allowed).
    • Metadata, robots.txt, the sitemap, JSON-LD and llms.txt are built with @haruhimemoe/next-kit 0.3.0's /seo; depends on @haruhimemoe/ui 0.5.1.
    • The preview is laid out at the width osu! shows the post at (890px for a userpage, 750px for a forum post, 430px for a beatmap description, from @haruhimemoe/bbcode 0.2.2's OSU_WIDTHS, with osu!'s font size) and zoomed down to fit the pane, so lines and collab rows wrap where they do on osu! instead of breaking early in a narrow pane. "Fit to pane / Actual size" switches to osu!'s own size, scrolling sideways; the choice is remembered in the browser. The editor follows its target picker, a template's preview its kind; the gallery's card previews and the tools' samples are unchanged. Boxes are spaced as on osu!.
    • Depends on @haruhimemoe/bbcode 0.2.1: images in the preview stay inline, so collab rows written side by side no longer stack.
    • Depends on @haruhimemoe/bbcode 0.2.0 (tags nested past 100 levels render as text, linear-time parsing on hostile input) and @haruhimemoe/next-kit 0.2.1.
    • Sign in, sign out, the account menu and Delete my account come from @haruhimemoe/next-kit/auth-react 0.2.0 (createAuthComponents, osuAvatarSrc), and the character counter, the editor's tabs, the visibility selects and the report form from @haruhimemoe/ui 0.5.0 (CharCounter, Tabs, VisibilitySelect, ReportDisclosure), instead of bb's own copies. The report reason is now a multi-line field, and the header menu's avatar is a plain image.
    • osu! user lookups use @haruhimemoe/osu 0.4.0's getUsers and getUser on the shared client (its token, timeout and 401 retry) instead of bb's own token module; the budget and the osu_users cache are unchanged. A user osu! sends in a shape we can't read is left unchecked instead of "not found".

    Fixed

    • Accessibility: the gallery's clipped card previews are inert, so a link cut off inside one is neither read out nor reachable by Tab. Depends on @haruhimemoe/ui 0.7.0 (its accessibility release): one footer nav with headed columns, lighter accent links that clear 4.5:1 at bb's violet hue, a visible focus ring on fields.

    bb 0.1.0 in the bb changelog

  2. haruhime.moe0.3.0

    3 added, 1 changed

    Added

    • /changelog: every haruhimemoe repo's releases in one feed, newest first, read from each repo's CHANGELOG.md and refreshed about once a day. Filter links narrow it to the apps (/changelog/kind/apps), the packages (/changelog/kind/packages) or one repo. The newest five releases start open.
    • /changelog/<repo>: one repo's whole changelog (haruhime.moe, packs, pools, bb, each @haruhimemoe package and the Claude plugin), with what's on main but not released yet on top and an anchor per release (#v0-9-0).
    • Changelog in the footer's haruhime.moe column, after Libraries. /llms.txt lists every changelog page and /llms-full.txt carries each repo's three newest releases.

    Changed

    • A library's Changelog link (on /libraries and its docs page) opens its changelog page here instead of the file on GitHub.

    haruhime.moe 0.3.0 in the haruhime.moe changelog

  3. haruhime.moe0.2.0

    6 added, 41 changed, 3 fixed

    Added

    • /llms-full.txt: the brand page, every library's docs page and the three legal pages in one Markdown file, built with @haruhimemoe/next-kit 0.5.0's llmsFull.
    • /libraries: the eight @haruhimemoe packages (ui, next-kit, osu, hinai, pool, compliance, bbcode, brand), one card each with its description, install line, npm version and downloads over the last month, GitHub stars and latest release, and links to GitHub, npm and the changelog (and the showcase for ui). The numbers refresh about once a day.
    • /libraries/<name>: each package's README, rendered from its repo, under its version, license, an install line to copy and its links. When the README can't be fetched the page points at it on GitHub.
    • /terms and /privacy for this site: short, since the site has no accounts, cookies or analytics; each links the tools' own terms and privacy pages.
    • Libraries in the footer's haruhime.moe column, after Thanks, and Terms and Privacy under Legal. Each library card carries the repo's README banner.
    • The Evergreen Cup banner shows Evergreen Cup's Seattle skyline art: a looping video (still under reduced motion), its name and line, and one link to evergreencup.org. Wide on desktop, taller on phones.

    Changed

    • /ui shows @haruhimemoe/ui 0.8.0's Palette group: CommandPalette (one instance, mounted for the whole page; Ctrl K/Cmd K opens it from anywhere on /ui), CommandPaletteButton, openCommandPalette (a plain button, no ref) and siteCommands (built from this site's own pages and haruhimemoe/haruhime.moe for "Report a bug"), plus the calculator and ranking helpers evaluate, formatResult and fuzzyScore.
    • /libraries/<name> renders READMEs through @haruhimemoe/ui 0.9.0's shared MDX components: mdxComponents and its own remark plugin (@haruhimemoe/ui/remark) replace this site's hand-rolled pre/external-link overrides and rehype-slug. Headings get a visible # anchor link beside them (h2/h3 only, down from h1-h6), fenced code gets a copy button and Shiki syntax highlighting (shiki 4.5.0, @haruhimemoe/ui/shiki), and a GitHub-style > [!NOTE]/[!TIP]/[!WARNING] blockquote renders as a labelled role="note" Callout. The sanitize schema now allows the attributes the remark plugin writes (a code block's language-* class and fence data-meta, a callout blockquote's data-callout) instead of rehype-slug's ids. The site moves to @haruhimemoe/ui 0.9.0.
    • The homepage's lead no longer ends with the ppy sentence; the footer line and /disclaimer carry it.
    • Tool cards sit two to a row above phone width, with the icon, name and beta or coming-soon pill on one line and the tagline under it.
    • /ui leaves the footer: /libraries and the ui card link it, and it links its README at /libraries/ui.
    • /ui shows @haruhimemoe/ui 0.6.0's "haruhime tools" footer column (SiteFooter's tools prop, HARUHIME_TOOLS, haruhimeToolsColumn), which packs, pools and bb now use. This site's own footer keeps its Tools column, which already lists every tool (sheets as soon). next-kit moves to 0.4.0 and brand to 0.6.0.
    • Each live tool's homepage card has one sentence on what you do with it and a link to its main task: Make a pack, Make a pool, Make a collab banner.
    • sitemap.xml dates every page with the day its content last changed.
    • The homepage's structured data adds a WebSite with packs, pools and bb as its parts, and the organization lists the Discord server and the npm org alongside GitHub.
    • bb.haruhime.moe is live: its homepage card, header and footer links and /llms.txt line (with a link to bb's own /llms.txt).
    • /thanks thanks token for BoBERT and the okay to use its map embeddings for similar-map suggestions in pools.
    • /ui shows the @haruhimemoe/ui 0.5.0 components: Tabs (with tabId and tabPanelId), VisibilitySelect (as radios and as a select, with VISIBILITIES and VISIBILITY_TEXT), CharCounter on a live textarea, and ReportDisclosure. The site moves to ui 0.5.0.
    • /brand shows a README banner for every haruhimemoe repo (the site, .github, packs, pools, the packages and the Claude Code plugin), each linking its repo, with dark and light SVGs to download from /brand/repos/.
    • A Discord icon in the footer, before the GitHub one, linking the haruhime.moe server. /contact lists the server too, and /llms.txt links it under Elsewhere.
    • A README banner for @haruhimemoe/next-kit, the Next.js server kit, on /brand and in /brand/repos/.
    • bb, an osu! BBCode editor with templates, listed as coming soon on the homepage, in the header and footer, on /brand and in /llms.txt, with its icon from @haruhimemoe/brand.
    • README banners for bb.haruhime.moe and @haruhimemoe/bbcode, the BBCode parser and renderer, on /brand and in /brand/repos/.
    • /ui shows every component @haruhimemoe/ui 0.4.0 adds: Badge, Disclosure, TextLink and linkClasses, RadioGroup, InlineConfirm, AsyncButton, TypeToConfirm, Pagination's button mode, ChoiceChips, a Chip blocked with a reason, the table parts over the sample pool, StarRating, BeatmapStats, ModBadge, LinkTabs, HeaderMenu and cx, in new Text, Tables, osu! and Utilities groups.
    • Search titles name what each page is, as "keywords · haruhime.moe" (the homepage: "osu! tools for players, mappers and hosts · haruhime.moe"), and every page has its own 140-160 character description.
    • The homepage's heading is now "osu! tools for players, mappers and tournament hosts", with the hello and a line on what each tool does under it. The Evergreen Cup banner stays on top, without a heading of its own.
    • Metadata, robots.txt, sitemap.xml, /llms.txt and the structured data come from @haruhimemoe/next-kit 0.3.0's SEO helpers, shared with packs, pools and bb. @haruhimemoe/ui 0.5.1.
    • robots.txt names every AI crawler in its own allow group, so the allow-all stance is written down. Nothing is blocked.
    • /llms.txt opens with a note on what the site is and that it isn't affiliated with ppy, and lists sheets as coming soon in a note instead of a line under Tools.
    • haruhime.moe now describes itself as osu! tools for players, mappers and tournament hosts, not just tournament tools: the homepage title and hello, the site description, /brand, /llms.txt and the link preview's alt text.
    • @haruhimemoe/brand 0.5.0: haruhime's new tagline ("osu! tools for players, mappers and hosts") redraws the haruhime banners, the link preview and the haruhime.moe and .github repo banners.
    • The homepage's tool cards sit two across on small screens and four across on wide ones.
    • pools is listed as live, in beta: the homepage card (with a small "beta" label), the header and the footer link to https://pools.haruhime.moe, and /llms.txt says what pools does and links its own llms.txt.
    • /llms.txt says what packs does too.
    • /thanks thanks otdb for the okay to list pools from its mappool export, instead of for the packs pool archive.
    • /ui says packs and pools are built from @haruhimemoe/ui too.
    • /ui runs @haruhimemoe/ui 0.4.0. It shows DiscordIcon, and the titled card in the Card demo sets headingLevel, so its heading sits under the demo's.
    • Every page sends less JavaScript: the header's nav renders on the server and no longer brings tailwind-merge to the browser.
    • pools is described as what it now is, a mappool builder: a mod-lens map search, co-editors and a download through packs, with past tournament pools there for reference (/llms.txt).
    • Text links use the kit's TextLink look: underlined pink in running text, bold names that underline on hover in lists. Tool cards and thanks entries are the kit's Card, and a tool's "beta" or "coming soon" label is its Badge.
    • The header draws the wordmark inline from @haruhimemoe/ui instead of loading it as an image.
    • On phones, the Evergreen Cup banner puts its button under the text instead of squeezing the text into a narrow column.
    • Page titles and descriptions come from one list, so a page's meta description, its /llms.txt line and its footer label match.
    • /ui's length boxes read what packs and pools read: 2.5 and 2,5 mean two and a half minutes.
    • /contact and SECURITY.md point security reports to GitHub's private vulnerability reporting first, then email.
    • /.well-known/security.txt expires on a pinned date (September 1, 2027) instead of a year after the last deploy.
    • Pages send a tighter Content-Security-Policy: base-uri, object-src and form-action are 'none' too.

    Fixed

    • Accessibility: a coming-soon tool card dims only its icon, so its tagline keeps full contrast; /libraries card names are h2s under the page's h1; README code blocks on /libraries/<name> can be reached with the keyboard; the homepage's Tools section no longer doubles the footer's Tools landmark. The site moves to @haruhimemoe/ui 0.7.0 (its accessibility release: one footer nav with headed columns, lighter accent links, a visible focus ring on fields).
    • Links to /thanks, /brand, /ui, /contact and /disclaimer unfurl with the link preview image and the site name again (a page's own Open Graph data used to replace the site's).
    • /llms.txt calls the home page's Evergreen Cup section a banner, as the page does, instead of a card.

    haruhime.moe 0.2.0 in the haruhime.moe changelog

  4. packs0.1.0

    19 changed, 2 fixed, 3 security

    Changed

    • API keys and the /api/v1 guard come from @haruhimemoe/next-kit 0.5.0, shared with pools and bb. Every /api/me/api-key answer is Cache-Control: no-store, and a server error there is a JSON 500.
    • Guides, docs and legal pages render through @haruhimemoe/ui 0.9.0's shared MDX components: headings get a visible # anchor link, > [!NOTE]/[!TIP]/[!WARNING] blockquotes render as labelled callouts, and the API docs' code blocks are syntax-highlighted.
    • Depends on @haruhimemoe/ui 0.7.0, its accessibility release: one footer nav with headed columns, field errors read as polite status messages instead of alerts, a visible focus ring on fields, 24px slider thumbs and chips, and lighter accent links.
    • A public pack's link preview is its own card: the pack's name with its map count, star range and mods, drawn by @haruhimemoe/brand 0.6.0. Unlisted and private packs keep the site's image.
    • A long page title ends in "· packs" instead of "· packs.haruhime.moe", so search results show it whole (@haruhimemoe/next-kit 0.4.0).
    • The footer links haruhime's other tools, pools and bb, and all of them on haruhime.moe (@haruhimemoe/ui 0.6.0). The home page's "More haruhime tools" card stays, with a line on what each does.
    • A missing pack's 404 is titled "Pack not found · packs.haruhime.moe", and other 404s "Page not found".
    • A saved pack's page lists its maps (artist, title, difficulty, mapper, stars) in the page itself, so search engines, link previews and AI assistants see the maps instead of "Loading beatmap…". Your browser still refreshes them when the page opens.
    • Page titles, descriptions, canonical links, link previews, robots.txt, the sitemap, structured data and llms.txt now come from @haruhimemoe/next-kit/seo 0.3.0, shared by every haruhime.moe site. Every page has its own title and description and keeps the link preview image. A pack's page is titled "… map pack download" and its description leaves out the source link and ends with the map count, star range and mods.
    • The sitemap dates guides, docs and legal pages by when they last changed. robots.txt names each AI crawler, all still allowed.
    • Structured data: the home page describes packs as part of haruhime.moe, with a search box for public packs; guides and the API docs are articles with their update date; public pack pages and the public pack list describe their packs. ui moves to 0.5.1, which escapes >, & and line separators in structured data too.
    • New: /llms-full.txt, every guide and the API docs in one Markdown file. llms.txt links it, pools and bb.
    • The home page links pools and bb, haruhime's other osu! tools.
    • The Sign in with osu! and Sign out buttons come from @haruhimemoe/next-kit/auth-react 0.2.0 (createAuthComponents), shared with pools, and ui moves to 0.5.0. A sign-in error now shows as a bold rose line under the button instead of a notice box.
    • The site's server plumbing now comes from @haruhimemoe/next-kit, which pools.haruhime.moe shares. Where the two copies differed, packs takes pools' behavior:
      • A 503 without a code of its own answers unavailable, not internal_error. (packs' own 503s, from the cron and the pools service routes, keep not_configured.)
      • A request body that's too large or doesn't pass validation says "That request is too large." or "That request isn't valid." Pack saves still say "That pack is too large."
      • ?ids= on /api/osu/beatmaps is strict: an empty part (1,,2), spaces, hex (0x10) or exponents (1e3) get a 400.
      • Signing in from /signin?next=/signin goes to your packs instead of back to the sign-in page.
      • A removed admin loses access at their next request, not when the server restarts.
      • An osu! sign-in that fails comes back to the sign-in page with where you were going kept, so trying again lands there. If an account was half-deleted, signing in with the same osu! account relinks it.
      • The first start after this change adds indexes to the sign-in collections (one user per osu! id, one link per osu! account, sessions by token). Existing duplicates are logged and that index is skipped until they're merged.
    • Visitors together can use at most 30 of the 50 osu! API calls a minute; the other 20 stay for the daily stats job and the pools service, so a few busy visitors can't stall pack stats. A star rating osu! won't give (a map it doesn't have, or mods it won't rate) is remembered for an hour instead of being asked for again on every page view.
    • Starting a sign-in is limited to 10 a minute per IP address, counted across all server instances. Sign-in state rows from abandoned sign-ins now expire on their own.
    • The stat tiles on a pack's page count a forced DT or HT slot's length and BPM at that speed, as the saved stats behind the /packs filters already did.
    • HD on its own doesn't change a star rating, so a slot's HD rating is its rating without mods and the page no longer asks osu! for it.

    Fixed

    • Several saves sent at once can no longer take an account past 200 saved packs: the extra ones get the 409.
    • When pools.haruhime.moe publishes a pool and takes its pack down at the same moment, the publish makes the pack again instead of failing with a 500.

    Security

    • /.well-known/security.txt lists GitHub private vulnerability reporting as the first contact.
    • The Content-Security-Policy also blocks plugins (object-src 'none'), a <base> pointing elsewhere (base-uri 'self') and forms posting off-site (form-action 'self').
    • CI runs every GitHub Action from a pinned commit SHA.

    packs 0.1.0 in the packs changelog

  5. pools0.1.0

    44 added, 21 changed

    Added

    • API keys: make an hpl_ key on your account page and call /api/v1/me with it. The API docs page lists the endpoints. Keys and the /api/v1 guard come from @haruhimemoe/next-kit 0.5.0, shared with packs and bb.
    • "Similar to <map>" has a "Leaderboard maps only (ranked, approved, loved)" switch, on by default, so pattern matches (mostly graveyard maps) show poolable maps first. It says how many of the similar maps it left out, and turning it off is kept in the browser's URL state. GET /api/maps/<id>/similar?status=leaderboard applies it; the answer adds unranked and total.
    • Past pools and public built pools have their own link preview: the pool's name with its year, map count, star range and mods (/pools/<id>/og.png, drawn by @haruhimemoe/brand 0.6.0). Unlisted and private pools keep the site's image.
    • A long pool or map title ends in "· pools" instead of "· pools.haruhime.moe", so search results show it whole (@haruhimemoe/next-kit 0.4.0).
    • The footer's tools column is now ui 0.6.0's shared "haruhime tools" column (packs, bb, All tools), the same on every haruhime.moe site.
    • A "What pools is" paragraph and five questions on the home page, with the same questions as FAQPage structured data. Structured data on the home page (the haruhime.moe organization, the site with its search, the app), on past pool pages (a Dataset) and map pages, with breadcrumbs.
    • /search sends a real page before its script loads: the heading, what can be searched, common searches and the 20 latest past pools.
    • /llms-full.txt with every current past pool, every public built pool and the 500 most used maps; /llms.txt is now a short index that links it.
    • Map pages say in one line how often and how a map was played, and where last. The footer links the other haruhime.moe tools.
    • Find similar on every map in the map browser, each slot and candidate in the editor, and Your candidates: a "Similar to <map>" source with up to 20 maps that play alike and how similar each is, under the current mod lens and the slot's target star range, with the content rules applied and the pool's own maps left out. Pattern matches come from the embeddings BoBERT by token03 publishes (MIT, credited next to the results and on /credits); maps it doesn't cover get a difficulty match on stars, BPM, length, AR, OD and CS, labelled as such. GET /api/maps/<id>/similar answers it (rate limited and cached like search). scripts/similar/ precomputes the table offline.
    • Candidates per slot: up to 10 maps a slot is still considering besides its pick (100 per pool). Add them from the map browser with "Add as candidate" (choose the slot, or a new one); each slot's "N candidates" list shows their stars under the slot's mods, who added them, a note and votes ("2 of 3 editors", yours as a toggle), with Promote and Remove. A pick can be demoted ("Demote") to a candidate and its slot stays. Drag a candidate onto a pick to promote it, a pick onto a list to demote it, or a candidate to another slot of the same bucket. Undo covers them, and the activity log records every candidate change but votes. Only the owner and editors ever see candidates: the pool's page, the API for anyone else, exports, the pack on packs, targets, the summary and the content rules check go by picks alone.
    • "Your candidates" in the map browser: every candidate (and, if you like, every pick) from the pools you own or edit, newest first, filtered by slot and text, with stars under the current bucket's mods. Add or Add as candidate copies one into the pool you're editing, with its note.
    • Drag and drop in the editor: drag a map by its handle onto another row or slot, with a mouse or on a touch screen. The Up, Down and Move buttons stay for the keyboard.
    • An activity log for built pools: every change records who made it, when and what, and the editor shows the last 20 under Recent changes (owner and editors only). A pool keeps its last 200 entries for up to 180 days; deleting an account renames its entries to "deleted user".
    • Export on built pool pages and in the editor: copy beatmap IDs, copy !mp map and !mp mods lines per slot, and download a CSV with values under each slot's mods.
    • Undo in the editor (and Ctrl+Z / Cmd+Z outside text fields): takes back your own last changes in this session, up to 20 steps, by sending their inverse. No redo.
    • Map previews: covers and osu!'s preview clips (one at a time) in the map browser, the editor and built pool pages, loaded straight from osu!'s servers. The Content-Security-Policy now names the image and media hosts.
    • Notes on slots: a short note on each map (up to 280 characters), shown under it in the editor and on the pool's page.
    • Slot targets: how many maps each slot should hold and a star range under its mods, with placeholder rows, out-of-range badges and a list in the summary. /new offers Qualifiers, Group stage, Knockout and Finals templates that set the counts, and Find maps fills in the slot's star range.
    • Build a pool: anyone signs in with osu! and makes pools at /new, then edits them at /pools/<id>/edit: details, maps in slots (built-in and custom, with forced mods or freemod), moving without drag, pasted slot lines, IDs or links, and a summary with the content rules check. Every change saves at once, and a change someone else made first reloads the pool.
    • A map browser in the editor that searches osu! maps under a mod lens, with star rating, AR, OD, BPM and length under that mod, and adds a difficulty to the matching slot.
    • Pool slots show their values under the slot's mods, on past and built pools.
    • Co-editors, added by osu! username; who can see a pool (private, unlisted or public); deleting a pool or the whole account.
    • Unlisted and public built pools with maps get their own pack on packs.haruhime.moe, crediting the owner and editors and kept in step after each change. The editor shows the pack's state with "Update pack now", and the pool's page shows "Download on packs".
    • "Start from this pool" on past and built pool pages copies a pool's maps into a new private pool.
    • Search's pools tab lists past tournament pools, public pools built here, or both; public built pools are in the sitemap and llms.txt, and the home page lists them under Recently built.
    • Admins hide, unhide and delete built pools from /admin; a hidden pool's pack is unlisted on packs.
    • The home page, site description and llms.txt lead with building a pool; past pools stay as reference.
    • Past tournament pools from otdb's export, tournament hosts and community members, each with its tournament, round and year, its notes, who it came from (with the link they gave) and a link to open it in packs.
    • Admins add pools that hosts and community members send at /admin/pools/new: a packs link, a pack key, or slot lines and beatmap IDs. A pool whose maps match one we have joins it instead of making a copy.
    • Search every osu! map through the hinai mirror, by text, status, star rating, length and BPM, with explicit maps on request. Sets that can't be used in officially supported tournaments are left out and counted, sets to check first are marked, unranked maps carry a warning, and each difficulty says how many pools played it. The maps tab opens on all maps; Played in pools keeps the old search, and old links still open it.
    • Pool search by text, year, star rating, number of maps, badged and a contained map, sorted by year, name or size.
    • Search of maps played in pools by text, star rating, length, BPM, AR, OD, CS, what the map was played as, times used and last year used, sorted by use, last use, star rating, length or title.
    • Map pages with every pool that played the map.
    • A compliance check for pasted beatmap IDs, links, pools and pack keys, against the content rules for officially supported tournaments.
    • An admin area for listed osu! accounts: import reports, pool edits, badged tournaments, pack sync retries and a refresh of the public pages after an import.
    • Credits, disclaimer and privacy pages, a sitemap and llms.txt.
    • /data (where pools and map details come from, the content rules, corrections) and /submit (how to send a pool in the Discord server or by email).
    • A footer with pools, Data, About and Legal columns and the Discord server.
    • Recently added on the home page: the 8 pools added last.
    • Sign-in errors land on the sign-in page with a plain explanation, including "That osu! account isn't a pools admin."
    • POOLS_ALLOW_SHARED_DB_USER: set it to true to run on a database user that other apps share, like packs'. pools still needs readWrite on pools and logs a warning naming the other databases. Unset, pools keeps refusing any user that reaches another database.
    • A small "beta" tag beside the wordmark on every page while the site is built with NEXT_PUBLIC_POOLS_BETA=true. Pages stay indexable and titles don't change.
    • /llms.txt ends with an About section: the source on GitHub, GitHub private vulnerability reporting and security.txt.

    Changed

    • Depends on @haruhimemoe/ui 0.9.0: the legal pages' MDX elements (links, heading anchors, the table wrapper, GitHub-style callouts) now come from its shared mdxComponents and @haruhimemoe/ui/remark instead of a local override; src/mdx-components.tsx is a thin pass-through. The legal content has no fenced code, so no shiki highlighter is wired in.
    • /data's first two sections are headed "Pool data" and "Map data", as the footer links read; a section named "Pools" doubled the footer's pools column for screen readers.
    • Depends on @haruhimemoe/ui 0.7.0, its accessibility release: one footer nav with headed columns, field errors read as polite status messages instead of alerts, a visible focus ring on fields, 24px slider thumbs and chips, lighter accent links, and beatmap stats that read their full names ("Circle size") to screen readers.
    • "Leaderboard maps only" in "Similar to <map>" now shows the 20 closest maps that have a leaderboard instead of filtering the 20 closest of all maps, which were mostly graveyard (map 129891 kept 2 of 18). scripts/similar stores a second list per map (nl, sl: the top 20 among ranked, approved and loved maps, by BoBERT's status column), which ?status=leaderboard reads; rows imported before it existed still get the filter. The "left out" line shows only when the filter drops something. The import grows from about 80 MB to about 137 MB.
    • Titles, descriptions, canonicals, link previews, robots.txt and the sitemap now come from @haruhimemoe/next-kit/seo (0.3.0). The home page is titled "osu! tournament mappool builder", past pools " mappool", and every public page has its own canonical and og:url (every /search query string shares /search). robots.txt names each AI crawler and allows them all, as before.
    • Map pages used in only one pool are no longer indexed or in the sitemap (they stay reachable and followable). Superseded pools' pages aren't indexed. Missing pools and maps are titled "not found".
    • The site description is shorter (160 characters), and the legal pages have fuller descriptions.
    • Removing a pick from a slot that has candidates keeps the slot (with no pick) instead of closing the bucket up, and adding a map to such a slot makes it the pick. Moving a map within its bucket moves its slot's candidates with it; moving it to another bucket leaves them. A custom slot with candidates can't be removed.
    • Deleting an account also takes its votes and its name off the candidates of pools it edited.
    • @haruhimemoe/next-kit 0.2.1.
    • Adding an editor looks the osu! username up with @haruhimemoe/osu 0.4.0's getUser on the shared client, inside the same osu! budget, instead of pools' own token and request. @haruhimemoe/hinai is 0.3.1, on the same osu.
    • Sign in, sign out, the account menu and Delete my account now come from @haruhimemoe/next-kit/auth-react 0.2.0, and the pool's visibility picker from @haruhimemoe/ui 0.5.0 (VisibilitySelect), instead of pools' own copies. They look and work as before; the account page's delete button now goes home with a full page load, and the avatar in the header menu is a plain image.
    • The shared packages move to ui 0.4.0, osu 0.3.0, hinai 0.3.0, pool 0.2.0, compliance 0.1.1 and brand 0.4.0. Duration, star, BPM and stat text now comes from @haruhimemoe/osu/format (the same text as before). Past pools keep their slots in the order their source lists them.
    • The content filter, the mods that change a star rating, DT and HT speeds, and the packs service contract come from @haruhimemoe/pool 0.2.0, the same definitions packs uses. Tests check every pack input pools builds against that contract, the 500-character description limit included.
    • The server plumbing (JSON route helpers, the same-origin guard, rate limits and the osu! budget, env parsing, the MongoDB client and its indexes, osu! sign-in, the signed-in marker, useAccount and RestoreSignedIn, security.txt) comes from @haruhimemoe/next-kit 0.1.0, which packs uses too. Behavior stays the same, except that the privilege check at connect now runs after Mongoose is attached (a failed check still refuses the connect), the osu! budget retries once on a duplicate key like rate limits, and its failure log reads [osu-api] budget.
    • The chips, radios and confirmations come from @haruhimemoe/ui 0.4.0: ChoiceChips for the pool type and map status, RadioGroup for visibility and the new owner, TypeToConfirm for deleting a pool or your account and handing a pool over (after a delete the form stays gone while the page moves on, as before), and InlineConfirm for an admin deleting a built pool, which now puts focus on Cancel when it asks.
    • Tags, links, tab strips and tables use ui 0.4.0's Badge, TextLink, LinkTabs and table primitives. Links in running text are underlined at rest, and the Pools / Maps switch on /search is a row of pill tabs like the maps scope.
    • Star ratings on pool pages, the map browser, all-maps results and map pages are ui's StarRating pills (read as "5.23 stars"), slot labels are ModBadge pills colored by mod, and the map browser and map pages list CS, AR, OD, HP, BPM and length with BeatmapStats, which leaves out a value that isn't known instead of showing "?" or "–".
    • The admin buttons that run something (Refresh public pages, Retry pack cleanup, the two sync retries) are ui's AsyncButton, each with its own result (while one sync retry runs the other is off, as before, so two runs never send the same pools twice); the account menu is ui's HeaderMenu (it now also closes when focus leaves it); the map browser pages with ui's Pagination in button mode.
    • SECURITY.md and /.well-known/security.txt name GitHub private vulnerability reporting first, then the email.
    • Inside: no source file over about 250 lines, no import cycles, a doc comment on every export (with a test that keeps it so), GitHub Actions pinned to commit SHAs, and components that export only components.

    pools 0.1.0 in the pools changelog

  1. haruhime.moe0.1.0

    9 added

    Added

    • The home page: packs, pools and sheets as tool cards (pools and sheets marked "coming soon"), an Evergreen Cup banner at the top, and the site's Organization and Person structured data.
    • /thanks: the people and projects the tools lean on.
    • /brand: how to write the name, the logos and README banners to download (SVG, and the dark banner as PNG), the color swatches with their hex values, the palette JSON, each tool's icon and hue, and the type.
    • /ui: every @haruhimemoe/ui component rendered in its states, with working filter demos over a sample mappool.
    • /contact and /disclaimer (no ppy affiliation, the osu! API and hinai mirror terms, beatmap ownership, the as-is notice, and a note that AI coding tools helped build the site).
    • A header with the tools, and a footer with Tools, haruhime.moe and Legal columns, the trademark line and a GitHub link, all from @haruhimemoe/ui.
    • /llms.txt, /.well-known/security.txt (RFC 9116), /sitemap.xml and /robots.txt.
    • The favicon, Apple icon and link preview image, generated by @haruhimemoe/brand.
    • Security headers on every page: X-Content-Type-Options, Referrer-Policy, X-Frame-Options: DENY and frame-ancestors 'none'.

    haruhime.moe 0.1.0 in the haruhime.moe changelog