| Package | Version | Downloads | Python |
|---|---|---|---|
| rehuco-core | |||
| rehuco-node | |||
| rehuco-agent | |||
| borco-core | |||
| borco-pyside |
A personal, distributed catalog for tutorials, references, and creative assets.
The name is the stem of the file formats it owns: .rehu, .rehuco, .rehudb, .rehusw.
rehuco manages a large, heterogeneous personal media collection spread across multiple machines —
local video tutorials, online course registrations, zip archives of reference images, Daz3D plugins,
3D objects, and more. Each resource is described by a .rehu (JSON) sidecar file alongside it. The system
adds a distributed node model and supports offline use, multi-user access control, and a web
interface for tablet access.
Key design properties:
- Self-describing data.
.rehufiles live next to the content they describe. The SQLite cache (.rehudb) is rebuildable from.rehufiles; it is a cache, never the source of truth. - No single always-on machine. The system is a swarm of peer nodes, each capable of answering for itself, each tolerant of any other node being unreachable.
- Offline-first. Borrowing a resource onto a laptop and watching it without any network connection is a first-class use case.
The build is organized into milestones, each mapping to a personal use-case and adding one new architectural spine. See the implementation plan for detail.
| Milestone | What it does |
|---|---|
| LocalEdit (current) | Local viewing and editing of .rehu files — one machine, no network, no login. |
| CacheDB | Scan folders, cache the scan results into a .rehudb database, and search the catalog. Brings the app close to the original tutcatalog. |
| WatchTutorial | Watch tutorials locally, or from a browser/tablet via an embedded web server, with progress remembered. |
| Borrowing | Borrow a copy onto a laptop, watch it offline, and reconcile progress and notes on return — two-party sync (home node ↔ laptop), the minimal reconcile topology. |
| Swarm | The full multi-node swarm — peer discovery, pairing and trust, registry resolution, and N-way sync across many machines. |
| Daz3D | Migrate from the daz3d-personal-database predecessor — import and browse .dpdml files, and install/uninstall Daz3D plugins/extensions. |
Maintenance is tracked separately in audit-run milestones X1, X2, … — each collects the
issues found during the N-th codebase audit. Acquisition tooling and richer reference-image plugins
remain deferred beyond the milestones above.
rehuco/ # uv virtual-workspace root (no [project] table)
├── packages/
│ ├── borco-core/ # generic non-GUI utilities — temporary guest, moving out
│ ├── borco-pyside/ # generic PySide widgets/utilities — temporary guest, moving out
│ ├── rehuco-core/ # shared models, .rehu I/O, field types, sync primitives
│ ├── rehuco-agent/ # PySide6 desktop GUI — tray, viewer/editor, catalog/admin UI
│ └── rehuco-node/ # headless REST service (FastAPI + uvicorn)
├── docs/specs/ # design specs (see the document map)
└── tools/ # repo tooling (mkdocs hooks, slug checker)
rehuco-agent is the PySide6 desktop GUI; it is a node client for swarm operations.
rehuco-core is a shared library.
rehuco-node is the headless service (FastAPI + uvicorn); it runs on capable hardware and mounts
the NAS share — the QNAP TS-230 is storage, not a compute host. Getting the node to run directly
on the NAS would be a nice bonus if it ever proves workable, but nothing depends on it.
| Extension | Purpose |
|---|---|
.rehu |
Per-resource sidecar (JSON). Source of truth. |
.rehuco |
Per-machine config: folder roots, mounts, ownership flags, plugin list. |
.rehudb |
SQLite catalog cache. Derived; rebuildable. |
.rehusw |
Swarm state: membership, users + salted hashes, access rules. Durable. |
| Project | Host | First Commit | Last Commit | Commits | Duration | Language | Qt |
|---|---|---|---|---|---|---|---|
| ibocator | SourceForge | 2010/01/26 | 2010/07/19 | 427 | 3 months | C++ | Qt4 |
| tutcatalog | GitLab | 2016/08/09 | 2020/09/30 | 743 | 4 years | C++ | Qt5 |
| tutcatalog (v3) | GitLab | 2017/05/02 | 2017/05/29 | 81 | 1 month | C++/Python | Qt5 |
| tutcatalogpy | GitLab | 2020/08/19 | 2021/01/28 | 407 | 6 months | Python | Qt5 |
| TutCatalogPy2 | GitLab | 2021/06/01 | 2022/01/04 | 392 | 7 months | Python | Qt5 |
| daz3d-personal-database | GitLab | 2022/01/01 | 2023/11/11 | 754 | 1 year 10 months | Python | Qt6 |
| tutcatalogpy3 | GitLab | 2022/02/07 | 2022/07/28 | 205 | 6 months | Python | Qt6 |
| tutcatalog4 | GitLab | 2022/09/19 | 2024/12/22 | 519 | 2 years 3 months | C++/Python | Qt6 |
| daz3d-personal-database-2 | GitLab | 2023/05/10 | 2023/09/16 | 1053 | 4 months | Python | Qt6 |
| tutcatalog5 | GitLab | 2024/12/22 | 2025/04/15 | 408 | 4 months | Python | Qt6 |
| resource-hub | GitLab | 2026/04/27 | 2026/06 | 449 | 2 months | Python | Qt6 |
| rehuco | GitHub | 2026/06 | present | Python | Qt6 |
GitHub mirrors: tutcatalog (v3) · TutCatalogPy2