{"id":46083887,"url":"https://github.com/tensorturtle/fob","last_synced_at":"2026-03-01T16:17:03.553Z","repository":{"id":269026461,"uuid":"886610530","full_name":"tensorturtle/fob","owner":"tensorturtle","description":"Focus Blocks: Beautifully simple CLI app for planning your month using blocks.","archived":false,"fork":false,"pushed_at":"2025-04-05T15:47:08.000Z","size":2004,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-05T08:19:27.081Z","etag":null,"topics":[],"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/tensorturtle.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":"2024-11-11T09:36:22.000Z","updated_at":"2025-04-05T15:47:11.000Z","dependencies_parsed_at":"2024-12-20T12:23:51.019Z","dependency_job_id":"228ed1cb-54f6-41a4-873e-fdd745b76425","html_url":"https://github.com/tensorturtle/fob","commit_stats":null,"previous_names":["tensorturtle/fob"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/tensorturtle/fob","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tensorturtle%2Ffob","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tensorturtle%2Ffob/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tensorturtle%2Ffob/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tensorturtle%2Ffob/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tensorturtle","download_url":"https://codeload.github.com/tensorturtle/fob/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tensorturtle%2Ffob/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29974699,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T15:41:30.362Z","status":"ssl_error","status_checked_at":"2026-03-01T15:37:07.343Z","response_time":124,"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":[],"created_at":"2026-03-01T16:17:02.916Z","updated_at":"2026-03-01T16:17:03.545Z","avatar_url":"https://github.com/tensorturtle.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Focus Blocks\n\n[![Build \u0026 Test](https://github.com/tensorturtle/fob/actions/workflows/tests.yaml/badge.svg?branch=main)](https://github.com/tensorturtle/fob/actions/workflows/tests.yaml)\n[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\n**A CLI program for implementing Focus Blocks in your daily life.**\n\n![](/assets/fob-v0.2.6-sup.png)\n\n# Intro\n\n**Focus Blocks** is my take on time management inspired by Flow State, Pomodoro Technique, Timeboxing, and Deep Work. Please read the [Introduction to Focus Blocks](/FOCUS_BLOCKS.md) first to understand the motivation for the creation of this program.\n\n**`fob`** is a simple CLI program that lets you plan your month, and then visualize \u0026 update your progress within the Focus Blocks time management framework.\n\nIt is written in Python with minimal dependencies and can be installed on Mac, Linux, and Windows.\n\n# Quick Start\n\nFirst, install `uv` (directions [here](https://docs.astral.sh/uv/getting-started/installation/))\n\nInstall the required version of python:\n```\nuv python install 3.12\n```\n\nInstall Focus Blocks:\n```\nuv tool install focus-blocks\n```\n\n\u003e [!WARNING]  \n\u003e Common mistake: The package name is focus-blocks, not fob. Do not do this: `uv tool install fob`\n\nNow, the `fob` program is available from anywhere on the system. Try:\n```\nfob help\n```\n\n## Upgrade\n\nUpgrading focus-blocks doesn't affect the database, so this is safe.\n```\nuv tool upgrade focus-blocks\n```\n\n## Uninstall\n\n```\nuv tool uninstall focus-blocks\n```\n\n# A Day in the Life\n\n#### It's the beginning of a new month - let's set our goals.\n\n![](/assets/fob-v0.2.6-new_month.png)\n\n#### It's a new day! Say good morning!\n\n![](/assets/fob-v0.2.6-gm.png)\n\n#### Check off the first block of the day:\n\n![](/assets/fob-v0.2.6-did-1.png)\n\n#### Let's remind ourselves what the day ahead looks like:\n\n![](/assets/fob-v0.2.6-sup.png)\n\n#### Oops, we couldn't do block 3. Let's change that block to 'Buffer', which is exactly for unforeseen things like this.\n\n![](/assets/fob-v0.2.6-didnt-3.png)\n\n#### Checking off the final block for the day. Great job.\n\n![](/assets/fob-v0.2.6-did-4.png)\n\n#### Come back tomorrow and say good morning to repeat.\n\n# Additional Features\n\n## Cloud Sync\n\nBring your own cloud.\n\n`fob` runs on a single database file. You can store this database on Dropbox or your own cloud. Just pass the path to the `--database` option when running `fob`. For example:\n\n```\nfob --database /home/tensorturtle/Dropbox/my-fob.db help\n```\n\nFor more convenience, you can export a `FOB_DB_PATH` variable in your shell.\nFor example, add the following line to `~/.bashrc` (for bash shell):\n```\nexport FOB_DB_PATH=\"/home/tensorturtle/Dropbox/my-fob.db\"\nsource ~/.bashrc\n```\n\n# Development\n\nInstall uv.\n\nClone this repository:\n\n```\ngit clone https://github.com/tensorturtle/fob.git\n```\n\nRun `fob` without installing it by using `uv run`:\n```\nuv run fob help\n```\n\nRun app in debug mode:\n```\nuv run fob --debug\n```\n\nUse database at custom path:\n```\nuv run fob --database ~/Downloads/testing_fob.db\n```\n\nThe so-called database is actually just a human-readable JSON file. To see its location:\n```\nuv run fob info\n```\n\n## Testing\n\n```\nuvx pytest\n```\n\nThis is an end-to-end test. It installs `fob` to a temporary directory using `install.sh` and runs commands against it. Github Actions is set up to run the same test upon pushing to main branch.\n\n\n## Distribution \n\nUpdate version number in `pyproject.toml` and `utils/utils.py`\n\nBuild and publish package to PyPI:\n```\nrm -r dist/\nuv build\nuv publish --token $TOKEN\n```\n\nWait a moment for PyPI database to be updated (maybe a minute) and run:\n```\nuvx --from focus-blocks@latest fob\n```\n\n## Database Versioning\n\nThis package uses [SemVer](https://semver.org/), with an additional convention:\n\nReleases with the same major-minor (0.0.X) version share the same database schema.\nIf a new major-minor version is released, a new database is created and no migrations occur. The old database is not deleted.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftensorturtle%2Ffob","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftensorturtle%2Ffob","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftensorturtle%2Ffob/lists"}