{"id":15649198,"url":"https://github.com/zachflower/tcpcv","last_synced_at":"2025-06-12T06:32:21.743Z","repository":{"id":17042647,"uuid":"19806993","full_name":"zachflower/tcpcv","owner":"zachflower","description":":computer: TCPCV is a retro-style, text-based server for hosting your résumé.","archived":false,"fork":false,"pushed_at":"2023-01-07T04:51:18.000Z","size":4957,"stargazers_count":40,"open_issues_count":4,"forks_count":7,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-30T16:16:13.798Z","etag":null,"topics":["javascript","node","nodejs","tcp"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/zachflower.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-05-15T05:09:40.000Z","updated_at":"2024-06-11T07:48:58.000Z","dependencies_parsed_at":"2023-01-11T20:25:51.919Z","dependency_job_id":null,"html_url":"https://github.com/zachflower/tcpcv","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/zachflower/tcpcv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zachflower%2Ftcpcv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zachflower%2Ftcpcv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zachflower%2Ftcpcv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zachflower%2Ftcpcv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zachflower","download_url":"https://codeload.github.com/zachflower/tcpcv/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zachflower%2Ftcpcv/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259412225,"owners_count":22853384,"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":["javascript","node","nodejs","tcp"],"created_at":"2024-10-03T12:28:50.576Z","updated_at":"2025-06-12T06:32:21.704Z","avatar_url":"https://github.com/zachflower.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TCPCV\n\n![build](https://github.com/zachflower/tcpcv/workflows/Node.js%20CI/badge.svg) ![npm](https://img.shields.io/npm/v/tcpcv) ![npm](https://img.shields.io/npm/dm/tcpcv)\n\nTCPCV is a retro-style, text-based server for hosting your resume. For absolutely no practical reason, you can make your resume accessible in the most obsolete of ways: via [Telnet](https://en.wikipedia.org/wiki/Telnet).\n\n_Note: It is entirely possible that Telnet is not installed by default on some modern operating systems—for good reason, probably. However, it stands to reason that if someone is actually going to try and read a resume via Telnet, they are comfortable enough with technology to figure out how to install it too._\n\n![TCPCV demo](.github/demo.gif)\n\n## tl;dr\n\nIf you want to skip all of the pesky requirements, installation steps, and configuration details, then using TCPCV can be broken down into two major steps:\n\n### Start TCPCV\n\nOn the server that you wish to host TCPCV on:\n\n```\n$ tcpcv --resume=\u003cpath-to-resume.json\u003e --port=\u003cport\u003e --motd=\u003cmotd\u003e\n```\n\n#### Example\n\n```\n$ tcpcv --resume=resume.json --port=2468 --motd=\"John Doe\"\n```\n\n### Connect to TCPCV\n\nOn a client you wish to connect to TCPCV from:\n\n```\n$ telnet \u003caddress-of-tcpcv-server\u003e \u003cport\u003e\n```\n\n#### Example\n\n```\n$ telnet 192.168.1.1 2468\n```\n\n## Requirements\n\nTCPCV has been tested with the following dependencies:\n\n- Node.js v10+\n\n## Installation\n\n```\nnpm install --global tcpcv\n```\n\n## Usage\n\n```\n$ tcpv --help\n\n  TCPCV is a retro-style, text-based server for hosting your resume\n\n  Usage:\n    tcpcv [options]\n\n  Options:\n    --help            Display this help message\n    --motd[=MOTD]     The hero text to display on connection (default: TCPCV)\n    --port[=PORT]     The port to listen on (default: 2468)\n    --resume[=RESUME] Path to the resume file (default: resume.json)\n    --version         Display this application version\n```\n\n### `--motd[=MOTD]`\n\nBy default, when a user connects to a TCPCV server, they are greeted with a generic hero text that we are calling our MOTD. It looks something like this:\n\n```\n  _____ ____ ____   ______     __\n |_   _/ ___|  _ \\ / ___\\ \\   / /\n   | || |   | |_) | |    \\ \\ / /\n   | || |___|  __/| |___  \\ V /\n   |_| \\____|_|    \\____|  \\_/\n```\n\nThe `--motd` option can be used to override this text. For example, `--motd=\"Jean-Luc Picard\"` would change the MOTD to this:\n\n```\n      _                        _                 ____  _                   _\n     | | ___  __ _ _ __       | |   _   _  ___  |  _ \\(_) ___ __ _ _ __ __| |\n  _  | |/ _ \\/ _` | '_ \\ _____| |  | | | |/ __| | |_) | |/ __/ _` | '__/ _` |\n | |_| |  __/ (_| | | | |_____| |__| |_| | (__  |  __/| | (_| (_| | | | (_| |\n  \\___/ \\___|\\__,_|_| |_|     |_____\\__,_|\\___| |_|   |_|\\___\\__,_|_|  \\__,_|\n```\n\n**Note:** Keep in mind that the MOTD is _not_ word-wrapped, so use your best judgement when deciding on its length.\n\n### `--port[=PORT]`\n\nTCPCV is hosted on port `2468` by default, however this can be overridden with the `--port` option. Keep in mind that any port under `1024` is considered a system port, and will require root and is highly discouraged.\n\n**Note:** It may be tempting to bind TCPCV to port `23`, the default Telnet port, however at this time TCPCV does not properly handle IAC commands, which will result in some unexpected behavior. If you'd like to add IAC support, please open a [pull request](https://github.com/zachflower/tcpcv/compare).\n\n### `--resume[=RESUME]`\n\nWithout a resume, TCPCV would be effectively useless, so the `--resume` option is by far the most important. By default, this will look for a file called `resume.json` in the current directory, however you can override the path using this option. [See below](#configuration) more information about the `resume.json` file format.\n\n## Configuration\n\nBy default, TCPCV expects a `resume.json` file in the executing directory to fill out the resume details. At its core, this file allows you to define an arbitrary number of sections—with two different section formats—giving you the flexibility to display the information that _you_ care about. As an example, let's take a look at the `resume.example.json` file in this repository:\n\n```json\n{\n  \"sections\": {\n    \"info\": {\n      \"title\": \"Info\",\n      \"description\": \"Personal information\",\n      \"data\": [\n        \"Name: Jean-Luc Picard\",\n        \"Email: jluc@starfleet.gov\",\n        \"Tea: Earl Grey, Hot\"\n      ]\n    },\n    \"education\": {\n      \"title\": \"Education\",\n      \"description\": \"Education history\",\n      \"data\": [\n        {\n          \"header\": [\n            \"Starfleet Academy\",\n            \"San Francisco, United Earth\"\n          ],\n          \"subheader\": [\n            \"Officer\",\n            \"2323 - 2327\"\n          ]\n        }\n      ]\n    },\n    \"employment\": {\n      \"title\": \"Employment\",\n      \"description\": \"Employment history\",\n      \"data\": [\n        {\n          \"header\": [\n            \"Starfleet\",\n            \"San Francisco, United Earth\"\n          ],\n          \"subheader\": [\n            \"Captain\",\n            \"2333 - 2379\"\n          ],\n          \"body\": \"Ascended from bridge officer to captain on the USS Stargazer. Commanded the Stargazer for two decades. Creator of the \\\"Picard Maneuver.\\\" Commanded the USS Enterprise-D and Enterprise-E, exploring the great, unexplored mass.\"\n        }\n      ]\n    }\n  }\n}\n```\n\nWhen parsed, this file is rendered for the end-user like so:\n\n```\n$ resume\n\n--------------------------------------------------------------------------------\nInfo\n--------------------------------------------------------------------------------\nName: Jean-Luc Picard\nEmail: jluc@starfleet.gov\nTea: Earl Grey, Hot\n\n--------------------------------------------------------------------------------\nEducation\n--------------------------------------------------------------------------------\nStarfleet Academy                                    :  San Francisco, United Earth\nOfficer                                              :  2323 - 2327\n\n--------------------------------------------------------------------------------\nEmployment\n--------------------------------------------------------------------------------\nStarfleet                                            :  San Francisco, United Earth\nCaptain                                              :  2333 - 2379\n    Ascended from bridge officer to captain on the USS Stargazer. Commanded the\n    Stargazer for two decades. Creator of the \"Picard Maneuver.\" Commanded the\n    USS Enterprise-D and Enterprise-E, exploring the great, unexplored mass.\n```\n\n### String Blocks\n\nAs you can see, when a raw `string` is defined in a section's `data` block, it gets rendered exactly as written:\n\n```json\n\"data\": [\n  \"Name: Jean-Luc Picard\",\n  \"Email: jluc@starfleet.gov\",\n  \"Tea: Earl Grey, Hot\"\n]\n```\n\nBecomes:\n\n```\nName: Jean-Luc Picard\nEmail: jluc@starfleet.gov\nTea: Earl Grey, Hot\n```\n\n### Object Blocks\n\nAlternatively, a more structured format can be used to make the output a little cleaner:\n\n```json\n\"data\": [\n  {\n    \"header\": [\n      \"Starfleet\",\n      \"San Francisco, United Earth\"\n    ],\n    \"subheader\": [\n      \"Captain\",\n      \"2333 - 2379\"\n    ],\n    \"body\": \"Ascended from bridge officer to captain on the USS Stargazer. Commanded the Stargazer for two decades. Creator of the \\\"Picard Maneuver.\\\" Commanded the USS Enterprise-D and Enterprise-E, exploring the great, unexplored mass.\"\n  }\n]\n```\n\nBecomes:\n\n```\nStarfleet                                            :  San Francisco, United Earth\nCaptain                                              :  2333 - 2379\n    Ascended from bridge officer to captain on the USS Stargazer. Commanded the\n    Stargazer for two decades. Creator of the \"Picard Maneuver.\" Commanded the\n    USS Enterprise-D and Enterprise-E, exploring the great, unexplored mass.\n```\n\nThe `header` and `subheader` values allow you to cleanly separate names, titles, locations, and dates in a clearly readable format, while the `body` value can be filled out to provide more detail about the entry—and, for the record, `body` is word-wrapped at `76` characters, so you don't have to worry about formatting.\n\n**Note:** It's important to note that the `header`, `subheader`, and `body` values are all optional, so you can have a little control, over what gets displayed and where.\n\n## Contributing\n\nPlease read through the [contributing guidelines](https://github.com/zachflower/tcpcv/blob/master/.github/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.\n\n## Support\n\nThe [issue tracker](https://github.com/zachflower/tcpcv/issues) is the preferred channel for bug reports, feature requests and submitting pull requests.\n\n## License\n\nTCPCV is licensed under the MIT License.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzachflower%2Ftcpcv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzachflower%2Ftcpcv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzachflower%2Ftcpcv/lists"}