{"id":19357891,"url":"https://github.com/thexhr/twind","last_synced_at":"2026-02-25T11:44:15.975Z","repository":{"id":71259449,"uuid":"408914818","full_name":"thexhr/twind","owner":"thexhr","description":"twind is a simple daemon serving static files over the gemini protocol.","archived":false,"fork":false,"pushed_at":"2026-02-15T17:58:28.000Z","size":62,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-16T00:39:41.816Z","etag":null,"topics":["c","daemon","gemini-protocol","gemini-server","hacktoberfest","server"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thexhr.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","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}},"created_at":"2021-09-21T17:33:58.000Z","updated_at":"2026-02-15T17:58:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"555eaeb8-e143-4bd2-a5ef-7b0075a193ce","html_url":"https://github.com/thexhr/twind","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/thexhr/twind","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thexhr%2Ftwind","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thexhr%2Ftwind/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thexhr%2Ftwind/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thexhr%2Ftwind/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thexhr","download_url":"https://codeload.github.com/thexhr/twind/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thexhr%2Ftwind/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29819594,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T11:42:28.130Z","status":"ssl_error","status_checked_at":"2026-02-25T11:42:27.690Z","response_time":61,"last_error":"SSL_read: 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":["c","daemon","gemini-protocol","gemini-server","hacktoberfest","server"],"created_at":"2024-11-10T07:09:33.841Z","updated_at":"2026-02-25T11:44:15.942Z","avatar_url":"https://github.com/thexhr.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# twind\n\ntwind is a simple daemon serving static files over the gemini protocol.  It is\nintended to have as few knobs as possible and has no support for a\nconfiguration file.  twind is named after the latin word for gemini - twins.\n\ntwind is known to run on OpenBSD, FreeBSD and Linux and currently supports\n\n* Serving static gemini files\n* Virtual hosts\n* MIME handling\n* IPv4 and IPv6 support\n\nIt doesn't support CGI handling and probably never will.  There are more\nadvanced gemini servers out there if you look for fancy stuff.\n\n## Installation\n\ntwind is written in plain C and you need to have the following software\ninstalled:\n\n* A C compiler (tested with clang \u003e= 11 and GCC \u003e= 9)\n* LibreSSL or OpenSSL including development headers\n* POSIX compatible libc with pthreads support\n* make (both BSD and GNU make will work)\n\n### Dependencies\n\nInstall the dependencies as follows:\n\n| Operating System | Commands and Notes |\n| --- | --- |\n| Alpine Linux | `apk add make gcc shadow bsd-compat-headers openssl openssl-dev musl-dev` |\n| Arch Linux | `pacman -Syu gcc make openssl` |\n| Debian Linux| `apt install make gcc openssl libssl-dev` |\n| DragonFly BSD | `pkg install libressl-devel` |\n| Fedora Linux | `dnf install openssl openssl-devel` |\n| FreeBSD | No additional dependencies needed |\n| OpenBSD | No additional dependencies needed |\n| Ubuntu Linux| `apt install make gcc openssl libssl-dev` |\n| Void Linux| `xbps-install gcc make openssl-devel` |\n| Windows | There is no native version, just use WSL |\n\nIf your operating system does not have `pkg-config` installed by default, you have to install it as well.\n\ntwind needs a dedicated user called '_twind' and directory to run.  The\nMakefile contains a command to create the user.  Note that you shall not change\nthe user's name and the directory twind needs!  By default, the user ID for\n_twind is set to 4000.  If you need another user ID, change the UID variable\nin the Makefile.\n\n```\n$ make\n# make install\n# make user\n```\n\n### TLS certificates\n\ntwind expects to find a X509 certificate and a corresponding private key\nunder the following locations (which cannot be changed):\n\n* /etc/twind/twind.cert.pem\n* /etc/twind/twind.key.pem\n\nEither copy your existing keys to these locations or generate a new key and\ncertificate by using the Makefile.  Note that the command overwrites any existing\nkey without warning!  To generate both key and certificate use the following\ncommand and provide the hostname via the HN variable.  If you don't provide the\nhostname the command will fail!\n\n```\n# make setuptls HN=example.com\n```\n\n## Usage\n\ntwind has support for virtual hosts.  If your gemini server is called\nexample.com you have to create a dedicated sub directory under `/var/twind`:\n\n```\n# cd /var/twind\n# mkdir example.com\n# \u003ccopy files into the example.com directory\u003e\n```\n\nIn case your server is also reachable via gemini.example.com and you want to\nserve the same content as on example.com you can create a symlink.  In case you\nwant to serve different content, you have to create a dedicated sub directory.\n\ntwind needs root permissions to start and will drop its privileges as soon as\npossible.  It will also chroot to `/var/twind`.\n\n```\n# twind\n```\n\nFor debugging purposes, you can start twind with -df option so that debugging\nand running in the foreground is enabled.\n\n## License\n\ntwind was written by Matthias Schmidt and is released under the ISC license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthexhr%2Ftwind","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthexhr%2Ftwind","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthexhr%2Ftwind/lists"}