A minimal feedback/data-request form that stores submissions as GitHub Issues.
Fork this repo to create an isolated form for your app. Each fork gets its own issue tracker, its own credentials, and its own deployment — no shared infrastructure.
- Fork this repo (keep it private if submissions contain contact info)
- Edit
config.jsonwith your app's title, description, andgithub_repo - Create a fine-grained GitHub PAT with:
- Resource owner: your account or org
- Repository access: only this repo
- Permissions: Issues → Read and write
- Choose a deployment path below
Netlify connects to your GitHub repo, builds, and deploys automatically.
- Create a free account at netlify.com
- New site → Import from Git → select your fork
- Build settings: publish directory
., build command empty - Add environment variables in Site settings → Environment:
GITHUB_TOKEN— your fine-grained PATGITHUB_REPO—owner/repo
- Deploy
The /submit endpoint is rewritten to the Netlify function automatically via netlify.toml. The token never leaves Netlify's servers.
- Create a free account at cloudflare.com
- Workers & Pages → Create → Pages → Connect to Git → select your fork
- Build settings: output directory
. - Add environment variables in Pages → Settings → Environment variables:
GITHUB_TOKENGITHUB_REPO
- Deploy
The functions/submit.js file is auto-detected as a Pages Function.
Build and push the image:
docker build -t ghcr.io/owner/data-requests:latest .
docker push ghcr.io/owner/data-requests:latestCreate the secret:
kubectl create secret generic data-requests-secret \
--from-literal=github-token=ghp_... \
--from-literal=github-repo=owner/repoApply:
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/ingress.yaml # edit hostname firstResource footprint: ~64MB RAM, negligible CPU. A single pod handles this load easily.
For low-stakes forms where the token is intentionally exposed to the browser. Only appropriate when submissions are non-sensitive and the token is scoped to issues:write on one repo (worst case: someone spams your issue tracker).
- Enable GitHub Pages on your fork (Settings → Pages → Deploy from branch
main) - Copy
config.local.js.exampletoconfig.local.jsand fill in your token - Add to
index.htmlbeforeform.js:<script src="config.local.js"></script>
- Do not commit
config.local.js— it is gitignored
Note: config.local.js is never served in the other deployment modes because those
servers don't have the file on disk.
Edit config.json:
{
"title": "My App Feedback",
"subtitle": "Help us improve <a href='...'>My App</a>.",
"intro": "...",
"feedback_hint": "...",
"question_hint": "...",
"github_repo": "owner/repo",
"labels": ["feedback"]
}All text on the form comes from this file — no HTML editing needed.