{"id":16686938,"url":"https://github.com/alexreg/factotum","last_synced_at":"2026-04-29T16:02:45.607Z","repository":{"id":63152796,"uuid":"565596072","full_name":"alexreg/factotum","owner":"alexreg","description":"a generic task runner and build tool based on Python scripting","archived":false,"fork":false,"pushed_at":"2023-03-13T03:09:46.000Z","size":66,"stargazers_count":2,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-28T14:44:19.646Z","etag":null,"topics":["build-tool","python","shell","task-runner","terminal"],"latest_commit_sha":null,"homepage":"","language":"Python","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/alexreg.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":"2022-11-13T22:12:11.000Z","updated_at":"2023-07-11T22:53:53.000Z","dependencies_parsed_at":"2024-12-18T08:37:43.463Z","dependency_job_id":null,"html_url":"https://github.com/alexreg/factotum","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/alexreg/factotum","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexreg%2Ffactotum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexreg%2Ffactotum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexreg%2Ffactotum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexreg%2Ffactotum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alexreg","download_url":"https://codeload.github.com/alexreg/factotum/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alexreg%2Ffactotum/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32432917,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T13:34:34.882Z","status":"ssl_error","status_checked_at":"2026-04-29T13:34:29.830Z","response_time":110,"last_error":"SSL_read: 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":["build-tool","python","shell","task-runner","terminal"],"created_at":"2024-10-12T15:07:16.913Z","updated_at":"2026-04-29T16:02:45.590Z","avatar_url":"https://github.com/alexreg.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Factotum: *do everything*\n\n**Factotum is a generic task runner and build tool based on Python scripting.**\n\nNo DSL to learn, no strange execution model. Just simple Python.\n\nA Factotum script (*factum*), or a set of tasks, is nothing more than a Python module that imports `factotum`. You define your tasks as functions and structure them like a CLI application. Factotum itself then gives you a user-friendly CLI for executing everything.\n\n## Philosophy\n\nMost task runners and build tools employ some sort of domain-specifc language that makes it easy to do things its designers had in mind, but awkward or even impossible to do anything else. Naturally, such software increases in complexity over time, as support for new scenarios and configurations is added. This tends to give rise to monstrosities of cumbersome syntax, unintuitive semantics, and manifold edge cases and bugs. One ends up with all of the vices and none of the virtues of a general-purpose programming language.\n\nWe cut to the chase and embrace the idea that a powerful and ergonomic task runner should at its heart be a general-purpose programming language. Except we ensure it's a first-rate scripting language by founding everything upon Python. Internally, we leverage the [typer-cloup] library for building CLI applications in order to provide a straightforward yet flexible and composable way to define tasks.\n\n## Examples\n\n```python\n#!/usr/bin/env factotum-script\nfrom factotum import *\n\nfactum = Factum(help=\"Sample script\")\n\n\n@factum.command()\ndef hello(name: str = \"World\", formal: bool = False):\n    \"\"\"Say hello\"\"\"\n    if formal:\n        echo(f\"Good day, {name}\")\n    else:\n        echo(f\"Hello {name}\")\n\n\n@factum.command()\ndef bye(friend: bool = False):\n    \"\"\"Say bye\"\"\"\n    if friend:\n        echo(\"Goodbye, my friend\")\n    else:\n        echo(\"Goodbye\")\n```\n\n[typer-cloup]: https://github.com/alexreg/typer-cloup\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexreg%2Ffactotum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexreg%2Ffactotum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexreg%2Ffactotum/lists"}