{"id":51880611,"url":"https://github.com/srmdn/donation","last_synced_at":"2026-07-25T12:30:21.184Z","repository":{"id":369378673,"uuid":"1289062292","full_name":"srmdn/donation","owner":"srmdn","description":"Project-based donation app for solo builders with public progress timeline.","archived":false,"fork":false,"pushed_at":"2026-07-21T01:19:43.000Z","size":1948,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-21T03:18:12.851Z","etag":null,"topics":["creator-tools","donation","go","qris","self-hosted","sqlite"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/srmdn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-07-04T09:44:15.000Z","updated_at":"2026-07-21T01:19:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/srmdn/donation","commit_stats":null,"previous_names":["srmdn/donation"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/srmdn/donation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmdn%2Fdonation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmdn%2Fdonation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmdn%2Fdonation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmdn%2Fdonation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/srmdn","download_url":"https://codeload.github.com/srmdn/donation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmdn%2Fdonation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35879604,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-25T02:00:06.922Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["creator-tools","donation","go","qris","self-hosted","sqlite"],"created_at":"2026-07-25T12:30:20.000Z","updated_at":"2026-07-25T12:30:21.177Z","avatar_url":"https://github.com/srmdn.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Donation\n\nProject-based donation app for solo builders.\n\nVisitors can choose which project to support, see funding progress, and follow a public activity timeline. The current version is a server-rendered Go app with SQLite and a mock payment flow.\n\n## Current Scope\n\n- Single builder profile\n- Multiple projects\n- Public builder page with project cards and timeline\n- Project detail page with donation form\n- SQLite-backed seed data\n- Mock payment flow for local development\n- Pakasir QRIS integration for production payments\n\n## Stack\n\n- Go\n- SQLite\n- Server-rendered HTML templates\n- Plain CSS\n- Pakasir for QRIS payment integration\n\n## Development\n\nRun locally:\n\n```sh\ngo run ./cmd/donation\n```\n\nDefault SQLite path:\n\n```txt\ndata/donation.db\n```\n\nOverride with your own local bind address and database path:\n\n```sh\nADDR=127.0.0.1:\u003cyour-port\u003e DB_PATH=data/dev.db go run ./cmd/donation\n```\n\nFor Pakasir return links, set your own local base URL:\n\n```txt\nPUBLIC_BASE_URL=http://127.0.0.1:\u003cyour-port\u003e\n```\n\nEnvironment:\n\n```txt\nAPP_ENV=development\n```\n\nAdmin auth:\n\n```txt\nADMIN_EMAIL=you@example.com\nADMIN_SESSION_SECRET=change-me\nSMTP_HOST=\nSMTP_PORT=587\nSMTP_USERNAME=\nSMTP_PASSWORD=\nMAIL_FROM=\n```\n\nGenerate a session secret:\n\n```sh\npython3 -c \"import secrets; print(secrets.token_hex(32))\"\n```\n\nProduction startup guards:\n\n- `APP_ENV=production` refuses to start with `ADMIN_SESSION_SECRET` empty or `change-me`\n- `APP_ENV=production` refuses to start with `PAYMENT_MODE=mock`\n- `APP_ENV=production` refuses to start without SMTP configuration\n\nPakasir placeholders:\n\n```txt\nPAKASIR_BASE_URL=https://app.pakasir.com\nPAKASIR_API_KEY=\nPAKASIR_MERCHANT_SLUG=\nPAYMENT_RECONCILE_INTERVAL=5m\nPAYMENT_RECONCILE_LOOKBACK=48h\n```\n\nWhen `PAYMENT_MODE=pakasir`, successful webhooks are verified against Pakasir before local status changes. A background reconciler also checks recent pending payments every five minutes by default. Set `PAYMENT_RECONCILE_INTERVAL=0` to disable it.\n\n## Roadmap\n\n- Admin login\n- Project management\n- Public update publishing\n- Donation management\n- Pakasir QRIS payment integration\n\n## Payments\n\nThe current app uses a mock payment flow for local development.\n\nProduction payment flow is planned around Pakasir:\n\n- create QRIS transaction from donation form\n- store provider payment data locally\n- render `/pay/{donationId}` with hosted QRIS link and QR string fallback\n- receive payment webhook at `/api/webhooks/pakasir`\n- verify transaction status with Pakasir transaction detail API\n- mark donation as paid only after verification\n\n## Admin Login\n\nAdmin access now uses an email magic link.\n\n- `ADMIN_EMAIL` controls who can request the link\n- the sign-in token is one-time and expires after 15 minutes\n- if SMTP is not configured and `APP_ENV=development` with local `PUBLIC_BASE_URL`, the sign-in link is written to the app log\n- outside that development case, admin login fails closed unless SMTP is configured\n\n## Donation Amounts\n\n- Suggested quick amounts start at `Rp25.000`\n- Donors can enter a custom amount\n- Minimum amount is enforced at `Rp25.000`\n- Admin-recorded manual transfers may use any positive whole IDR amount\n\n## Manual Transfers\n\nAdmin donation management can record a new bank transfer or mark an existing pending payment as paid manually. Manual entries default to hidden, stay out of public totals and timelines, preserve any existing Pakasir order metadata, and can be made public after verification.\n\n## License\n\nLicensed under `AGPL-3.0-or-later`. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrmdn%2Fdonation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrmdn%2Fdonation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrmdn%2Fdonation/lists"}