{"id":15945652,"url":"https://github.com/klieret/ppserver","last_synced_at":"2026-05-14T12:36:29.592Z","repository":{"id":40451146,"uuid":"399012911","full_name":"klieret/ppserver","owner":"klieret","description":"A small server that helps to keep track of story lines and characters (NPCs) in my pen \u0026 paper game. The underlying data is collaboratively maintained in google sheets.","archived":false,"fork":false,"pushed_at":"2026-04-06T22:58:03.000Z","size":347,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-07T00:29:43.052Z","etag":null,"topics":["dungeons-and-dragons","flask","graph","network","penandpaper","tabletop","tabletop-rpg-utility","tabletop-rpgs"],"latest_commit_sha":null,"homepage":"","language":"Python","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/klieret.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-08-23T07:32:11.000Z","updated_at":"2021-11-02T10:15:46.000Z","dependencies_parsed_at":"2024-02-08T20:49:19.657Z","dependency_job_id":"cd9d9a53-9902-48a0-b310-b5e637e5ab62","html_url":"https://github.com/klieret/ppserver","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/klieret/ppserver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klieret%2Fppserver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klieret%2Fppserver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klieret%2Fppserver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klieret%2Fppserver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/klieret","download_url":"https://codeload.github.com/klieret/ppserver/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klieret%2Fppserver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33025371,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"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":["dungeons-and-dragons","flask","graph","network","penandpaper","tabletop","tabletop-rpg-utility","tabletop-rpgs"],"created_at":"2024-10-07T09:05:09.883Z","updated_at":"2026-05-14T12:36:29.544Z","avatar_url":"https://github.com/klieret.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ppserver\n\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/klieret/ppserver/main.svg)](https://results.pre-commit.ci/latest/github/klieret/ppserver/main) [![PR welcome](https://img.shields.io/badge/PR-Welcome-%23FF8300.svg)](https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project) [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black) [![License](https://img.shields.io/github/license/klieret/ppserver.svg)](https://github.com/klieret/ppserver/blob/main/LICENSE.txt)\n\n`ppserver` is a small [`flask`](https://flask.palletsprojects.com/) server that helps to keep track of story lines and characters ([NPCs](https://en.wikipedia.org/wiki/Non-player_character)) in my [pen \u0026 paper game](https://en.wikipedia.org/wiki/Tabletop_role-playing_game). The underlying data is collaboratively maintained in google sheets.\n\n## Video\n\n[![video screenshot](readme_assets/video.png)](https://www.youtube.com/watch?v=Bz6TbnL1mEU)\n\n## Setup\n\n### Installing this package\n\nClone the repository and run\n\n```python3\npip3 install -e .\n```\n\n### Data you need\n\n`ppserver` works of two separate google sheets:\n\n#### `characters`\n\nThis table lists all characters in your adventures. It should have the following columns:\n\n1. `Name`\n2. `Description`\n3. `Race`\n4. `Appeared` (date of first appearance)\n5. `Locations` (comma separated if more than one location)\n6. `Keywords` (comma separated if more than one)\n\nThe following keywords are allowed:\n\n* `player` (this is not a NPC but a player character)\n* `dead` (character is deceased)\n\n#### `relations`\n\nThis table lists the relationships between characters. It should have the following columns:\n\n1. `Actor` (who is the relationship originating from)\n2. `Relation` (what is the relation)\n3. `Target` (target of the the relation)\n4. `Extra` (additional keywords, comma separated if more than one)\n\nThe following keywords are allowed:\n\n* `bi` (draw a bidirectional arrow rather than a normal arrow pointing from actor to target)\n\n### Google API\n\nFollow [these instructions](https://docs.gspread.org/en/latest/oauth2.html#enable-api-access-for-a-project). This involves two steps:\n\n* Creating the certificate json file and downloading it to your computer\n* Sharing the google sheets with the email address from your service account\n\n\n### Config file\n\nPlace the following file at `~/.ppserver.yaml`:\n\n```yaml\n# \"share with edit rights\" link to the characters sheet\ncharacter_sheet_link: https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/edit?usp=sharing\n# file name of this sheet in your google drive\ncharacter_sheet_name: characters\n# \"share with edit rights\" link to the relations sheet\nrelations_sheet_link: https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/edit?usp=sharing\n# file name of this sheet in your google drive\nrelations_sheet_name: relations\n# path to your certificate file\ncertificate_path: /home/X/Y/Z/pen-and-paper-xxxxxx-yyyyyyyyyyyy.json\n```\n\n## License\n\nMIT license [![License](https://img.shields.io/github/license/klieret/ppserver.svg)](https://github.com/klieret/ppserver/blob/main/LICENSE.txt).\n\nThis repository contains `vis-network.min.js` from the [vis-network](https://github.com/visjs/vis-network) project. Its MIT license is tracked as `vis_js_license.txt`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklieret%2Fppserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fklieret%2Fppserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklieret%2Fppserver/lists"}