{"id":40748310,"url":"https://github.com/obartra/countdown","last_synced_at":"2026-01-21T15:38:04.693Z","repository":{"id":202691678,"uuid":"707904075","full_name":"obartra/countdown","owner":"obartra","description":"Countdown Timer","archived":false,"fork":false,"pushed_at":"2025-12-22T00:27:45.000Z","size":3799,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-23T00:41:08.607Z","etag":null,"topics":["countdown","countdown-application","countdown-clock","countdown-javascript","countdown-timer"],"latest_commit_sha":null,"homepage":"https://cronos.love","language":"TypeScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/obartra.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":null,"dco":null,"cla":null}},"created_at":"2023-10-21T00:03:08.000Z","updated_at":"2025-12-22T00:27:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"44989128-11ec-499d-a6cf-ad44d1c7a7a4","html_url":"https://github.com/obartra/countdown","commit_stats":null,"previous_names":["obartra/countdown"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/obartra/countdown","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obartra%2Fcountdown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obartra%2Fcountdown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obartra%2Fcountdown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obartra%2Fcountdown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/obartra","download_url":"https://codeload.github.com/obartra/countdown/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obartra%2Fcountdown/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28635919,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T15:01:31.228Z","status":"ssl_error","status_checked_at":"2026-01-21T14:42:58.942Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["countdown","countdown-application","countdown-clock","countdown-javascript","countdown-timer"],"created_at":"2026-01-21T15:38:03.989Z","updated_at":"2026-01-21T15:38:04.688Z","avatar_url":"https://github.com/obartra.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg width=\"160\" height=\"160\" src=\"/assets/favicon.png\"\u003e\n\u003c/p\u003e\n\n# ⏳ Countdown\n\nSimple, customizable countdown with shareable short URLs, admin review tools, and theming.\n\n## Usage\n\nCreate a countdown by visiting the editor (root path) and filling in the form, or by providing URL parameters:\n\n- `time` (required, ISO UTC like `2025-01-01T00:00:00Z`)\n- `title`, `description`, `footer`, `complete`\n- `color` (text color), `bgcolor` (background color)\n- `image` (`provider:id`, e.g., `openverse:\u003cuuid\u003e` or `tenor:\u003cid\u003e`)\n\nPublishing generates a short URL `/v/:slug` that can be viewed without loading the editor. Protected slugs require a password to edit or delete. Admins can review reports and clear/delete via privileged headers.\n\n## Samples\n\n![](./assets/sample.png)\n\n![](./assets/sample2.png)\n\n## Project structure\n\n- `src/` — React app (editor/viewer, theming, UI components)\n- `netlify/functions/` — API endpoints (`/publish`, `/v/:slug`, `/admin-stats`, `/api/admin/reports`, `/api/admin/reports/:slug`, `/report`, etc.)\n- `cypress/` — E2E tests\n- `docs/design/` — feature designs\n- `docs/pr/` — PR plans derived from designs\n\n## Scripts\n\n- `pnpm start` — Vite dev server + Netlify functions (`PORT` default 8080, `FUNCTIONS_PORT` default 8888 via `scripts/serve-functions.js`)\n- `pnpm dev` — Vite dev server only\n- `pnpm build` — Build app to `dist/`\n- `pnpm preview` — Preview production build\n- `pnpm test` — Unit/integration tests (Vitest)\n- `pnpm bundle:check` — Assert bundle size split (requires prior `pnpm build`)\n- `pnpm lint` — ESLint\n- `pnpm types` — Typecheck\n- `pnpm test:e2e` — Cypress against local dev + functions (requires available ports 4173/8889)\n\nCI runs `pnpm bundle:check` automatically after `pnpm build`.\n\n## Environment\n\n- `ADMIN_SECRET` — Required for admin endpoints (`/api/admin/reports`, `/api/admin/reports/:slug`, `/admin-stats`, admin override delete)\n- `VITE_TENOR_CLIENT_KEY`, `VITE_IMAGE_API_KEY_TENOR` — Tenor image search\n- `VITE_OPENVERSE_BASE` — OpenVerse API base (for image search)\n- `COUNTDOWN_STORAGE_DIR` — Override local blob shim root (defaults to `/tmp/.netlify/published-data` in Netlify functions, `.netlify/published-data` when running tests locally)\n- `COUNTDOWN_STORAGE_DRIVER` — Optional override for storage (`fs` or `blobs`)\n- `COUNTDOWN_BLOBS_SITE_ID` — Netlify site ID for manual Blobs configuration\n- `COUNTDOWN_BLOBS_TOKEN` — Netlify API token for manual Blobs configuration\n- `COUNTDOWN_BLOBS_API_URL` — Optional Netlify API base URL override\n\n## API endpoints (Netlify functions)\n\n- `POST /publish` — Create/update countdowns (short slugs)\n- `GET /v/:slug` — Fetch published payload + metadata\n- `DELETE /v/:slug` — Delete published countdown (owner password or `x-admin-override`)\n- `POST /v/:slug/report` — Submit a report (rate limited)\n- `GET /api/admin/reports` — List reported slugs (requires `x-admin-secret`)\n- `GET /api/admin/published` — List published slugs with metadata (paginated, requires `x-admin-secret`)\n- `PATCH /api/admin/reports/:slug` — Mark reviewed\n- `DELETE /api/admin/reports/:slug` — Clear reports (optional `purgeBlobs=true`)\n- `GET /admin/stats` — Admin stats (requires `x-admin-secret`)\n\nAdmin UI:\n\n- `/admin` — landing hub for admin tools (requires admin secret, includes a Settings card to clear the session secret)\n- `/admin/reports` — toggles between reported and published slugs, calls `/api/admin/reports*` and `/api/admin/published`\n\n## Dev setup\n\nRequires Node 25.2.x (see `.nvmrc`) and pnpm 10+.\n\n```sh\npnpm install\n# Optional helpers used in scripts on Linux/macOS\nsudo apt-get install jq  # Ubuntu/Debian\nbrew install jq          # macOS\n```\n\nLocal dev with functions:\n\n```sh\npnpm start\n# App: http://localhost:8080 (or PORT)\n# Functions: http://localhost:8888/.netlify/functions (or FUNCTIONS_PORT)\n```\n\nTests:\n\n```sh\npnpm types\npnpm lint\npnpm test\nnpm run test:e2e   # requires free ports 4173/8889\n```\n\n## Deployment\n\nBuild output lives in `dist/`. Netlify Functions reside in `netlify/functions/`. Set `ADMIN_SECRET` and image API keys in your deploy environment. Production uses Netlify Blobs; local dev uses the `.netlify/published-data` shim. Refer to design docs in `docs/design/` and PR briefs in `docs/pr/` for feature-specific details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobartra%2Fcountdown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fobartra%2Fcountdown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobartra%2Fcountdown/lists"}