{"id":21275674,"url":"https://github.com/halimath/fate-core-remote-table","last_synced_at":"2025-07-11T08:30:39.500Z","repository":{"id":40447995,"uuid":"415233068","full_name":"halimath/fate-core-remote-table","owner":"halimath","description":"Remote table for Fate Core roleplaying games","archived":false,"fork":false,"pushed_at":"2024-05-11T10:55:27.000Z","size":8853,"stargazers_count":3,"open_issues_count":4,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-06-21T17:05:07.169Z","etag":null,"topics":["fate","fate-core","remote-play","rpg"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/halimath.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}},"created_at":"2021-10-09T07:14:09.000Z","updated_at":"2024-05-10T08:11:20.000Z","dependencies_parsed_at":"2024-06-21T15:42:33.355Z","dependency_job_id":"63e13465-eb2e-4a8f-b643-29e3609a2018","html_url":"https://github.com/halimath/fate-core-remote-table","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/halimath%2Ffate-core-remote-table","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/halimath%2Ffate-core-remote-table/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/halimath%2Ffate-core-remote-table/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/halimath%2Ffate-core-remote-table/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/halimath","download_url":"https://codeload.github.com/halimath/fate-core-remote-table/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225707384,"owners_count":17511626,"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":["fate","fate-core","remote-play","rpg"],"created_at":"2024-11-21T09:36:05.840Z","updated_at":"2024-11-21T09:36:06.387Z","avatar_url":"https://github.com/halimath.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fate-core-remote-table\n\n[![CI Status](https://github.com/halimath/fate-core-remote-table/workflows/CI/badge.svg)](https://github.com/halimath/fate-core-remote-table/actions/workflows/ci.yml)\n[![CD Status](https://github.com/halimath/fate-core-remote-table/workflows/CD/badge.svg)](https://github.com/halimath/fate-core-remote-table/actions/workflows/cd.yml)\n\nA virtual remote table for playing [Fate Core](https://www.evilhat.com/home/fate-core/) role playing\ngames.\n\n## About\n\nThis repo contains a web application that supports people playing any kind of _Fate Core_ based role playing\ngame remotely using whatever video conferencing tool they like. This app adds support for\n* rolling fate dice - in case you don't have physical ones\n* manage fate points\n* share _aspects_ with all players\n\n# Architecture\n\nThis application is build from two parts:\n1. a backend service managing data and distributing data update among players\n1. a web frontend consiting of a single page application that can be used with different devices\n\nThe parts communicate using a REST API and communication utilizes the [CQRS](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation#Command_query_responsibility_segregation)\nparadigm. The communication protocol is documented in \n[`docs/api.yaml`](./docs/api.yaml) which is an [OpenAPI](https://www.openapis.org/) spec.\n\n\nThe frontend application uses an internal architecture modeled after the well known _model, view, control_\npattern. A _controller_ receives _messages_ that describe updates to the _model_ and executes them, returning\na new _model_ value to be rendered by the _view_ functions. The weccoframework provides excellent support for\nimplementing this kind of architectures.\n\nThe backend applies an onion architecture style with domain entities in the center, surrounded by use case\nfunctions and persistence and RESTful API placed around that. Currently, persistence is only implemented\n_in-memory_.\n\n# Development\n\nThe backend is implemented using Golang 1.22. The frontend is implemented using\nTypeScript and the [wecco framework](https://weccoframework.github.io). Almost all CSS is coming from\n[Tailwind](https://tailwindcss.com/) with minimal CSS being written to embed the Fate Core font for displaying\ndice results.\n\n## Local Environment\n\nFor being able to develop the app, you should have a local install of\n* Golang \u003e= 1.22\n* Node v20\n* NPM (\u003e=10.5)\n\nYou should also have an IDE which supports Golang and TypeScript. VSCode works perfectly, IntelliJ IDEA works,\ntoo. I haven't tried other IDEs, but the should work the same.\n\nTo get working locally, you should open two terminal windows (or tabs or whatever you use). In the first,\nrun \n\n```\nbackend$ go run .\n```\n\nThis will start the backend on `localhost:8080`.\n\nIn the second terminal, run\n\n```\n$ cd app\napp$ npm i\napp$ npm start\n```\n\n(You need to install dependencies with `npm i` only once or when the `package.json` file changes). This will\nstart the webpack dev server to bring up the frontend on `localhost:9999`. \n\nNow point your browser to [http://localhost:3000](http://localhost:3000) and you can use the app.\n\n## Running Tests\n\nCurrently, we use three different test stages:\n\n* unit tests (currently only implemented for the backend) test components in isolation\n* API tests test the backend API\n* end-to-end-tests test the full application with multiple browser sessions to simulate multiple session\n  participants\n\nThe first two stages are implemented as plain Golang tests.\n\nThe last stage is implemented as Python [Playwright](https://playwright.dev/python/) tests.\n\n## CI/CD\n\nBoth parts of the application are wrapped in a single OCI container build with `podman` (but you can use \nDocker as well). The container build uses multiple stages and builds the whole app as part of the container \nbuild. The final container will only contain the compiled application, though.\n\nWe use [Github Actions](https://github.com/features/actions) to build the application, run the tests, build\nthe container image and publish it to [https://ghcr.io](https://github.com/features/packages).\n\n# License\n\nCopyright 2021 - 2024 Alexander Metzner.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhalimath%2Ffate-core-remote-table","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhalimath%2Ffate-core-remote-table","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhalimath%2Ffate-core-remote-table/lists"}