{"id":31267982,"url":"https://github.com/CompeyDev/ssh-portfolio","last_synced_at":"2025-09-23T17:03:03.702Z","repository":{"id":312307328,"uuid":"1047057867","full_name":"CompeyDev/ssh-portfolio","owner":"CompeyDev","description":"introducing a portfolio as a tui app served over ssh! (mirror of https://git.devcomp.xyz/DevComp/ssh-portfolio)","archived":false,"fork":false,"pushed_at":"2025-09-17T10:49:32.000Z","size":3496,"stargazers_count":68,"open_issues_count":6,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-17T12:40:40.914Z","etag":null,"topics":["portfolio","ratatui","rust","ssh-server","tui"],"latest_commit_sha":null,"homepage":"https://devcomp.xyz","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CompeyDev.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-29T17:08:07.000Z","updated_at":"2025-09-17T11:00:07.000Z","dependencies_parsed_at":"2025-08-29T19:54:15.431Z","dependency_job_id":"aa29a84a-8574-42c5-9d29-8a6c9753dacb","html_url":"https://github.com/CompeyDev/ssh-portfolio","commit_stats":null,"previous_names":["compeydev/ssh-portfolio"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/CompeyDev/ssh-portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CompeyDev%2Fssh-portfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CompeyDev%2Fssh-portfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CompeyDev%2Fssh-portfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CompeyDev%2Fssh-portfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CompeyDev","download_url":"https://codeload.github.com/CompeyDev/ssh-portfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CompeyDev%2Fssh-portfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276613300,"owners_count":25673400,"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-09-23T02:00:09.130Z","response_time":73,"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":["portfolio","ratatui","rust","ssh-server","tui"],"created_at":"2025-09-23T17:02:19.253Z","updated_at":"2025-09-23T17:03:03.696Z","avatar_url":"https://github.com/CompeyDev.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# ssh-portfolio\n\n![made with ratatui](https://img.shields.io/badge/made_with-ratatui-slateblue?style=flat-square\u0026logo=ratatui)\n![rust](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fgit.devcomp.xyz%2FDevComp%2Fssh-portfolio%2Fraw%2Fbranch%2Fmain%2Frust-toolchain\u0026query=%24.toolchain.channel\u0026style=flat-square\u0026logo=rust\u0026label=rust\u0026color=red)\n![ci](https://img.shields.io/github/actions/workflow/status/CompeyDev/ssh-portfolio/ci.yml?style=flat-square)\n![version](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fgit.devcomp.xyz%2FDevComp%2Fssh-portfolio%2Fraw%2Fbranch%2Fmain%2FCargo.toml\u0026query=%24.package.version\u0026style=flat-square\u0026label=version\u0026color=orange)\n![MIT licensed](https://img.shields.io/badge/license-MIT-blue?style=flat-square)\n\nwhat if the internet as we knew it was *different*? what if the world wide web\nnever came to be? what if... we lived in our own little ssh services?\nintroducing a portfolio as a tui app served over ssh!\n\ntry it out:\n\n```sh\nssh -o SendEnv=TERM_PROGRAM erica@devcomp.xyz\n```\n\n\u003e [!TIP]\n\u003e make sure you have a [nerd font](https://www.nerdfonts.com/) installed or some features may not work!\n\n## features\n\n- about \u0026 projects tab \n- wip blog powered by atproto ([whitewind](https://github.com/whtwnd/whitewind-blog))\n- http landing page\n\n## showcase\n\n| desc        | img                                                                                                                                                                          |\n| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| about       | ![portfolio tui with the about tab selected, erica introduces themselves](./.github/assets/about.png)                                                                        |\n| projects    | ![portfolio tui with the projects tab selected, the projects are laid out as cards in a grid](./.github/assets/projects.png)                                                 |\n| web landing | ![website landing page, the page contains the ssh command and the keybinds for the portfolio tui, the page is made to look like the portfolio tui](./.github/assets/www.png) |\n\n## running\n\n### with cargo\n\nyou'll need to have rust installed, you can do that using [rustup](https://rustup.rs/). then, run using:\n\n```sh\ncargo run --release --no-default-features -- --help\n```\n\n### with nix\n\nthe nix flake exports a package with an overridable `features` attribute. `default.nix` \nexports two variants using this, `ssh-portfolio` and `ssh-portfolio-blog`.\n\n```sh\nnix build --file . ssh-portflio      # without blog\nnix build --file . ssh-portflio-blog # with blog\n\n# then run it:\n./result/bin/ssh-portfolio --help\n```\n\nor with your own set of features to build for:\n\n```nix\n# assuming this is in `custom.nix` in the same directory as `flake.nix`:\n{ pkgs ? import \u003cnixpkgs\u003e { } }:\nrec {\n  ssh-portfolio = (builtins.getFlake (builtins.toString ./.)).packages.${pkgs.system}.ssh-portfolio;\n  ssh-portfolio-custom = ssh-portfolio.override { features = [ ... ]; };\n}\n```\n\n### with docker\n\nbuild an image:\n\n```sh\ndocker build -t ssh-portfolio:latest --build-arg CARGO_FEATURES= .\n```\n\nto run it:\n\n```sh\ndocker run ssh-portfolio:latest -- --help\n```\n\n## configuration\n\nconfiguration options can be specified within a configuration file. this file is\nlocated within your configuration directory.\n\n- Linux: `$XDG_CONFIG_HOME/ssh-portfolio` or `~/.config/ssh-portfolio`\n- macOS: `~/Library/Application Support/xyz.devcomp.ssh-portfolio`\n- Windows: `%LOCALAPPDATA%\\devcomp\\ssh-portfolio\\config`\n\nthe directory can be overridden using the `SSH_PORTFOLIO_CONFIG` environment\nvariable. the name of the config file can be: `config.json5`, `config.json`,\n`config.yaml`, `config.toml`, and `config.ini`.\n\nthe default config is as follows:\n\n```json\n{\n  \"private_keys\": {\n    \"ssh-rsa\": \"$DATA_DIR/ssh/id_rsa\",\n    \"ecdsa-sha2-nistp256\": \"$DATA_DIR/ssh/id_ecdsa\",\n    \"ssh-ed25519\": \"$DATA_DIR/ssh/id_ed25519\"\n  },\n  \"keybindings\": {\n    \"Home\": {\n      \"\u003cq\u003e\": \"Quit\",\n      \"\u003cCtrl-d\u003e\": \"Quit\",\n      \"\u003cCtrl-c\u003e\": \"Quit\",\n      \"\u003cEsc\u003e\": \"Quit\",\n      \"\u003cCtrl-z\u003e\": \"Suspend\",\n      \"\u003cright\u003e\": \"NextTab\",\n      \"\u003cleft\u003e\": \"PrevTab\",\n      \"\u003cdown\u003e\": \"SelectNext\",\n      \"\u003cup\u003e\": \"SelectPrev\",\n      \"\u003center\u003e\": \"Continue\"\n    }\n  }\n}\n```\n\n### private_keys\n\nspecifies the path to the files containing the SSH private keys to use. the\nfollowing variables are expanded:\n\n- `$DATA_DIR`: the data directory, this can be overridden with the\n  `SSH_PORTFOLIO_DATA` environment variable. defaults to:\n  - Linux: `$XDG_DATA_HOME/ssh-portfolio` or `~/.local/share/ssh-portfolio`\n  - macOS: `~/Library/Application Support/xyz.devcomp.ssh-portfolio`\n  - Windows: `%LOCALAPPDATA%\\devcomp\\ssh-portfolio\\data`\n- `$CONFIG_DIR`: the configuration directory, as described above.\n- `$HOME`: the home directory, aka `~`.\n\n### keybindings\n\nspecifies the keybinds! this is an object where the key corresponds to a mode\nand the value is an object mapping a key to an action. currently, the only mode\navailable is `Home`.\n\nthese actions can be specified:\n\n- General\n  - `Tick`: do a tick\n  - `Render`: renders the tui\n  - `Suspend`: suspends\n  - `Resume`: resumes after a suspend\n  - `Quit`: quits\n  - `ClearScreen`: clears the screen\n- Tabs\n  - `NextTab`: go to the next tab\n  - `PrevTab`: go to the previous tab\n- Selection\n  - `SelectNext`: select the next item\n  - `SelectPrev`: select the previous item\n  - `Continue`: activate the currently selected item\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCompeyDev%2Fssh-portfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FCompeyDev%2Fssh-portfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCompeyDev%2Fssh-portfolio/lists"}