{"id":16199331,"url":"https://github.com/j6k4m8/frof","last_synced_at":"2026-02-01T22:31:40.954Z","repository":{"id":73813641,"uuid":"218120176","full_name":"j6k4m8/frof","owner":"j6k4m8","description":"frof runs other frofs","archived":false,"fork":false,"pushed_at":"2024-12-07T19:29:35.000Z","size":119,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-10T04:12:24.198Z","etag":null,"topics":["dag","dependency-manager","frof","job-scheduler","python","queue","slurm","slurm-job-scheduler","workflow","workflow-automation"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/j6k4m8.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"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":"2019-10-28T18:41:38.000Z","updated_at":"2024-12-07T19:29:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"0e7ace71-df67-4104-be11-45694e09953d","html_url":"https://github.com/j6k4m8/frof","commit_stats":{"total_commits":44,"total_committers":2,"mean_commits":22.0,"dds":0.06818181818181823,"last_synced_commit":"f0482e36e6192ab98d6c1ee0f5698870b16adcd0"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/j6k4m8/frof","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j6k4m8%2Ffrof","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j6k4m8%2Ffrof/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j6k4m8%2Ffrof/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j6k4m8%2Ffrof/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/j6k4m8","download_url":"https://codeload.github.com/j6k4m8/frof/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j6k4m8%2Ffrof/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28993253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T22:01:47.507Z","status":"ssl_error","status_checked_at":"2026-02-01T21:58:37.335Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["dag","dependency-manager","frof","job-scheduler","python","queue","slurm","slurm-job-scheduler","workflow","workflow-automation"],"created_at":"2024-10-10T09:25:05.790Z","updated_at":"2026-02-01T22:31:40.938Z","avatar_url":"https://github.com/j6k4m8.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=center\u003e\u003cimg align=center src='docs/frof.png' width=200 /\u003e\u003c/p\u003e\n\u003ch6 align=center\u003efrof runs other frofs\u003c/h6\u003e\n\nfrof is a crazy-simple, zero-config tool to schedule multiple interdependent jobs.\n\n\u003e Note: I wrote frof as an undergraduate in 2015–2016. It was recently updated for Python 3 support, but you may discover that it has some fun surprising bugs anyway!\n\n## overview\n\nLet's generate a simple README.md using `frof`. We create the title in one job, the contents in another job, and then combine them in a third job. The first two must run before the third, but are independent of each other.\n\n`simple.frof`\n```yml\nmake_heading -\u003e combine_files\nmake_content -\u003e combine_files -\u003e cleanup\n\ncombine_files:  cat part_a part_b \u003e new_readme.txt\nmake_heading:   echo \"# frof\" \u003e part_a\nmake_content:   echo \"frof runs other frofs\" \u003e part_b\ncleanup:        rm part_a part_b\n```\n\nRun it with:\n\n```bash\nfrof simple.frof\n```\n\nOptionally get an HTTP server running a status page with:\n\n```bash\nfrof simple.frof --status http\n```\n\n## installation\n\n```\ngit clone https://github.com/j6k4m8/frof.gif\ncd frof\npip3 install -e .\n```\n\nCheck out the [Getting Started Tutorial](docs/tutorial.md) to start getting your hands dirty.\n\n# generating documentation\n\nThe documentation generator for this repository uses frof. You can see a basic example in use by running `frof make-docs.frof` from this directory.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj6k4m8%2Ffrof","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fj6k4m8%2Ffrof","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj6k4m8%2Ffrof/lists"}