{"id":26610541,"url":"https://github.com/oxplot/runsheet","last_synced_at":"2025-09-06T16:34:15.826Z","repository":{"id":142061851,"uuid":"124990455","full_name":"oxplot/runsheet","owner":"oxplot","description":"Real-time task scheduler and tracker for time sensitive projects.","archived":false,"fork":false,"pushed_at":"2023-12-18T23:01:46.000Z","size":1263,"stargazers_count":12,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-10T00:05:09.046Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oxplot.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"oxplot"}},"created_at":"2018-03-13T04:06:30.000Z","updated_at":"2023-06-22T04:05:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"c4cd4b94-78ef-49ff-a23b-1b0b4e71196e","html_url":"https://github.com/oxplot/runsheet","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/oxplot/runsheet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxplot%2Frunsheet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxplot%2Frunsheet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxplot%2Frunsheet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxplot%2Frunsheet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oxplot","download_url":"https://codeload.github.com/oxplot/runsheet/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxplot%2Frunsheet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273932748,"owners_count":25193596,"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-06T02:00:13.247Z","response_time":2576,"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":[],"created_at":"2025-03-24T01:48:34.464Z","updated_at":"2025-09-06T16:34:15.815Z","avatar_url":"https://github.com/oxplot.png","language":"JavaScript","readme":"Welcome to Runsheet V2 (RsV2). This guide will help you understand how\nto setup this software and how it works under the hood.\n\n## What is RsV2?\n\nRsV2 is a second iteration, re-written from scratch, of an original\nrunsheet script which given a set of tasks and their dependencies,\nscheduled them in the most time optimized arrangement and provided a UI\nto help tracking the progress of those tasks. You can think of it as a\nsimpler, collaborative and more focused Gantt chart with live task\nstatus updates.\n\n![GitHub Logo](example.gif)\n\n## What can I use it for?\n\nRsV2 can be used to track a weekend roll out for instance. You have a\nbunch of tasks that must be done in a certain order, such as putting up\na maintenance notice, taking systems down, upgrading and testing. RsV2’s\nreal advantage comes into play when multiple people are involved and\nprompt starting and finishing of tasks is of importance.\n\n## Features\n\n* RDBMS backed storage for tasks and runsheets\n* Multiple runsheets per server\n* Lax requirements on how the tasks and runsheets are stored\n* Completely reactive UI with live collaborative features.\n* Automatic time divisions based on total run time\n* Support for variety of database backends\n* Start time and “Behind Schedule” notifications\n* Single Go binary for ease of deployment (not static yet!)\n* Multi-platform support\n\n## Build \u0026 Install\n\n```\ngo generate\ngo install -tags prod\n```\n\n## Quick Demo\n\nRun `runsheet -config example-config.json` and open your browser at\nhttp://localhost:8080\n\n## Setup\n\n### Config\n\nRsV2 is configured using a file named `config.yaml` which must be placed\nin either: same directory as the executable; `/etc/runsheet`;\n`$HOME/.runsheet` or their equivalent locations on other platforms.\n\n`config.yaml` has the following format:\n\n```yaml\n# Optional\nListen: :8080\n\n# A comment starting with hash character\nConnectionUrl: dbdriver://…\nRunsheetsSql: select * from …\n```\n\n`Listen` specifies which interface and port number to listen for\nconnections to serve the UI. `:8080` is the default and means: serve on\nport `8080` on all interfaces. To limit to localhost for instance, you\ncan use `127.0.0.1:8080`.\n\n`ConnectionUrl` specifies which DB driver to use and what parameters to\npass, such as username, password, host and others. Following are\nexamples of `ConnectionUrl`s for various supported databases:\n\n```yaml\n-# Oracle - Oracle Instant Client Basic is required\n-ConnectionUrl: goracle://username/password@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=host.name.com)(PORT=1530)))(CONNECT_DATA=(SERVICE_NAME=MY_SERVICE_NAME)))\n\n# Microsoft SQL\nConnectionUrl: sqlserver://username:password@host.name.com?database=my_db\n\n# SQLite\nConnectionUrl: sqlite3://./relative/path/to/test.db\n```\n\n`RunsheetsSql` is a query or otherwise any valid SQL for the given\ndatabase that retrieves the list of runsheets.\n\n### Runsheet\n\nA **runsheet** is simply a list of tasks and their dependencies.\n`RunsheetsSql` must return the following columns (some optional):\n\n* `id` (string): ID of the runsheet\n* `name` (string)(optional): name or title of the runsheet — supports\n  markdown\n* `description` (string)(optional): runsheet description — supports\n  markdown\n* `connection_url` (string): Same format as `ConnectionUrl` above but\n  for this runsheet\n* `tasks_sql` (string): SQL to get the list of tasks\n* `update_sql` (string): SQL to update status of a task\n* `start_time` (string)(optional): start time and date of the first task\n\nAll column names are case sensitive and `RunsheetsSql` must not retrieve\nany column that is not specified above.\n\n`tasks_sql` is a query or otherwise any valid SQL for the given database\nthat retrieves the list of tasks for the corresponding runsheet.\n\n### Task\n\nA **task** is an undertaking assigned to a specific resource (person)\nand has defined duration in minutes. It may also have dependencies on\nother tasks. `tasks_sql` must return the following columns (some\noptional):\n\n* `id` (string): Task ID\n* `name` (string)(optional): Task name — supports markdown\n* `description` (string)(optional): Task description — supports markdown\n* `assignee` (string): Name of assignee\n* `duration` (number): Task duration in minutes\n* `status` (string): Task status which must be one of `idle`, `ongoing`\n  or `done`\n* `dependees` (string): List of task IDs this task depends on, each\n  separated by `|`\n\nAll column names are case sensitive and `tasks_sql` must not retrieve\nany column that is not specified above.\n\nAs an example of `dependees`: say we have three tasks with IDs of `A`,\n`B` and `C`. If `C` depends on `A` and `B`, then `C`’s record will have\n`A|B` in the `dependees` column.\n\n`update_sql` is a valid SQL for the given database which updates status\nfor a given task. All occurrences of `{{task}}` inside `update_sql` will\nbe replaced with ID of the task whose status is being updated. All\noccurences of `{{status}}` inside `update_sql` will be replaced with the\nnew status of the task. Below is an example:\n\n```\nupdate tasks set \"status\" = '{{status}}' where \"id\" = '{{task}}'\n```\n\nNote that no DB aware substitutions are done. Thus you’re required to\nquote literal string values in your SQL.\n\n`start_time` is a string representation of the start time and date the\nearliest task in the runsheet is to be stamped with. Regular interval\ntimestamps are shown on the left side of a runsheet UI. You may use any\nformat supported by Javascript. Following is recommended: `2018-10-25\n18:10:00 EST` where `EST` defines the time zone, in this case Australian\nEastern Standard Time. You may use an offset instead, such as `+11:00`\nor [other abbreviations](https://www.timeanddate.com/time/zones/).\n","funding_links":["https://github.com/sponsors/oxplot"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxplot%2Frunsheet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foxplot%2Frunsheet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxplot%2Frunsheet/lists"}