feat: initial Greasy Sprocket website — Astro static + Go feedback service

- Astro 5.x static site with content collections for extensions
- Pages: index, [slug] (per-extension), coffee (Ko-fi), feedback form
- Go binary gs-feedback: SQLite storage + Discord webhook notification
- Nginx config: static serving + POST proxy to Go backend
- Deploy script: build + rsync to VPS
- ThockBoard landing page with features and sound pack listing
This commit is contained in:
Jose Juan Moñino
2026-07-09 23:53:01 +02:00
commit c5958f283f
23 changed files with 4601 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
---
import Base from '../layouts/Base.astro';
const extSlug = Astro.url.searchParams.get('ext') || '';
---
<Base title="Feedback — Greasy Sprocket">
<section class="hero">
<div class="container">
<h1>Tell us why you left</h1>
<p>Your feedback helps us improve. No email required, no account needed.</p>
</div>
</section>
<section class="section">
<div class="container">
<div id="feedback-form" class="feedback-form">
<form id="uninstall-feedback">
<input type="hidden" name="ext" value={extSlug} />
<div class="form-group">
<label for="reason">Why did you uninstall? <span style="color:var(--text-muted)">(optional)</span></label>
<select name="reason" id="reason">
<option value="">Select a reason...</option>
<option value="not-needed">Didn't need it</option>
<option value="too-many">Too many extensions</option>
<option value="bugs">Bugs or issues</option>
<option value="alternative">Prefer an alternative</option>
<option value="other">Other</option>
</select>
</div>
<div class="form-group">
<label for="text">Anything else? <span style="color:var(--text-muted)">(optional)</span></label>
<textarea name="text" id="text" placeholder="Tell us more..." maxlength="500"></textarea>
</div>
<div class="form-actions">
<a href="/" class="btn btn-outline">No thanks</a>
<button type="submit" class="btn btn-primary">Send feedback</button>
</div>
</form>
</div>
<div id="feedback-success" class="form-success" hidden>
<h2>✅ Thanks for your feedback!</h2>
<p>We appreciate you taking the time. All our extensions are free — feel free to come back anytime.</p>
<a href="/" class="btn btn-outline" style="margin-top:24px">Back to home</a>
</div>
</div>
</section>
<script is:inline>
document.getElementById('uninstall-feedback').addEventListener('submit', async (e) => {
e.preventDefault();
const form = e.target;
const data = new FormData(form);
const payload = {
ext: data.get('ext') || '',
reason: data.get('reason') || '',
text: data.get('text') || '',
};
try {
await fetch('/feedback', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
} catch (err) {
// Silent fail — feedback is best-effort
}
document.getElementById('feedback-form').hidden = true;
document.getElementById('feedback-success').hidden = false;
});
</script>
</Base>