Public Bug Tracker

Give players a read-only view of known bugs and their status at /tracker/your-project-slug. Players can browse, search, and upvote bugs without an account, which keeps your community informed and cuts down on duplicate reports.

⚠️

Bugs are public by default. Once the tracker or roadmap is enabled, every bug that isn’t marked private can appear on it — including reports filed automatically by the SDK, with their full descriptions. Mark sensitive bugs private from the bug detail view (or PATCH them with {"is_private": true}) before you turn the tracker on.

What players see

  • All non-private, non-deleted bugs, 25 per page, most-upvoted first
  • Each bug’s title, status, priority, category, upvotes and dates, and on its own page the description and your public comments (internal comments are never shown)
  • Status and category filters, and search if enabled

Configuration Options

  • Enabled — The tracker returns 404 until you enable it
  • Search — Allow players to search (allow_search)
  • Upvoting — Allow players to upvote (allow_upvotes)
  • Show categories / priority / status filter — show_categories, show_priority, show_status_filter
  • Page title and description, logo, accent color and custom CSS

Configure the tracker from the Public Bug Tracker card on the Public Roadmap page in the dashboard, or through the API below. Players cannot file new reports from the tracker — reports come from your game through the SDK.

API

HTTP
# Get / update tracker settings (session token)
GET /api/projects/:slug/tracker-settings
PUT /api/projects/:slug/tracker-settings

# Public bug list and detail (no auth)
GET /api/tracker/:slug?status=open&category=crash&q=inventory&page=1
GET /api/tracker/:slug/bugs/:number

# Upvote (no auth; optional {"player_id": "..."} body)
POST /api/tracker/:slug/bugs/:number/vote

Example body for PUT /api/projects/:slug/tracker-settings:

JSON
{
  "enabled": true,
  "page_title": "Known Issues",
  "allow_search": true,
  "allow_upvotes": true,
  "show_categories": true,
  "show_status_filter": true
}

Public Roadmap & Changelog

Each project gets one public page with two views: the roadmap (your non-private bugs grouped by status, which players can upvote) and the changelog (your published patch notes). Show either view or both; with both on, the page shows Roadmap and Changelog tabs.

  • /roadmap/your-project-slug — your public link. It opens on the view you choose as the default.
  • /roadmap/your-project-slug?view=roadmap or ?view=changelog — open a specific view.
  • /changelog/your-project-slug — opens straight on the changelog view.

A view that is switched off never loads: its link falls back to the default view, and the API returns no bugs for a page whose roadmap view is off.

Setup

  1. Open Public Roadmap in the dashboard sidebar and pick a project
  2. Turn the public page on
  3. Under Public Page, choose the views to show (Roadmap, Changelog or both) and which one your link opens on
  4. Set your brand profile, then use Save & View to open the public page

Display Options

  • Layout — Board (columns per status) or List
  • Statuses shown — Any of open, in progress, resolved and closed (open and in progress if none are chosen)
  • Sort order — By priority (default), newest, or most upvoted
  • Upvotes — Show vote totals and let players vote
  • Bug counts, categories and priority — Show or hide each
  • Page title, description and header alignment — Shared by both views

Logo, colors, custom CSS and the “Powered by Bugnet” badge come from the brand profile at the top of the same page.

API

HTTP
# Get / update roadmap settings (session token)
GET /api/projects/:slug/roadmap-settings
PUT /api/projects/:slug/roadmap-settings

# Public page: settings, roadmap bugs and changelog entries (no auth)
GET /api/roadmap/:slug

# Upvote (no auth; requires show_upvotes)
POST /api/roadmap/:slug/bugs/:number/vote

Example body for PUT /api/projects/:slug/roadmap-settings:

JSON
{
  "enabled": true,
  "show_roadmap": true,
  "show_changelog": true,
  "default_view": "changelog",
  "layout_mode": "board",
  "sort_order": "upvotes",
  "show_open": true,
  "show_in_progress": true,
  "show_resolved": true,
  "show_upvotes": true,
  "show_bug_count": true
}

At least one of show_roadmap and show_changelog stays on (turning both off keeps the roadmap), and default_view is moved to a view that is shown. Fields you leave out of a save keep their current value for these three.

Changelogs

Tell players what changed in each update. Published entries appear in the changelog view of your public page (also at /changelog/your-project-slug) once that view is turned on.

