{"id":18348641,"url":"https://github.com/averagehelper/portfolio","last_synced_at":"2026-01-21T03:33:08.275Z","repository":{"id":189281648,"uuid":"444554575","full_name":"AverageHelper/portfolio","owner":"AverageHelper","description":"My personal website. Very basic. (Read-only Git mirror)","archived":false,"fork":false,"pushed_at":"2025-07-22T22:12:55.000Z","size":6808,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-22T23:32:45.104Z","etag":null,"topics":["mirror"],"latest_commit_sha":null,"homepage":"https://git.average.name/AverageHelper/portfolio","language":"XSLT","has_issues":false,"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/AverageHelper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":"FUNDING.yml","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},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":"https://average.name/support"}},"created_at":"2022-01-04T20:30:12.000Z","updated_at":"2025-07-22T22:12:58.000Z","dependencies_parsed_at":"2024-01-09T02:36:49.390Z","dependency_job_id":"786810cf-ab4b-4529-ac02-843e20ee4d23","html_url":"https://github.com/AverageHelper/portfolio","commit_stats":null,"previous_names":["averagehelper/portfolio"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AverageHelper/portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AverageHelper%2Fportfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AverageHelper%2Fportfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AverageHelper%2Fportfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AverageHelper%2Fportfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AverageHelper","download_url":"https://codeload.github.com/AverageHelper/portfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AverageHelper%2Fportfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28624512,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T02:47:06.670Z","status":"ssl_error","status_checked_at":"2026-01-21T02:45:44.886Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["mirror"],"created_at":"2024-11-05T21:18:41.553Z","updated_at":"2026-01-21T03:33:08.266Z","avatar_url":"https://github.com/AverageHelper.png","language":"XSLT","funding_links":["https://average.name/support"],"categories":[],"sub_categories":[],"readme":"# portfolio\n\nA basic web site to plug my projects and things, accessible at https://average.name via HTTPS or gemini://average.name via [Gemini protocol](gemini://geminiprotocol.net).\n\nFeel free to poke around, I guess.\n\n# Contributing\n\nWe use [Astro](https://astro.build) to generate static HTML from templates, which we serve statically using [Rocket.rs](https://rocket.rs/). Astro runs on Node, and our webserver uses Rust. Make sure both of these are installed on your system in order to build the webserver.\n\n## Install Dependencies\n\nWe'll need these for our build tools.\n\n```sh\ndeno install --frozen\nnpm ci\n```\n\n## Make changes\n\nThe contents of the `/src` directory gets compiled into static HTML assets.\n\nThe contents of the `/public` directory get copied into the output folder as-is.\n\nThe build result lives in `/dist`, and gets sent verbatim to the web host. Please do not modify these files directly.\n\nThe `/functions` directory contains the back-end logic, including serving static files and responding to WebFinger requests.\n\n## Build the site\n\nThis command will build static site assets to `/dist` and download runtime dependencies, without starting a webserver:\n\n```sh\ndeno task build\ncargo build --release\n```\n\n## Run unit tests\n\nTo run unit tests with code coverage, use the `test.sh` script at the directory root. This will prompt you to install the necessary components.\n\nTo run unit tests without code coverage, run `cargo test`.\n\n## Run the site with Rust\n\nThis part is mainly for my own notes. Go run your own website! lol\n\nAfter the site is built, this command will run a production-ready webserver:\n\n```sh\ncargo run --release\n```\n\nBy default, the HTTP server runs on port `8787`, and the Gemini capsule on port `1965`.\n\n## Run the site with Docker Compose\n\nThis part is mainly for my own notes. Go run your own website! lol\n\n```sh\ndocker compose up -d --no-deps --build\n```\n\nThe HTTP servers run on port `8787`, and the Gemini capsule on port `1965`. You can modify these ports in [`compose.yaml`](compose.yaml), use a `docker run` command instead, or set the `HTTP_PORT` and `GEMINI_PORT` environment variables.\n\n## Certificates\n\n### For local development\n\nIf you're already developing a Gemini capsule locally, copy those certs into a new `.certs` directory in this project. Otherwise, create TLS certificates like so:\n\n```sh\nmkdir -p .certs\ncd .certs\nopenssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 1103760 -nodes -subj '/CN=localhost' -addext 'subjectAltName=DNS:localhost'\n```\n\nNote that the `-days` arg in the command above sets the cert to expire sometime around the year 3024. This is sufficient for use with Gemini capsules or local development, but not much else.\n\n\u003e [!IMPORTANT]\n\u003e Change the `/CN=` and `subjectAltName=` parts to your expected internet domain when using in production. Consider also setting a shorter `-days` parameter, and setting a cron job to re-issue a new cert when this one expires.\n\nThe `\u003cproject\u003e/.certs` directory must contain `key.pem` and `cert.pem`, or the server will panic.\n\n## Contributing\n\nThis project lives primarily at [git.average.name](https://git.average.name/AverageHelper/portfolio). Read-only mirrors also exist on [Codeberg](https://codeberg.org/AverageHelper/portfolio) and [GitHub](https://github.com/AverageHelper/portfolio). Issues or pull requests should be filed at [git.average.name](https://git.average.name/AverageHelper/portfolio). You may sign in or create an account directly, or use one of several OAuth 2.0 providers.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faveragehelper%2Fportfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faveragehelper%2Fportfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faveragehelper%2Fportfolio/lists"}