{"id":13771055,"url":"https://github.com/omar-polo/gmid","last_synced_at":"2025-04-05T17:08:31.239Z","repository":{"id":41803410,"uuid":"300694853","full_name":"omar-polo/gmid","owner":"omar-polo","description":"a Gemini server","archived":false,"fork":false,"pushed_at":"2024-11-24T14:32:34.000Z","size":3068,"stargazers_count":109,"open_issues_count":9,"forks_count":6,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-29T16:09:53.907Z","etag":null,"topics":["gemini","gemini-protocol","gemini-server","libtls"],"latest_commit_sha":null,"homepage":"https://gmid.omarpolo.com","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/omar-polo.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","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":"2020-10-02T17:52:16.000Z","updated_at":"2025-03-23T19:02:53.000Z","dependencies_parsed_at":"2023-10-15T17:28:10.639Z","dependency_job_id":"22783ed0-d8db-43f8-b1d1-844ac07189c3","html_url":"https://github.com/omar-polo/gmid","commit_stats":null,"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omar-polo%2Fgmid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omar-polo%2Fgmid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omar-polo%2Fgmid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omar-polo%2Fgmid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/omar-polo","download_url":"https://codeload.github.com/omar-polo/gmid/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247369952,"owners_count":20927928,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["gemini","gemini-protocol","gemini-server","libtls"],"created_at":"2024-08-03T17:00:47.031Z","updated_at":"2025-04-05T17:08:31.210Z","avatar_url":"https://github.com/omar-polo.png","language":"C","funding_links":[],"categories":["Servers"],"sub_categories":["Graphical"],"readme":"# gmid\n\ngmid is a full-featured Gemini server written with security in mind.\nIt can serve static files, has optional FastCGI and proxying support,\nand a rich configuration syntax.\n\nA few helper programs are shipped as part of gmid:\n\n - `gg` is a simple command-line Gemini client.\n\n - `gemexp` is a stripped-down config-less version of gmid to quickly\n   serve a directory from the command line.\n\n - `titan` is a command-line titan client.\n\n\n## Internationalisation (IRIs, IDN, UNICODE)\n\nEven thought the current Gemini specification doesn't mention anything\nin this regard, I think it's important to make as easy as possible to\nuse non-ASCII characters in domain names and URL paths.\n\nFor starters, gmid has full support for IRIs (RFC3987 —\nInternationalized Resource Identifiers).  IRIs are a superset of URIs\nthat allow UNICODE characters, so there aren't incompatibilities with\nURI-only clients.\n\nThere is full support also for IDNs (Internationalized Domain Names).\nThere's no need to fiddle with punycode, or even know what it is: the\nhostname in the configuration file can (and must be) in the decoded\nform (e.g. `naïve` and not `xn--nave-6pa`), gmid will do the rest.\n\nThe only missing piece is UNICODE normalisation of the IRI path: gmid\ndoesn't do that (yet).\n\n\n## Configuration\n\n[httpd]: https://man.openbsd.org/httpd.8\n\ngmid has a rich configuration file, heavily inspired by OpenBSD'\n[httpd(8)][httpd], with every detail carefully documented in the\nmanpage.  Here's a minimal example of a config file:\n\n```conf\n# /etc/gmid.conf\nserver \"example.com\" {\n\tlisten on * port 1965\n\tcert \"/path/to/cert.pem\"\n\tkey  \"/path/to/key.pem\"\n\troot \"/var/gemini/example.com\"\n}\n```\n\nand a slightly more complex one\n\n```conf\n# /etc/gmid.conf\ncert_root = \"/path/to/keys\"\n\nserver \"example.com\" {\n\tlisten on * port 1965\n\n\talias \"foobar.com\"\n\n\tcert $cert_root \"/example.com.crt\"\n\tkey  $cert_root \"/example.com.pem\"\n\troot \"/var/gemini/example.com\"\n\n\t# lang for text/gemini files\n\tlang \"en\"\n\n\t# only for locations that matches /files/*\n\tlocation \"/files/*\" {\n\t\t# generate directory listings\n\t\tauto index on\n\t}\n\n\tlocation \"/repo/*\" {\n\t\t# change the index file name\n\t\tindex \"README.gmi\"\n\t\tlang \"it\"\n\t}\n}\n```\n\n\n## Building\n\ngmid depends on libevent2, LibreSSL or OpenSSL, and yacc or GNU bison.\n\nThe build is as simple as\n\n\t$ ./configure\n\t$ make\n\nIf the configure scripts fails to pick up something, please open an\nissue or notify me via email.\n\nTo install execute:\n\n\t# make install\n\n\n### Testing\n\nExecute\n\n\t$ make regress\n\nto start the suite.  Keep in mind that the regression tests needs to\ncreate a few file inside the `regress` directory and bind the 10965 and\n10966 ports.\n\n\n## Contributing\n\nAny form of contribution is welcome, not only patches or bug reports.\nIf you have a sample configuration for some specific use-case, a\nscript or anything that could be useful to others, consider adding it\nto the `contrib` directory.\n\n\n## Architecture/Security considerations\n\ngmid has a privsep design, where the operations done by the daemon are\nsplit into multiple processes:\n\n - main: the main process is the only one that keeps the original\n   privileges.  It opens the TLS certificates on the behalf of the\n   `server` and `crypto` processes, reloads the configuration upon\n   `SIGHUP` and re-opens the log files upon `SIGUSR1`.\n\n - logger: handles the logging with syslog and/or local files.\n\n - server: listens for connections and handles the requests.  It also\n   speaks FastCGI and do the proxying.\n\n - crypto: holds the TLS private keys to avoid a compromised `server`\n   process to disclose them.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fomar-polo%2Fgmid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fomar-polo%2Fgmid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fomar-polo%2Fgmid/lists"}