{"id":16608157,"url":"https://github.com/ikskuh/gurl","last_synced_at":"2025-10-29T16:32:14.969Z","repository":{"id":68601194,"uuid":"263764712","full_name":"ikskuh/gurl","owner":"ikskuh","description":"A curl-like cli application to interact with Gemini sites.","archived":false,"fork":false,"pushed_at":"2023-08-23T19:48:39.000Z","size":97,"stargazers_count":17,"open_issues_count":2,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-02T03:21:29.490Z","etag":null,"topics":["gemini","zig","ziglang"],"latest_commit_sha":null,"homepage":null,"language":"Zig","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/ikskuh.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},"funding":{"github":"MasterQ32"}},"created_at":"2020-05-13T23:17:54.000Z","updated_at":"2025-01-15T01:45:27.000Z","dependencies_parsed_at":"2024-05-17T11:53:11.019Z","dependency_job_id":null,"html_url":"https://github.com/ikskuh/gurl","commit_stats":null,"previous_names":["ikskuh/gurl"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikskuh%2Fgurl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikskuh%2Fgurl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikskuh%2Fgurl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikskuh%2Fgurl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ikskuh","download_url":"https://codeload.github.com/ikskuh/gurl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238855870,"owners_count":19542095,"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","zig","ziglang"],"created_at":"2024-10-12T01:25:16.425Z","updated_at":"2025-10-29T16:32:09.677Z","avatar_url":"https://github.com/ikskuh.png","language":"Zig","funding_links":["https://github.com/sponsors/MasterQ32"],"categories":[],"sub_categories":[],"readme":"# 👧 gurl\n\nA [Gemini](https://gemini.circumlunar.space/) command line interface similar to [curl](https://curl.haxx.se/) written in [Zig](https://ziglang.org/).\n\n## Project State\n\n- [x] Successful TLS 1.2 handshake\n- [x] Successful GET request header exchange\n- [x] Successful body download\n- [x] header parsing\n- [x] URL parser\n- [x] DNS resolving\n- [ ] MIME parsing\n- [ ] All of the correct heading handling\n  - [x] Follow absolute redirects\n  - [ ] Follow relative redirects\n  - [ ] Pretty-printing and guidance messages for failed requests \n- [ ] TOFU (trust on first use) for SSL connections\n  - [x] Implement primitive TOFU (store public key, not certificate)\n  - [ ] Implement correct TOFU (trust on first use) for SSL connections\n- [ ] Client certificates\n  - [ ] temporary cert\n  - [ ] permanent cert\n- [x] Use [XDG directories](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)\n- [ ] Implement windows port\n  - [x] Port `zig-network` to windows\n  - [x] Implement correct config directory locating for windows\n  - [ ] Trust Anchor support for windows\n\n## Dependencies\n\n- [Zig 0.6.0](https://ziglang.org/download/#release-0.6.0) or newer\n- [BearSSL](https://bearssl.org/) (provided as submodule)\n- [zig-network](https://github.com/MasterQ32/zig-network) (provided as submodule)\n\n## Build Instructions\n\n1. Refresh submodules (`git submodule init`, `git submodule update`)\n2. Build gurl (`zig build`)\n3. Run `./zig-cache/bin/gurl` \n\n## Design Considerations\n\nGive the user control over their system and make configuration easy.\n\n### Certificate Trust\n\n- accept any certificate\n- auto-accept the cert on first use (TOFU)\n- use CAs or ask user on first sight (TOFU+CA)\n- always ask on first sight (interactive TOFU)\n- auto-accept when first seen in a session (TOFU, no disk usage)\n- always ask when first seen in a session (interactive TOFU, no disk usage)\n\n### Future Plans\n\nCorrectly adhere to XDG standards and use `xdg-open`\n\n## TOFU Notes\n\nCurrent implementation just stores the public key of the server and\nnot the certificate with fingerprint and everything\n\n\u003e That certificate's fingerprint and expiry date are saved in a\npersistent database (like the .known_hosts file for SSH), associated\nwith the server's hostname.\n\n## Client Certificate Process\n\n- Wait for specification update\n\n## Tools\n\nConnect with OpenSSL:\n```\nopenssl s_client --connect domain.name -quiet -verify_quiet\n```\n\nDump DER certificate information:\n```\nopenssl x509 -in trust-store/mozz.us/cert-1.der -inform der -text\n``` \n\nConvert DER to PEM:\n```\nopenssl x509 -inform der -in trust-store/gemini.conman.org/cert-0.der -out conman.pem\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikskuh%2Fgurl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fikskuh%2Fgurl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikskuh%2Fgurl/lists"}