{"id":15010309,"url":"https://github.com/dbohdan/joker-cgi-guestbook","last_synced_at":"2026-02-10T20:32:07.414Z","repository":{"id":245683115,"uuid":"818929670","full_name":"dbohdan/joker-cgi-guestbook","owner":"dbohdan","description":"A toy old-school CGI guestbook written in Joker","archived":false,"fork":false,"pushed_at":"2024-11-28T12:04:47.000Z","size":69,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-09T18:48:26.922Z","etag":null,"topics":["cgi","clojure","guestbook","joker","joker-lang"],"latest_commit_sha":null,"homepage":"http://dbohdan.sdf.org/guestbook/","language":"Clojure","has_issues":true,"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/dbohdan.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}},"created_at":"2024-06-23T09:33:05.000Z","updated_at":"2024-11-28T12:04:42.000Z","dependencies_parsed_at":"2024-07-07T09:22:59.131Z","dependency_job_id":"4980dfbe-2330-48fc-89ca-c3d76eb277c8","html_url":"https://github.com/dbohdan/joker-cgi-guestbook","commit_stats":null,"previous_names":["dbohdan/joker-cgi-guestbook"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dbohdan/joker-cgi-guestbook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbohdan%2Fjoker-cgi-guestbook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbohdan%2Fjoker-cgi-guestbook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbohdan%2Fjoker-cgi-guestbook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbohdan%2Fjoker-cgi-guestbook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dbohdan","download_url":"https://codeload.github.com/dbohdan/joker-cgi-guestbook/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbohdan%2Fjoker-cgi-guestbook/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29314705,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T17:48:59.043Z","status":"ssl_error","status_checked_at":"2026-02-10T17:45:37.240Z","response_time":65,"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":["cgi","clojure","guestbook","joker","joker-lang"],"created_at":"2024-09-24T19:33:30.013Z","updated_at":"2026-02-10T20:32:07.405Z","avatar_url":"https://github.com/dbohdan.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Joker CGI Guestbook\n\nThis is a toy old-school\n[CGI](https://en.wikipedia.org/wiki/Common_Gateway_Interface) guestbook\nimplemented in [Joker](https://joker-lang.org/), a dialect of Clojure.\nThe shebang line reflects that I wrote it\nfor use on the [SDF Public Access UNIX System](https://sdf.org).\n\n## Description\n\nThe guestbook is a self-contained CGI script with no dependencies\nexcept Joker 1.4.0 or later.\nLike old CGI scripts, it has editable configuration at the top.\nData is stored in a [Bolt](https://github.com/etcd-io/bbolt) database,\nwhich Joker has built in.\nCaptchas are stateless and use [HMAC](https://en.wikipedia.org/wiki/HMAC)\nto verify the solved challenge is authentic and recent.\nThe secret key for HMAC is generated automatically and stored in the database.\nThis is a reason to forbid public access to it.\n\nThere is no management interface.\nUse [boltbrowser](https://github.com/br0xen/boltbrowser)\nto browse and edit the database.\nTo hide an entry without deleting it:\n\n1. Find the entry in the Bolt bucket `entries`.\n2. Edit the JSON object to add a key `hide` with the value `true`.\n\nThis project is a toy.\nI don't know how actively I am going to maintain it.\nExpect less testing, feature development, and support\nthan from a regular project.\n\n## Screenshots\n\n\u003ca href=\"screenshot.png\"\u003e\u003cimg alt=\"A screenshot of a webpage with three guestbook entries and a submit form.\" src=\"screenshot.png\" width=\"35%\"\u003e\u003c/a\u003e\n\u003ca href=\"screenshot-dark.png\"\u003e\u003cimg alt=\"The same page in dark mode.\" src=\"screenshot-dark.png\" width=\"35%\"\u003e\u003c/a\u003e\n\n## Setup\n\nYou will need an HTTP server with CGI enabled, like\n[Apache](https://httpd.apache.org/docs/2.4/howto/cgi.html)\nor\n[Caddy](https://github.com/aksdb/caddy-cgi).\n\n1. Download or build a Joker binary.\n   Binaries for Free/Net/OpenBSD, Linux, Mac, and Windows\n   are attached to Joker\n   [releases](https://github.com/candid82/joker/releases).\n   Install the binary on your server.\n   On a public Unix system like SDF,\n   you may be able to install the binary in your home directory\n   and use it for CGI.\n\n2. Download the source code file of the guestbook, `guestbook.joke`.\n   You can and should clone the repository to track your customizations in Git.\n   Edit the file.\n   Update the\n   [shebang line](https://en.wikipedia.org/wiki/Shebang_%28Unix%29)\n   to the absolute path to your Joker interpreter.\n   Update the settings as desired.\n\n3. Create a directory like `/guestbook/` in your server's CGI root.\n   Copy your customized `guestbook.joke` to the directory\n   with a filename the server will recognize\n   as a directory-index CGI script, like `index.cgi`.\n\n4. Access the guestbook on your server\n   (for example, \u003chttp://localhost/guestbook/\u003e)\n   and confirm that it works.\n\n5. Make sure web clients cannot access the database file\n   (for example, \u003chttp://localhost/guestbook/guestbook.bolt\u003e\n   with the default filename `guestbook.bolt`).\n\n## Theme\n\nThe guestbook's style is defined in the variables `css` and `css-dark`\nin the script and can be customized.\n\nThe guestbook supports dark mode.\nBy default, it follows the system's color scheme preference\n(using the [`prefers-color-scheme`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@media/prefers-color-scheme) media query).\nYou can override this by passing a `theme` query parameter:\n\n- `?theme=light`: force light mode.\n- `?theme=dark`: force dark mode.\n- `?theme=reverse`: use the opposite of the system's preference(‽).\n- Any other value: use the system's preference.\n\nExample: \u003chttp://localhost/guestbook/?theme=dark\u003e\n\n## License\n\nMIT.\nSee the file [`LICENSE`](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdbohdan%2Fjoker-cgi-guestbook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdbohdan%2Fjoker-cgi-guestbook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdbohdan%2Fjoker-cgi-guestbook/lists"}