[{"data":1,"prerenderedAt":20},["ShallowReactive",2],{"doc-errors":3},{"html":4,"headings":5},"\u003Cp>HelpBites can provision a separate Sentry-compatible project for each HelpBites\nproject in either \u003Ca href=\"https:\u002F\u002Fglitchtip.com\" target=\"_blank\" rel=\"noopener\">GlitchTip\u003C\u002Fa> or\n\u003Ca href=\"https:\u002F\u002Fwww.bugsink.com\" target=\"_blank\" rel=\"noopener\">Bugsink\u003C\u002Fa>. The \u003Cstrong>Errors\u003C\u002Fstrong> page lists a project's issues; click one to\nexpand its stack trace, event details, breadcrumbs and tags (from the latest event), and resolve\nor ignore it in the tracker. Errors don't create inbox conversations (earlier ones stay, and\nresolving one still resolves the issue).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Alerts.\u003C\u002Fstrong> The \u003Cstrong>Alerts\u003C\u002Fstrong> button sets rules that email the team (the addresses typed there,\nelse the project's notify emails): \u003Cem>a new error appears\u003C\u002Fem>, \u003Cem>an error totals N events\u003C\u002Fem>, or \u003Cem>an\nerror happens N times within M minutes\u003C\u002Fem>, each for all tracker projects or one, with a\ncooldown before the same error can alert again. Rules are checked once a minute by polling the\ntracker (first page of unresolved issues per tracker project), and immediately when a tracker's\nalert webhook calls. The first check of a tracker project only learns what exists, so a new rule\ndoesn't announce old errors as new. Rate windows count from when polling first saw the issue.\nNeeds Mailgun for the emails.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Fix with AI.\u003C\u002Fstrong> An expanded error has \u003Cstrong>Analyze and suggest a fix\u003C\u002Fstrong> (cause, fix, how to verify,\nimpact; needs an LLM endpoint, saved for 6 hours) and \u003Cstrong>Copy prompt for a coding agent\u003C\u002Fstrong> (the\nsame context, no AI call).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>File on board.\u003C\u002Fstrong> An expanded error has \u003Cstrong>File on board\u003C\u002Fstrong> (when the \u003Ca href=\"\u002Fdocs\u002Ffeedback\">project board\u003C\u002Fa> is on). It\nmakes a board item in the board's first status, titled from the issue, with the culprit, how many times it\nhappened and a link to the issue in the tracker in its internal description. The item remembers where it came\nfrom (\u003Ccode>errorRefs\u003C\u002Fcode>, shown in its drawer with an \u003Cem>Open in GlitchTip\u002FBugsink\u003C\u002Fem> link), and the error's row on the\nErrors page then shows the item instead of the button. Filing is idempotent: pressing it again, or filing from\nthe API, returns the same item. When the error already has a conversation in the inbox (earlier ones do), it is\nlinked to the item too, so both sides show each other. It never changes the issue in the tracker. It emits the\n\u003Ccode>errors.filed_on_board\u003C\u002Fcode> event (\u003Ca href=\"\u002Fdocs\u002Fevents\">EVENTS.md\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-cmnt\"># Is it filed? (item is null when not; boardEnabled says whether filing is possible)\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer ak_…\"\u003C\u002Fspan> \\\n  \u003Cspan class=\"shj-syn-str\">\"https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Ferrors\u002FISSUE_ID\u002Fboard?project=PROJECT_ID&#38;link=main\"\u003C\u002Fspan>\n\n\u003Cspan class=\"shj-syn-cmnt\"># File it (link: the tracker project's id from project.errorLinks, default the first)\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -X\u003C\u002Fspan> POST\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer ak_…\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Content-Type: application\u002Fjson\"\u003C\u002Fspan> \\\n  \u003Cspan class=\"shj-syn-str\">\"https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Ferrors\u002FISSUE_ID\u002Fboard\"\u003C\u002Fspan> \\\n \u003Cspan class=\"shj-syn-kwd\"> -d\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'{ \"project\": \"PROJECT_ID\", \"link\": \"main\" }'\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-cmnt\"># { \"item\": { \"id\": \"…\", \"number\": 14, \"title\": \"TypeError: x is undefined\", \"errorRefs\": [{ \"provider\": \"glitchtip\", \"issueId\": \"42\", \"linkId\": \"main\", \"title\": \"…\", \"url\": \"https:\u002F\u002F…\u002Fissues\u002F42\" }], … }, \"created\": true }\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>This is an operator action (an admin session or \u003Ccode>ak_\u003C\u002Fcode> key); there is nothing for a visitor's browser to embed.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Repo context.\u003C\u002Fstrong> If the project has \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Felrumo\u002Fhelp-bites-oss\u002Fblob\u002Fmain\u002Fdocs\u002FGITHUB.md\" target=\"_blank\" rel=\"noopener\">GitHub repos\u003C\u002Fa> connected, the analysis and the\nprompt also include the source of the files in the stack trace (up to 3 files, around\nthe failing line, read from each repo's default branch, so they can differ from\nthe release that failed). Only the event's in-app frames count, and a frame is\nused only if its path matches exactly one file across the project's repos. It is\nsent as untrusted data, like the event. No repos, or GitHub not set up: it is\nwritten from the event alone.\u003C\u002Fp>\n\u003Cp>Add your trackers once in \u003Cstrong>Settings → Error tracking\u003C\u002Fstrong>: a name, the URL and API\ntoken (plus the organisation slug for GlitchTip). Add as many servers as you\nlike, GlitchTip and Bugsink alike; every project in the workspace can use any\nof them. Then open Project → Install &amp; API (or Errors) → \u003Cstrong>Connect error tracking\u003C\u002Fstrong>,\npick a server from the list (or add a new one right there) and connect. No env\nvars or restart needed. Tokens are stored master-key-only in the workspace's\nsettings and never sent back to the browser. A project uses one server at a\ntime, and a server can't be removed while projects report to it.\u003C\u002Fp>\n\u003Cp>Where the edition shares one tracker with everyone (the community edition), a\nserver configured with the \u003Ccode>GLITCHTIP_*\u003C\u002Fcode> \u002F \u003Ccode>BUGSINK_*\u003C\u002Fcode> env vars below also\nshows up in the list, read-only. Projects connected before servers existed keep\nworking with the settings they had.\u003C\u002Fp>\n\u003Ch2 id=\"glitchtip\">GlitchTip\u003Ca class=\"heading-anchor\" href=\"#glitchtip\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Run Compose with the \u003Ccode>glitchtip\u003C\u002Fcode> profile, then create the first operator once:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">docker\u003C\u002Fspan> compose \u003Cspan class=\"shj-syn-kwd\">exec\u003C\u002Fspan> sb-glitchtip \u003Cspan class=\"shj-syn-oper\">.\u002Fmanage.py\u003C\u002Fspan> createsuperuser\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Log in to GlitchTip, create an organisation, then create a token at\n\u003Ccode>\u002Fprofile\u002Fauth-tokens\u003C\u002Fcode> with \u003Ccode>org:read\u003C\u002Fcode>, \u003Ccode>team:write\u003C\u002Fcode>, \u003Ccode>project:admin\u003C\u002Fcode>, and\n\u003Ccode>event:write\u003C\u002Fcode>. Enter the URL, token and organisation slug in Settings → Error\ntracking, or set \u003Ccode>GLITCHTIP_URL\u003C\u002Fcode>, \u003Ccode>GLITCHTIP_TOKEN\u003C\u002Fcode> and \u003Ccode>GLITCHTIP_ORG\u003C\u002Fcode>.\n\u003Ccode>GLITCHTIP_SECRET_KEY\u003C\u002Fcode> and \u003Ccode>GLITCHTIP_DB_PASSWORD\u003C\u002Fcode> configure the bundled\nservice itself. In Compose the app reaches it at \u003Ccode>http:\u002F\u002Fsb-glitchtip:8000\u003C\u002Fcode>, so\nenter that as the API URL. Attach\nyour public GlitchTip domain to port 8000 so customer SDKs can send events.\u003C\u002Fp>\n\u003Cp>Connecting creates the team, project, DSN, and alert webhook.\u003C\u002Fp>\n\u003Ch2 id=\"bugsink\">Bugsink\u003Ca class=\"heading-anchor\" href=\"#bugsink\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Bugsink 2.6 or newer is needed (its canonical API with issue actions). Alerts use\nits Slack kind. Run Compose with the \u003Ccode>bugsink\u003C\u002Fcode> profile, set\n\u003Ccode>BUGSINK_SECRET_KEY\u003C\u002Fcode> and \u003Ccode>BUGSINK_URL\u003C\u002Fcode> (the public URL; it becomes Bugsink's\n\u003Ccode>BASE_URL\u003C\u002Fcode> and appears in DSNs), then create the first user and a token:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">docker\u003C\u002Fspan> compose \u003Cspan class=\"shj-syn-kwd\">exec\u003C\u002Fspan> sb-bugsink bugsink-manage createsuperuser\n\u003Cspan class=\"shj-syn-func\">docker\u003C\u002Fspan> compose \u003Cspan class=\"shj-syn-kwd\">exec\u003C\u002Fspan> sb-bugsink bugsink-manage create_auth_token\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>A token from Bugsink's \u003Cstrong>Tokens\u003C\u002Fstrong> page works too if it has \u003Ccode>teams:read\u003C\u002Fcode>,\n\u003Ccode>teams:manage\u003C\u002Fcode>, \u003Ccode>projects:read\u003C\u002Fcode>, \u003Ccode>projects:manage\u003C\u002Fcode>, \u003Ccode>issues:read\u003C\u002Fcode>,\n\u003Ccode>issues:triage\u003C\u002Fcode> and \u003Ccode>events:read\u003C\u002Fcode>. Enter the URL and token in Settings → Error\ntracking (API URL \u003Ccode>http:\u002F\u002Fsb-bugsink:8000\u003C\u002Fcode> in Compose), or set \u003Ccode>BUGSINK_URL\u003C\u002Fcode> and\n\u003Ccode>BUGSINK_TOKEN\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Connecting creates the project and stores the DSN. For Bugsink the dialog lets you pick the team it's created under (default: \u003Ccode>BUGSINK_TEAM\u003C\u002Fcode>, else \u003Ccode>HelpBites\u003C\u002Fcode>, made if missing); Bugsink's API can't add members, so pick a team you belong to to see the project under Team Projects. Bugsink's API\ncan't add alert destinations, so the dialog then shows a webhook URL: in\nBugsink open \u003Cstrong>Projects\u003C\u002Fstrong> and the \u003Cstrong>Other Projects\u003C\u002Fstrong> tab (the API creates the\nteam and project without adding any user as a member, so they're not under\nMy Projects), click the alerts (megaphone) icon next to the project, click \u003Cstrong>Add\u003C\u002Fstrong>, set Kind to \u003Cstrong>Slack\u003C\u002Fstrong> and paste the URL as the\nWebhook url (older Bugsink has no Custom kind; HelpBites reads the Slack payload and still accepts Custom). The webhook is optional: it only makes alert rules run right away instead of within a minute. The same URL stays on the Install &amp; API and Errors pages. If Bugsink and\nHelpBites talk over a private network, set \u003Ccode>ALERTS_WEBHOOK_DENY_NON_GLOBAL=false\u003C\u002Fcode>\non Bugsink.\u003C\u002Fp>\n\u003Ch3 id=\"more-than-one-tracker-project\">More than one tracker project\u003Ca class=\"heading-anchor\" href=\"#more-than-one-tracker-project\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A HelpBites project can report to several tracker projects (a web app and an\nAPI, say). Run \u003Cstrong>Connect error tracking\u003C\u002Fstrong> again from the Errors or Install &amp; API page and\ngive a different \u003Cstrong>Project name\u003C\u002Fstrong>; a name that already exists in the team is\nreused. Each one has its own DSN, alert webhook URL and token. The Errors page\nshows one pill per tracker project (&quot;All&quot; merges each one's newest page;\npick a pill to page further), and \u003Ccode>GET \u002Fv1\u002Fadmin\u002Ferrors?link=\u003C\u002Fcode> takes the id from\n\u003Ccode>project.errorLinks\u003C\u002Fcode>. Status changes go back to the tracker project\nan issue came from.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Manage\u003C\u002Fstrong> (Errors page) lists each tracker project with its tracker, project name, team, DSN and alert webhook. You can change the name its pill shows or remove it; removing only stops HelpBites reporting there (the tracker project and past conversations stay), and the tracker, name and team are fixed, so to change them remove it and connect again. The alert webhook instructions sit in a collapsible on the same page.\u003C\u002Fp>\n\u003Cp>Bugsink can't search issues by Sentry user id, so a customer's recent errors\ndon't show in their conversation sidebar. Status and text filters on the Errors\npage apply to each page of 250 issues.\u003C\u002Fp>\n\u003Ch2 id=\"sdks\">SDKs\u003Ca class=\"heading-anchor\" href=\"#sdks\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Use any Sentry SDK with the DSN shown in Project → Install &amp; API. Always set the same\nstable identity value used in the HelpBites token's \u003Ccode>sub\u003C\u002Fcode> claim:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-js\">\u003Ccode>\u003Cspan class=\"shj-syn-class\">Sentry\u003C\u002Fspan>\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>\u003Cspan class=\"shj-syn-func\">init\u003C\u002Fspan>({ dsn\u003Cspan class=\"shj-syn-oper\">:\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'https:\u002F\u002Fpublic@errors.example\u002F42'\u003C\u002Fspan> })\n\u003Cspan class=\"shj-syn-class\">Sentry\u003C\u002Fspan>\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>\u003Cspan class=\"shj-syn-func\">setUser\u003C\u002Fspan>({ id\u003Cspan class=\"shj-syn-oper\">:\u003C\u002Fspan> user\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>id })\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>NUXT_PUBLIC_SENTRY_DSN\u003C\u002Fcode> enables HelpBites' own browser and server reporting.\nGlitchTip is MIT licensed and Bugsink is PolyForm Shield licensed; both run as\nseparate services next to HelpBites.\u003C\u002Fp>\n",[6,10,13,17],{"id":7,"text":8,"level":9},"glitchtip","GlitchTip",2,{"id":11,"text":12,"level":9},"bugsink","Bugsink",{"id":14,"text":15,"level":16},"more-than-one-tracker-project","More than one tracker project",3,{"id":18,"text":19,"level":9},"sdks","SDKs",1792677543076]