Creating Entries

Manage entries on the Changelog tab of the Public Roadmap page in the dashboard, or through the API below.

  • Manual — Write an entry with a title, optional version, and a Markdown body (headings, lists, bold and code)
  • Auto-generate — Draft an entry listing the bugs resolved in the last N days (7 by default), then edit it before publishing

Each entry has a title, version, body, author, and a published date once it’s published.

Publishing

  • Entries are drafts until you publish them
  • Published entries appear on the public changelog, newest first (the 50 most recent), while the page’s changelog view is on
  • Unpublishing an entry returns it to draft

API

HTTP
# Published entries (public, no auth; 404 unless the changelog view is on)
GET /api/projects/:slug/changelog

# All entries including drafts (session token)
GET /api/projects/:slug/changelog/all

# Create, update, delete
POST   /api/projects/:slug/changelog
PATCH  /api/projects/:slug/changelog/:entryId
DELETE /api/projects/:slug/changelog/:entryId

# Draft an entry from recently resolved bugs
POST /api/projects/:slug/changelog/auto-generate
{"version": "1.2.0", "days_back": 14}

Example body for creating an entry (set publish to publish immediately; send {"publish": false} in a PATCH to unpublish):

JSON
{
  "title": "v1.2.0 - Bug Fixes",
  "version": "1.2.0",
  "body": "Fixed crash on level 5...",
  "publish": false
}

Branding Settings

Each project can store a brand profile — company name, logo, colors, support email, custom CSS and a “hide Bugnet badge” flag — — that the hosted tracker, roadmap and changelog pages all use. Edit it from the Brand Profile card at the top of the Public Roadmap page in the dashboard, or through the API below. It is also served from a public endpoint, so you can theme pages you build yourself on top of the public API.

How the Hosted Pages Use It

  • Accent color and logo — used on every public page. (The tracker’s own accent color and logo, and any set on the roadmap through the API, still win when set.)
  • Background and text colors — applied to the light theme. Pages keep their dark theme for players who choose it, so text stays readable.
  • Custom CSS — brand CSS is added first and a page’s own custom CSS after it, so page-level CSS overrides the brand.
  • Company name and support email — shown in the page footer, with the email as a mailto: link.
  • Bugnet badge — the “Powered by Bugnet” footer badge is hidden when hide_bugnet_badge is on.
ℹ️

The in-game widget is themed separately in the Widget Builder (see In-Game Widget).

Available Settings

  • Company name (company_name) and support email (support_email)
  • Logo (logo_url) — paste an image URL or upload one. Uploads (PNG, JPEG, GIF or WebP, up to 2 MB) are stored by Bugnet and served from /api/files/….
  • Accent, background and text colors (accent_color, background_color, text_color)
  • Custom CSS (custom_css)
  • Hide Bugnet badge (hide_bugnet_badge) — Studio plan and up. Turning it on from the free plan returns 403, and the public endpoint always reports false for free projects.

Colors must be 6-digit hex values such as #2E5BFF, the support email must be a valid address, and the logo URL must start with http:// or https:// (or be an uploaded logo’s /api/files/ path); anything else returns 400.

API

HTTP
# Get / update branding (session token)
GET /api/projects/:slug/branding
PUT /api/projects/:slug/branding

# Upload a logo (multipart, field "file"); saves it as logo_url
POST /api/projects/:slug/branding/logo

# Public branding (no auth)
GET /api/branding/:slug

Example body for PUT /api/projects/:slug/branding:

JSON
{
  "company_name": "My Game Company",
  "accent_color": "#2E5BFF",
  "logo_url": "https://mygamecompany.com/logo.png",
  "support_email": "support@mygamecompany.com",
  "hide_bugnet_badge": true
}

Customizing with CSS

The Custom CSS box in your brand profile is added to your public roadmap, changelog and bug tracker after Bugnet’s own styles, so your rules override ours. It is plain CSS — no HTML or scripts. Every element you can target is listed below.

How to Write Rules

  1. Open your public page, right-click the thing you want to change and choose Inspect to see its class
  2. Find the class in the tables below and write a rule for it in Public Roadmap › Brand Profile › Custom CSS
  3. Save, then reload your public page
ℹ️

