{"id":22727229,"url":"https://github.com/fuwn/gigi","last_synced_at":"2025-10-28T11:41:12.978Z","repository":{"id":245866489,"uuid":"819420996","full_name":"Fuwn/gigi","owner":"Fuwn","description":"👧 An honest Finger protocol server","archived":false,"fork":false,"pushed_at":"2025-05-26T06:59:47.000Z","size":80,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-25T15:43:08.153Z","etag":null,"topics":["finger","finger-protocol","smolweb"],"latest_commit_sha":null,"homepage":"finger://fuwn.me:79","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Fuwn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2024-06-24T13:20:32.000Z","updated_at":"2025-08-07T03:57:30.000Z","dependencies_parsed_at":"2024-06-24T14:57:17.610Z","dependency_job_id":"f529e8fe-3a90-482c-8a78-15c6c54062f1","html_url":"https://github.com/Fuwn/gigi","commit_stats":null,"previous_names":["fuwn/gigi"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/Fuwn/gigi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fuwn%2Fgigi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fuwn%2Fgigi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fuwn%2Fgigi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fuwn%2Fgigi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Fuwn","download_url":"https://codeload.github.com/Fuwn/gigi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fuwn%2Fgigi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281433288,"owners_count":26500408,"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","status":"online","status_checked_at":"2025-10-28T02:00:06.022Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["finger","finger-protocol","smolweb"],"created_at":"2024-12-10T17:11:16.858Z","updated_at":"2025-10-28T11:41:12.927Z","avatar_url":"https://github.com/Fuwn.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 👧️ Gigi\n\n\u003e An honest [Finger](https://www.rfc-editor.org/info/rfc742) protocol server\n\nGigi is a Finger protocol server with few features–the way a Finger server\nshould be.\n\n- Gigi can respond to Finger requests statically.\n- Gigi can respond to Finger requests dynamically.\n\n\u003cp align=\"center\"\u003e\n  \u003cbr\u003e\n  \u003cimg src=\"https://i.imgur.com/RddckKP.png\" width=\"75%\" alt=\"Example screenshot\"\u003e\n\u003c/p\u003e\n\n## Usage\n\nA live, production deployment of Gigi exists at\n[`finger://fuwn.me`](finger://fuwn.me). Feel free to poke and prod at it as you\nwish.\n\nYou can use a Finger client like [finger](https://github.com/reiver/finger) to\nsend requests, or you could use the old reliable `telnet` or `nc` commands.\n\n```bash\nfinger fuwn.me\ntelnet fuwn.me\necho | nc fuwn.me 79\n```\n\n### Running Locally\n\nTo run Gigi from a single command using Nix, execute `nix run github:Fuwn/gigi`;\notherwise, try one of the command combinations below.\n\n```bash\n# Clone the repository locally\ngit clone git@github.com:Fuwn/gigi.git\n\n# Navigate into the local repository\ncd gigi\n\n# Build and run Gigi without Nix; requires Go to be locally available\ngo build gigi.go \u0026\u0026 ./gigi\n\n# Build and run Gigi with Nix\nnix build \u0026\u0026 ./result/bin/gigi\n```\n\n### Running using Docker\n\nThis command runs the latest Gigi Docker image with port 79 mapped from inside\nthe container to port 7979 on the host system. In practice, you'd actually map\nport 79 to port 79, but that requires root privileges, so we're using 7979 here.\n\nThe command also mounts the `./.gigi` directory from the host system to the `/gigi/.gigi`\ndirectory inside the container. This is where you'd place all your profile\nfiles. In practice, you'd likely make this a named volume or mount from a more collected\nvolume storage facility, and add files to that mounted volume path itself.\n\n```bash\n# Run Gigi using Docker with a local volume directory\ndocker run -v ./.gigi/:/gigi/.gigi -p 7979:79 fuwn/gigi:latest\n\n# Run Gigi using Docker with a named volume and a remote volume directory\ndocker run -v gigi-data:/gigi/.gigi -p 79:79 fuwn/gigi:latest\n```\n\nThe second command is the more practical one, as it uses a named volume to store\nthe profile files. The named volume is persistent, and can be found at\n`/var/lib/docker/volumes/gigi-data/_data` on most semi-FHS compliant systems by default.\n\nDocker also significantly reduces the risk of running Gigi, as it is *sandboxed*\nfrom the host system. In static mode, there is little to no risk, but in dynamic\nmode, there is a small risk for arbitrary code execution depending on your\n`.gigi/do` file.\n\n### Configuration\n\nGigi is configured through the `./.gigi` directory.\n\nDynamic response mode is disabled by default as dynamic code execution can be a\nbig security risk. If you wish to live on the edge, pass the `GIGI_DYNAMIC`\nenvironment variable with a value greater than `1` to Gigi. Dropping Gigi into a\ncontainer is significantly safer than running it on a host machine, so consider\nthat as your primary deployment option.\n\nDynamic mode runs any and all executables located at the path `./.gigi/do`, and\npasses any arguments from the Finger request to the executable.\n\nStatic mode is enabled by default. A Finger request for `test` will return the\ncontents of `./.gigi/test`. A Finger request of nothing will return the contents\nof `./.gigi/default`. The default file is also the fallback file in case the\nrequested file does not exist.\n\nTo emulate dynamic mode, minus the support for arguments, you can setup a\nservice of some kind to periodically update the contents of one of the static\nfiles.\n\nYou can additionally modify the `GIGI_PORT` environment variable to change the\nport Gigi listens on. The default port is 79. If you're running Gigi in a\nDocker container, you can ignore this variable and map any ports using Docker\ndirectly.\n\n## Licence\n\nThis project is licensed with the [GNU General Public License v3.0](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffuwn%2Fgigi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffuwn%2Fgigi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffuwn%2Fgigi/lists"}