Skip to content

Commit fc78eb1

Browse files
shockalotticlaude
andcommitted
feat: gate "Report an issue" — search-first dialog + structured GitHub bug form
Reduce low-quality/duplicate issues two ways: - In-app: the sidebar "Report an issue" now opens a dialog asking the reporter to search existing issues first, framing the tracker as reproducible-bugs-only and pointing setup/how-to questions to Discussions. Two actions: Search existing / Report a bug. - GitHub: disable blank issues (blank_issues_enabled: false) so everything goes through a structured Bug report form with required fields (searched-checkbox, steps to reproduce, version, deployment) — low-effort reports bounce off — and contact_links route questions to the docs + Discussions, off the tracker. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 893ad0d commit fc78eb1

3 files changed

Lines changed: 112 additions & 5 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
name: 🐞 Bug report
2+
description: Report a reproducible bug in Calnode (not a setup question or feature request).
3+
labels: ["bug"]
4+
body:
5+
- type: markdown
6+
attributes:
7+
value: |
8+
**Before you start, please [search existing issues](https://github.com/Calnode/calnode/issues?q=is%3Aissue) —** it may already be reported or fixed.
9+
10+
This tracker is for **reproducible bugs in Calnode**. For setup help, deployment questions, or "how do I…", please use [Discussions](https://github.com/Calnode/calnode/discussions) instead — those won't be actioned here.
11+
- type: checkboxes
12+
id: prechecks
13+
attributes:
14+
label: Before submitting
15+
options:
16+
- label: I've searched existing issues and this isn't a duplicate.
17+
required: true
18+
- label: This is a reproducible bug in Calnode — not a configuration/setup question or a feature request.
19+
required: true
20+
- type: textarea
21+
id: what-happened
22+
attributes:
23+
label: What's the bug?
24+
description: What happened, and what did you expect to happen instead?
25+
validations:
26+
required: true
27+
- type: textarea
28+
id: steps
29+
attributes:
30+
label: Steps to reproduce
31+
description: Exact steps so a maintainer can reproduce it.
32+
placeholder: |
33+
1. Go to …
34+
2. Click …
35+
3. Observe …
36+
validations:
37+
required: true
38+
- type: input
39+
id: version
40+
attributes:
41+
label: Calnode version / commit
42+
description: Shown at /version, or the commit you deployed.
43+
validations:
44+
required: true
45+
- type: dropdown
46+
id: deployment
47+
attributes:
48+
label: How are you running Calnode?
49+
options:
50+
- Self-hosted — Docker
51+
- Self-hosted — binary
52+
- Railway / other PaaS
53+
- Not sure
54+
validations:
55+
required: true
56+
- type: textarea
57+
id: extra
58+
attributes:
59+
label: Logs, screenshots, or anything else
60+
description: Optional, but it speeds up a fix.

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# No blank issues — everything goes through the structured Bug report form (or the links below).
2+
# Keeps the tracker to real, reproducible bugs instead of setup questions and "how do I…" support.
3+
blank_issues_enabled: false
4+
contact_links:
5+
- name: 📖 Documentation & setup guide
6+
url: https://github.com/Calnode/calnode#readme
7+
about: Installation, configuration and how-to. Most questions are answered here — please check first.
8+
- name: 💬 Questions, setup help & ideas
9+
url: https://github.com/Calnode/calnode/discussions
10+
about: For "how do I…", deployment help, or feature ideas, use Discussions. The issue tracker is for confirmed bugs only.

frontend/src/routes/+layout.svelte

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@
77
import { currentUser } from '$lib/stores';
88
import { prefs, prefsFromUser } from '$lib/prefs';
99
import { Toaster } from '$lib/components/ui/sonner';
10+
import { buttonVariants } from '$lib/components/ui/button';
11+
import * as Dialog from '$lib/components/ui/dialog';
1012
import type { Snippet } from 'svelte';
1113
1214
let { children }: { children: Snippet } = $props();
1315
1416
let checking = $state(true);
17+
let reportOpen = $state(false);
18+
19+
const ISSUES_URL = 'https://github.com/Calnode/calnode/issues';
20+
const NEW_ISSUE_URL = 'https://github.com/Calnode/calnode/issues/new/choose';
1521
1622
const isLogin = $derived($page.route.id === '/login');
1723
const isPublicRoute = $derived(
@@ -181,17 +187,15 @@
181187

182188
<!-- Footer -->
183189
<div class="border-t border-sidebar-border p-2">
184-
<a
185-
href="https://github.com/Calnode/calnode/issues/new"
186-
target="_blank"
187-
rel="noopener noreferrer"
190+
<button
191+
onclick={() => (reportOpen = true)}
188192
class="flex w-full items-center gap-2.5 rounded-md px-2.5 py-1.5 text-xs font-medium text-sidebar-foreground/45 transition-colors hover:bg-sidebar-accent/60 hover:text-sidebar-foreground/70"
189193
>
190194
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="shrink-0">
191195
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/>
192196
</svg>
193197
Report an issue
194-
</a>
198+
</button>
195199
<button
196200
onclick={logout}
197201
class="flex w-full items-center gap-2.5 rounded-md px-2.5 py-2 text-sm font-medium text-sidebar-foreground/60 transition-colors hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground"
@@ -213,4 +217,37 @@
213217
</div>
214218
</main>
215219
</div>
220+
221+
<Dialog.Root bind:open={reportOpen}>
222+
<Dialog.Content class="max-w-md">
223+
<Dialog.Header>
224+
<Dialog.Title>Report an issue</Dialog.Title>
225+
<Dialog.Description>
226+
Please <strong>search the existing issues first</strong> — it may already be reported or being
227+
worked on. The tracker is for <strong>reproducible bugs</strong> in Calnode; for setup help or
228+
“how do I…” questions, please use Discussions instead.
229+
</Dialog.Description>
230+
</Dialog.Header>
231+
<Dialog.Footer class="gap-2 sm:justify-between">
232+
<a
233+
href={ISSUES_URL}
234+
target="_blank"
235+
rel="noopener noreferrer"
236+
onclick={() => (reportOpen = false)}
237+
class={buttonVariants({ variant: 'outline' })}
238+
>
239+
Search existing issues
240+
</a>
241+
<a
242+
href={NEW_ISSUE_URL}
243+
target="_blank"
244+
rel="noopener noreferrer"
245+
onclick={() => (reportOpen = false)}
246+
class={buttonVariants()}
247+
>
248+
Report a bug
249+
</a>
250+
</Dialog.Footer>
251+
</Dialog.Content>
252+
</Dialog.Root>
216253
{/if}

0 commit comments

Comments
 (0)