Tips. Change colors with the variables below rather than element by element — they reach every element that uses them. Your CSS loads after ours, so a selector as specific as ours wins; you rarely need !important. Use body[data-view="changelog"] to style only one view, and [data-theme="dark"] to style dark mode.

Theme Variables

Set these on :root (light theme) or [data-theme="dark"] (dark theme).

VariableControls
--accentButtons, active tabs, links, timeline dots, version badges (set from your brand accent color)
--accent-ltLight accent backgrounds (version badges, voted buttons)
--creamPage background (set from your brand background color)
--cream2Secondary backgrounds: tab bar, counters, inline code
--ink, --ink2, --ink3, --ink4Text, from strongest (titles) to faintest (muted labels); --ink is set from your brand text color
--borderCard, column and divider borders
--sage, --mustardResolved (green) and in-progress (amber) status colors
--radius, --radius-smCorner rounding of cards and columns (12px) and of small cards (8px)
--f-head, --f-bodyHeading and body font families

Page Layout (both views)

SelectorElement
body[data-view="roadmap"], body[data-view="changelog"]The page, with the view that is showing
.page-wrapperThe centered content column (960px wide)
.page-headerHeader block; carries .align-left, .align-center or .align-right
.page-logoYour logo image (64×64, rounded)
.page-logo-placeholderThe letter tile shown when there is no logo
.page-title, .page-descriptionPage title and the line under it
.view-tabs, .view-tab, .view-tab.activeRoadmap / Changelog switcher (only when both views are on); each tab also has data-view
#roadmapView, #changelogViewThe two view containers (also .roadmap-view, .changelog-view)
.page-footerFooter; .bn-brand-line holds your company name and support email, .bn-powered the Bugnet badge
.theme-toggleThe light/dark mode button (bottom right)

Roadmap View

SelectorElement
.roadmap-stats, .roadmap-statStatus totals row and each total box
.roadmap-stat-value, .roadmap-stat-labelThe number and its label in a total box
.roadmap-filters, .filter-btn, .filter-btn.activeCategory filter row and its buttons
.roadmap-boardThe board; .roadmap-board.layout-list in list layout
.roadmap-columnA status column; [data-status="open"], "in_progress", "resolved" or "closed"
.roadmap-column-header, .roadmap-column-title, .roadmap-column-countColumn heading, its title and its item count
.status-dot.open, .in_progress, .resolved, .closedColored dot beside each column title
.roadmap-column-body, .roadmap-empty-colColumn contents, and the “No items” message
.roadmap-cardA bug card; [data-category="..."] holds its category
.roadmap-card-title, .roadmap-card-metaCard title, and the row of badges under it
.roadmap-card-badge.critical, .high, .medium, .lowPriority badge
.roadmap-card-categoryCategory label
.roadmap-card-upvotes, .roadmap-card-upvotes.voted, .vote-countUpvote button, after this visitor voted, and its number

Changelog View

SelectorElement
.changelog-timelineThe list of entries (720px wide), with the vertical line drawn by ::before
.changelog-entryOne entry; its timeline dot is .changelog-entry::before
.changelog-entry-datePublished date above the card
.changelog-entry-cardThe entry’s card
.changelog-entry-header, .changelog-entry-titleTitle row and title
.changelog-version-badgeVersion pill (e.g. V1.2)
.changelog-entry-bodyEntry text; style h2, ul, li, strong and code inside it
.changelog-entry-author“By …” line
.changelog-emptyMessage shown when nothing is published yet

Examples

CSS
/* Brand fonts and a warm page background */
:root {
  --f-head: Georgia, serif;
  --cream: #FAF7F0;
}

/* Square logo and larger title */
.page-logo { border-radius: 4px; width: 80px; height: 80px; }
.page-title { font-size: 44px; }

/* Rounder cards on both views */
.roadmap-card, .changelog-entry-card { border-radius: 16px; }

/* Hide the status totals */
.roadmap-stats { display: none; }

/* Hide the closed column */
.roadmap-column[data-status="closed"] { display: none; }

/* Make the changelog wider, only on the changelog view */
body[data-view="changelog"] .changelog-timeline { max-width: 900px; }

/* Dark mode: a navy background */
[data-theme="dark"] body { background: #0A0F1E; }

The public bug tracker uses the same theme variables, so variable changes carry over to it; its elements use their own tracker- classes.