Compare commits

..

19 Commits

Author SHA1 Message Date
ee00a3f7f3 feat(start): replace start page with Silo webview (#117)
Some checks failed
Build and Test / build (pull_request) Failing after 1m42s
Updates the silo submodule to include the new dual-mode start page:
- Online: QWebEngineView loads the Silo web app
- Offline: native Qt fallback with recent files and connectivity status

The Start_Start command is overridden from the Silo mod's InitGui.py,
keeping the upstream Start module untouched for easier rebasing.
2026-02-09 10:03:33 -06:00
2255264efc Merge pull request 'fix(docs): update book.toml icon for Font Awesome 6' (#115) from fix/book-toml-fa6 into main
Some checks failed
Deploy Docs / build-and-deploy (push) Successful in 25s
Build and Test / build (push) Failing after 1m22s
Reviewed-on: #115
2026-02-09 15:03:10 +00:00
4186626a05 fix(docs): update book.toml icon for Font Awesome 6
Some checks failed
Build and Test / build (pull_request) Failing after 1m36s
mdBook v0.5 upgraded from Font Awesome 4 to 6 (SVG-based).
The old fa-code-branch class no longer exists. Use fas-code-fork
as recommended by the mdBook docs for non-GitHub repos.
2026-02-09 09:02:47 -06:00
362fe8dc3e Merge pull request 'fix(docs): remove deprecated multilingual field from book.toml' (#114) from fix/book-toml-v05 into main
Some checks failed
Deploy Docs / build-and-deploy (push) Failing after 27s
Build and Test / build (push) Has been cancelled
Reviewed-on: #114
2026-02-09 15:00:34 +00:00
a0cff5102d fix(docs): remove deprecated multilingual field from book.toml
Some checks failed
Build and Test / build (pull_request) Failing after 1m47s
The multilingual field was removed in mdBook v0.5.
2026-02-09 09:00:09 -06:00
539ab7cc51 Merge pull request 'fix(ci): install mdbook in docs runner container' (#113) from fix/docs-install-mdbook into main
Some checks failed
Deploy Docs / build-and-deploy (push) Failing after 30s
Build and Test / build (push) Has been cancelled
Reviewed-on: #113
2026-02-09 14:58:58 +00:00
40bf0e4ae6 fix(ci): install mdbook in docs runner container
Some checks failed
Build and Test / build (pull_request) Failing after 1m37s
The act_runner container does not have mdbook pre-installed.
Download the musl static binary from GitHub releases before
building the docs.
2026-02-09 08:58:38 -06:00
9bd5a7def1 Merge pull request 'fix(ci): use Docker network hostname for docs runner checkout' (#112) from fix/docs-checkout-docker-network into main
Some checks failed
Deploy Docs / build-and-deploy (push) Failing after 31s
Build and Test / build (push) Failing after 1m21s
Reviewed-on: #112
2026-02-09 14:56:02 +00:00
ccc372b2d1 fix(ci): use Docker network hostname for docs runner checkout
Some checks failed
Build and Test / build (pull_request) Failing after 1m42s
The act_runner and gitea containers share the git_default Docker
network. Use http://gitea:3000 (container DNS name) instead of
localhost, which resolves to the runner container itself.
2026-02-09 08:53:39 -06:00
23fd2593af Merge pull request 'fix(ci): use localhost:3000 for docs runner checkout' (#111) from fix/docs-checkout-localhost into main
Some checks failed
Deploy Docs / build-and-deploy (push) Failing after 0s
Build and Test / build (push) Failing after 1m47s
Reviewed-on: #111
2026-02-09 14:47:00 +00:00
c25f1b62b8 fix(ci): use localhost:3000 for docs runner checkout
Some checks failed
Build and Test / build (pull_request) Failing after 1m38s
The docs runner is on the same host as Gitea, so clone via
http://localhost:3000 instead of the public HTTPS URL which
fails to connect (port 443 unreachable from the runner).
2026-02-09 08:46:42 -06:00
10ae616f08 Merge pull request 'fix(ci): add docs workflow file to paths trigger' (#110) from fix/docs-workflow-paths into main
Some checks failed
Deploy Docs / build-and-deploy (push) Failing after 0s
Build and Test / build (push) Has been cancelled
Reviewed-on: #110
2026-02-09 14:43:59 +00:00
d6ad0fb43d fix(ci): add docs workflow file to paths trigger
Some checks failed
Build and Test / build (pull_request) Failing after 1m38s
Changes to .gitea/workflows/docs.yml itself should also trigger
a docs rebuild so workflow fixes are immediately testable.
2026-02-09 08:43:32 -06:00
bbee39431d Merge pull request 'fix(ci): replace actions/checkout with git clone in docs workflow' (#108) from fix/docs-workflow-no-node into main
Some checks failed
Build and Test / build (push) Failing after 2m50s
Reviewed-on: #108
2026-02-09 14:23:39 +00:00
3c0b14b862 Merge branch 'main' into fix/docs-workflow-no-node
Some checks failed
Build and Test / build (pull_request) Has been cancelled
2026-02-09 14:23:27 +00:00
1f793a6b71 Merge pull request 'docs: populate initial content from project context' (#107) from docs/populate-content into main
Some checks failed
Build and Test / build (push) Has been cancelled
Deploy Docs / build-and-deploy (push) Failing after 3s
Reviewed-on: #107
2026-02-09 14:22:44 +00:00
65a2bb98db fix(ci): replace actions/checkout with git clone in docs workflow
Some checks failed
Build and Test / build (pull_request) Has been cancelled
The docs runner is a bare host without Node.js, so actions/checkout@v4
fails with 'Cannot find: node in PATH'. Replace with a plain git
fetch/checkout that works without Node.
2026-02-09 08:20:38 -06:00
c47eb26312 docs: populate initial content from project context (#104)
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Expand documentation pages with real content sourced from the codebase:

- guide/ztools.md: full 16 datum mode reference, all 24+ command classes,
  PartDesign injection table, internal properties, known gaps
- guide/silo.md: all 14 commands with shortcuts, origin capability table,
  architecture diagram, migration inventory, deployment configs, schema docs
- reference/configuration.md: full Silo parameter table, keyboard shortcuts,
  update checker params, theme settings, build config, server config
- introduction.md: added origin system, FreeCAD relationship section,
  expanded theme description
2026-02-09 08:18:21 -06:00
769072fb9d Merge pull request 'docs: initialize mdBook structure with stub pages and deployment workflow' (#105) from docs/mdbook-setup into main
Some checks failed
Deploy Docs / build-and-deploy (push) Failing after 11s
Build and Test / build (push) Has been cancelled
Reviewed-on: #105
2026-02-09 14:02:57 +00:00
7 changed files with 389 additions and 67 deletions

View File

@@ -4,14 +4,31 @@ on:
push:
branches: [main]
paths:
- 'docs/**'
- "docs/**"
- ".gitea/workflows/docs.yml"
jobs:
build-and-deploy:
runs-on: docs
steps:
- name: Checkout
uses: actions/checkout@v4
run: |
REPO_URL="http://gitea:3000/kindred/create.git"
if [ -d .git ]; then
git fetch "$REPO_URL" main
git checkout -f FETCH_HEAD
else
git clone --depth 1 --branch main "$REPO_URL" .
fi
- name: Install mdBook
run: |
if ! command -v mdbook &>/dev/null; then
MDBOOK_VERSION="v0.5.2"
wget -q -O mdbook.tar.gz "https://github.com/rust-lang/mdBook/releases/download/${MDBOOK_VERSION}/mdbook-${MDBOOK_VERSION}-x86_64-unknown-linux-musl.tar.gz"
tar -xzf mdbook.tar.gz -C /usr/local/bin
rm mdbook.tar.gz
fi
- name: Build mdBook
run: mdbook build docs/

View File

@@ -2,7 +2,6 @@
title = "Kindred Create Documentation"
authors = ["Kindred Systems LLC"]
language = "en"
multilingual = false
src = "src"
[build]
@@ -12,6 +11,6 @@ build-dir = "book"
default-theme = "coal"
preferred-dark-theme = "coal"
git-repository-url = "https://git.kindred-systems.com/kindred/create"
git-repository-icon = "fa-code-branch"
git-repository-icon = "fas-code-fork"
additional-css = ["theme/kindred.css"]
no-section-label = false

View File

@@ -1,6 +1,6 @@
# Silo
Silo is an item database and part management system for Kindred Create. It provides revision-controlled storage for CAD files, part number generation, BOM management, and team collaboration.
Silo is an item database and part management system for Kindred Create. It provides revision-controlled storage for CAD files, configurable part number generation, BOM management, and team collaboration.
- **Submodule path:** `mods/silo/`
- **Source:** `git.kindred-systems.com/kindred/silo-mod`
@@ -9,59 +9,196 @@ Silo is an item database and part management system for Kindred Create. It provi
Silo has three components:
```
┌──────────────────────┐ ┌──────────────┐
│ FreeCAD Workbench │────▶│ Go REST API │
│ (Python commands) │ │ (silod) │
└──────────────────────┘ └──────┬───────┘
│ │
│ silo-client │
│ (shared API lib) │
│ ┌─────┴─────┐
│ │ │
│ PostgreSQL MinIO
│ (metadata) (files)
Local .FCStd files
```
- **Go REST API server** (`cmd/silod/`) — 38+ routes, backed by PostgreSQL and MinIO
- **FreeCAD workbench** (`freecad/`) — Python commands integrated into Kindred Create
- **Shared API client** (`silo-client/`) — Python library used by the workbench (nested submodule)
The silo-mod repository was split from a monorepo into three repos: `silo-client` (shared Python API client), `silo-mod` (FreeCAD workbench, used as Create's submodule), and `silo-calc` (LibreOffice Calc extension).
The silo-mod repository was split from a monorepo into three repos: `silo-client` (shared Python API client), `silo-mod` (FreeCAD workbench), and `silo-calc` (LibreOffice Calc extension).
## Workbench commands
### Document lifecycle
| Command | Shortcut | Description |
|---------|----------|-------------|
| `Silo_New` | Ctrl+N | Register a new part — select category, generate part number from schema, optional project tagging |
| `Silo_Open` | Ctrl+O | Search and open items — combined dialog querying both the database and local files |
| `Silo_Save` | Ctrl+S | Save locally to canonical path, collect document properties, upload to MinIO as auto-revision |
| `Silo_Commit` | Ctrl+Shift+S | Save as a new revision with a user-provided comment |
| `Silo_Pull` | — | Download from MinIO with revision selection, conflict detection, and progress tracking |
| `Silo_Push` | — | Batch upload — finds local files not yet synced to the server, compares timestamps |
### Information and management
| Command | Description |
|---------|-------------|
| New | Create a new item in the database |
| Open | Open an item by part number |
| Save | Save the current document locally |
| Commit | Save current state as a new revision with comment |
| Pull | Download an item by part number |
| Push | Batch upload modified files |
| Info | View revision history and metadata |
| BOM | View or edit the bill of materials |
| TagProjects | Tag items with project identifiers |
| Rollback | Revert to a previous revision |
| SetStatus | Change item lifecycle status |
| Settings | Configure Silo server connection |
| Auth | Authenticate with the Silo server |
| `Silo_Info` | Show item metadata, project tags, and revision history table with status and labels |
| `Silo_BOM` | Two-tab view: BOM (children) and Where Used (parents). Add, edit, remove entries with quantity and unit tracking |
| `Silo_TagProjects` | Multi-select dialog for assigning project tags to items |
| `Silo_Rollback` | Select a previous revision and create a new revision from that point with optional comment |
| `Silo_SetStatus` | Change revision lifecycle status: draft → review → released → obsolete |
### Administration
| Command | Description |
|---------|-------------|
| `Silo_Settings` | Full settings UI — API URL, SSL verify, custom CA cert, API token management, authentication status |
| `Silo_Auth` | Session-based login: `/login``/api/auth/me``/api/auth/tokens`; stores API token in preferences |
| `Silo_ToggleMode` | Switch between Silo workbench and other workbenches (menu only) |
## Origin integration
Silo registers as a **file origin** via the `FileOrigin` interface in `src/Gui/`. This makes Silo commands (Commit, Pull, Push, Info, BOM) available in the File menu and Origin Tools toolbar across all workbenches.
Silo registers as a **file origin** via the `FileOrigin` interface in `src/Gui/`. The `SiloOrigin` class in `silo_origin.py` implements:
The registration happens via a deferred QTimer (1500ms after startup) in `src/Mod/Create/InitGui.py`.
| Capability | Value |
|------------|-------|
| `id` | `"silo"` |
| `name` | `"Kindred Silo"` |
| `type` | PLM (1) |
| `tracksExternally` | true |
| `requiresAuthentication` | true |
| `supportsRevisions` | true |
| `supportsBOM` | true |
| `supportsPartNumbers` | true |
| `supportsAssemblies` | true |
The origin delegates to the workbench commands for all operations (new, open, save, commit, pull, push, info, BOM). Registration happens via a deferred QTimer (1500ms after startup) in `src/Mod/Create/InitGui.py`.
## Configuration
The FreeCAD workbench reads configuration from:
### FreeCAD parameters
- `SILO_API_URL` — Server API endpoint (default: `http://localhost:8080/api`)
- `SILO_PROJECTS_DIR` — Local projects directory (default: `~/projects`)
Stored in `User parameter:BaseApp/Preferences/Mod/KindredSilo`:
On first launch, Kindred Create prompts for Silo server configuration via the Settings command.
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `ApiUrl` | String | (empty) | Silo server URL |
| `SslVerify` | Bool | true | Verify SSL certificates |
| `CaCertPath` | String | (empty) | Path to custom CA certificate |
| `ApiToken` | String | (empty) | Stored authentication token |
| `FirstStartChecked` | Bool | false | Whether first-start prompt has been shown |
| `ProjectsDir` | String | `~/projects` | Local directory for checked-out files |
### Environment variables
| Variable | Default | Description |
|----------|---------|-------------|
| `SILO_API_URL` | `http://localhost:8080/api` | Override for server API endpoint |
| `SILO_PROJECTS_DIR` | `~/projects` | Override for local projects directory |
## Server setup
See `mods/silo/README.md` for full server deployment instructions. Quick start:
### Quick start
```bash
# Database setup
# Database setup (apply migrations sequentially)
psql -h psql.kindred.internal -U silo -d silo -f migrations/001_initial.sql
# ... through 010_item_extended_fields.sql
# Configure
cp config.example.yaml config.yaml
# Edit config.yaml with your settings
# Edit config.yaml with your database, MinIO, and auth settings
# Run server
go run ./cmd/silod
```
The server supports LDAP and OIDC authentication, and provides a real-time activity feed via Server-Sent Events (SSE).
### Production deployment
Production configs live in `mods/silo/deployments/`:
```
deployments/
├── config.prod.yaml # Database, MinIO, auth settings
├── docker-compose.prod.yaml # Production container orchestration
├── docker-compose.yaml # Development Docker Compose
└── systemd/
├── silod.env.example # Service environment template
└── silod.service # systemd unit file
```
The systemd service runs as user `silo` with security hardening (`ProtectSystem=strict`, `NoNewPrivileges`, `PrivateTmp`). Config at `/etc/silo/config.yaml`, binary at `/opt/silo/bin/silod`.
### Server stack
- **Go** REST API with 38+ routes
- **PostgreSQL** for metadata, revisions, BOM relationships
- **MinIO** (S3-compatible) for binary `.FCStd` file storage
- **LDAP / OIDC** for authentication
- **SSE** (Server-Sent Events) for real-time activity feed
## Database migrations
Migrations live in `mods/silo/migrations/` as numbered SQL scripts:
| Migration | Purpose |
|-----------|---------|
| `001_initial.sql` | Core schema — items, revisions, properties |
| `002_sequence_by_name.sql` | Part number sequence generation |
| `003_remove_material.sql` | Property cleanup |
| `004_cad_sync_state.sql` | CAD file sync tracking |
| `005_property_schema_version.sql` | Schema versioning for properties |
| `006_project_tags.sql` | Project-to-item relationships |
| `007_revision_status.sql` | Revision lifecycle status tracking |
| `008_odoo_integration.sql` | ERP integration preparation |
| `009_auth.sql` | User authentication tables |
| `010_item_extended_fields.sql` | Extended item metadata |
Apply sequentially: `psql -f migrations/001_initial.sql`, then `002`, etc. There is no automated migration runner — apply manually against the database.
## Part numbering schemas
Part number generation is configured via YAML schemas in `mods/silo/schemas/`:
- `kindred-rd.yaml` — Primary R&D part numbering schema with category codes, sequence segments, and validation rules
- `kindred-locations.yaml` — Location hierarchy schema for physical inventory tracking
## Directory structure
```
mods/silo/
├── cmd/
│ ├── silo/ # CLI tool
│ └── silod/ # API server
├── internal/
│ ├── api/ # HTTP handlers, routes, templates
│ ├── config/ # Configuration loading
│ ├── db/ # PostgreSQL access
│ ├── migration/ # Property migration utilities
│ ├── partnum/ # Part number generation
│ ├── schema/ # YAML schema parsing
│ └── storage/ # MinIO file storage
├── freecad/
│ ├── InitGui.py # SiloWorkbench registration
│ ├── silo_commands.py # 14 commands + dock widgets
│ ├── silo_origin.py # FileOrigin backend
│ └── resources/icons/ # 10 silo-*.svg icons
├── silo-client/ # Shared Python API client (nested submodule)
│ └── silo_client/
│ ├── client.py # SiloClient HTTP wrapper
│ └── settings.py # SiloSettings config management
├── migrations/ # 10 numbered SQL scripts
├── schemas/ # Part numbering YAML schemas
└── deployments/ # Docker Compose + systemd configs
```
## Further reading
- `mods/silo/README.md` — server quickstart and CLI usage
- `mods/silo/ROADMAP.md` — strategic roadmap (6 phases, Q2 2026 → Q4 2027)

View File

@@ -1,48 +1,133 @@
# ztools
ztools is a pure-Python FreeCAD workbench that consolidates part design, assembly, and sketcher tools into a single unified interface.
ztools is a pure-Python FreeCAD workbench that consolidates part design, assembly, and sketcher tools into a single unified interface. It is the **default workbench** when Kindred Create launches.
- **Submodule path:** `mods/ztools/`
- **Source:** `git.kindred-systems.com/forbes/ztools`
- **Stats:** 6,400+ lines of code, 24+ command classes, 33 custom icons, 17 toolbars
## Features
## Commands
### Datum Creator
### Datum Creator (`ZTools_DatumCreator`)
Nine commands for creating datum geometry (planes, axes, points) with 16 creation modes. Modes include offset from face, through three points, normal to edge, and more. These are accessed from the ztools toolbar and are also injected into the PartDesign workbench.
Creates datum geometry (planes, axes, points) with 16 creation modes. The task panel auto-detects the geometry type from your selection and offers appropriate modes. Supports custom naming, spreadsheet linking, and body- or document-level creation.
### Enhanced Pocket
### Datum Manager (`ZTools_DatumManager`)
Extends FreeCAD's Pocket feature with flip-side cutting — the ability to cut outside the sketch profile rather than inside.
Manages existing datums. (Stub — planned for Phase 1, Q1 2026.)
### Assembly Patterns
### Enhanced Pocket (`ZTools_EnhancedPocket`)
Linear and polar patterning tools for assemblies. Create regular arrangements of components without manually placing each one.
Extends FreeCAD's Pocket feature with **Flip Side to Cut** — a SOLIDWORKS-style feature that removes material *outside* the sketch profile rather than inside. Uses a Boolean Common operation internally. Supports all standard pocket types: Dimension, Through All, To First, Up To Face, Two Dimensions. Taper angle is supported for standard pockets (disabled for flipped).
### Spreadsheet Formatting
### Rotated Linear Pattern (`ZTools_RotatedLinearPattern`)
Commands for formatting spreadsheet cells: bold, italic, underline, text alignment, and cell colors. Accessible from the ztools toolbar when a spreadsheet is active.
Creates a linear pattern with incremental rotation per instance. Configure direction, spacing, number of occurrences, and cumulative or per-instance rotation. Source components are automatically hidden.
### Assembly Linear Pattern (`ZTools_AssemblyLinearPattern`)
Creates linear patterns of assembly components. Supports multi-component selection, direction vectors, total length or spacing modes, and creation as Links (recommended) or copies. Auto-detects the parent assembly.
### Assembly Polar Pattern (`ZTools_AssemblyPolarPattern`)
Creates polar (circular) patterns of assembly components. Supports custom or preset axes (X/Y/Z), full circle or custom angle, center point definition, and creation as Links or copies.
### Spreadsheet Formatting (9 commands)
| Command | Action |
|---------|--------|
| `ZTools_SpreadsheetStyleBold` | Toggle bold |
| `ZTools_SpreadsheetStyleItalic` | Toggle italic |
| `ZTools_SpreadsheetStyleUnderline` | Toggle underline |
| `ZTools_SpreadsheetAlignLeft` | Left align |
| `ZTools_SpreadsheetAlignCenter` | Center align |
| `ZTools_SpreadsheetAlignRight` | Right align |
| `ZTools_SpreadsheetBgColor` | Background color picker |
| `ZTools_SpreadsheetTextColor` | Text color picker |
| `ZTools_SpreadsheetQuickAlias` | Auto-create aliases from row/column labels |
## Datum creation modes
### Planes (7 modes)
| Mode | Description | Input |
|------|-------------|-------|
| Offset from Face | Offsets a planar face along its normal | Face + distance (mm) |
| Offset from Plane | Offsets an existing datum plane | Datum plane + distance (mm) |
| Midplane | Plane halfway between two parallel faces | Two parallel faces |
| 3 Points | Plane through three non-collinear points | Three vertices |
| Normal to Edge | Plane perpendicular to an edge at a parameter location | Edge + parameter (0.01.0) |
| Angled | Rotates a plane about an edge by a specified angle | Face + edge + angle (degrees) |
| Tangent to Cylinder | Plane tangent to a cylindrical face at an angular position | Cylindrical face + angle (degrees) |
### Axes (4 modes)
| Mode | Description | Input |
|------|-------------|-------|
| 2 Points | Axis through two points | Two vertices |
| From Edge | Axis along a linear edge | Linear edge |
| Cylinder Center | Axis along the centerline of a cylinder | Cylindrical face |
| Plane Intersection | Axis at the intersection of two planes | Two non-parallel planes |
### Points (5 modes)
| Mode | Description | Input |
|------|-------------|-------|
| At Vertex | Point at a vertex location | Vertex |
| XYZ Coordinates | Point at explicit coordinates | x, y, z (mm) |
| On Edge | Point at a location along an edge | Edge + parameter (0.01.0) |
| Face Center | Point at the center of mass of a face | Face |
| Circle Center | Point at the center of a circular or arc edge | Circular edge |
## PartDesign injection
ztools registers a `_ZToolsPartDesignManipulator` that hooks into the PartDesign workbench at startup. This injects ztools commands into PartDesign's menus and toolbars so they are available without switching workbenches.
ztools registers a `_ZToolsPartDesignManipulator` that hooks into the PartDesign workbench at startup. This injects the following commands into PartDesign's toolbars and menus:
The registration happens in `mods/ztools/ztools/ztools/InitGui.py` when the Create bootstrap module loads addon workbenches.
| PartDesign toolbar | Injected command |
|--------------------|-----------------|
| Part Design Helper Features | `ZTools_DatumCreator`, `ZTools_DatumManager` |
| Part Design Modeling Features | `ZTools_EnhancedPocket` |
| Part Design Transformation Features | `ZTools_RotatedLinearPattern` |
The manipulator is registered in `InitGui.py` when the Create bootstrap module loads addon workbenches.
## Directory structure
```
mods/ztools/
├── ztools/ztools/
│ ├── InitGui.py # Workbench registration + manipulator
│ ├── Init.py # Console initialization
│ ├── commands/ # 9 command implementations
│ ├── datums/core.py # Datum creation (16 modes)
└── resources/ # Icons and theme
└── CatppuccinMocha/ # Theme preference pack
│ ├── InitGui.py # Workbench registration + manipulator
│ ├── Init.py # Console initialization
│ ├── commands/
│ ├── datum_commands.py # DatumCreator + DatumManager
│ ├── datum_viewprovider.py # ViewProvider + edit panel
│ │ ├── pocket_commands.py # EnhancedPocket + FlippedPocket
│ │ ├── pattern_commands.py # RotatedLinearPattern
│ │ ├── assembly_pattern_commands.py # Linear + Polar assembly patterns
│ │ └── spreadsheet_commands.py # 9 formatting commands
│ ├── datums/
│ │ └── core.py # 16 datum creation functions
│ └── resources/ # Icons and theme
└── CatppuccinMocha/ # Theme preference pack
```
## Internal properties
ztools stores metadata on feature objects using these properties (preserved for backward compatibility):
| Property | Purpose |
|----------|---------|
| `ZTools_Type` | Feature type identifier |
| `ZTools_Params` | JSON creation parameters |
| `ZTools_SourceRefs` | JSON source geometry references |
## Known gaps
- Datum Manager is a stub — full implementation planned for Q1 2026
- Datum parameter changes don't recalculate from source geometry yet
- Enhanced Pocket taper angle is disabled for flipped pockets
## Further reading
- `mods/ztools/KINDRED_INTEGRATION.md` — integration architecture notes
- `mods/ztools/ROADMAP.md` — planned features
- `mods/ztools/KINDRED_INTEGRATION.md` — integration architecture and migration options
- `mods/ztools/ROADMAP.md` — phased development plan (Q1Q4 2026)

View File

@@ -13,9 +13,21 @@ Kindred Create is a fork of [FreeCAD](https://www.freecad.org) 1.0+ that adds in
**[Silo](./guide/silo.md)** — A parts database system for managing CAD files, part numbers, revisions, and bills of materials across teams. Includes a Go REST API server backed by PostgreSQL and MinIO, with FreeCAD commands for opening, saving, and syncing files directly from the application.
**Catppuccin Mocha theme** — A dark theme applied across the entire application, including the 3D viewport, sketch editor, spreadsheet view, and tree view.
**Catppuccin Mocha theme** — A dark theme applied across the entire application, including the 3D viewport, sketch editor, spreadsheet view, and tree view. Uses spanning-line branch indicators instead of disclosure arrows, with tuned preference defaults for document handling, selection behavior, and notifications.
**Update checker** — On startup, Kindred Create checks the Gitea releases API for newer versions and logs the result.
**Origin system** — A pluggable file backend abstraction. The origin selector in the File toolbar lets you switch between local filesystem operations and Silo database operations. Silo commands (Commit, Pull, Push, Info, BOM) are available across all workbenches when Silo is the active origin.
**Update checker** — On startup, Kindred Create checks the Gitea releases API for newer versions and logs the result. Configurable check interval and skip-version preferences.
## How it relates to FreeCAD
Kindred Create is a fork/distribution of FreeCAD 1.0+. The design minimizes core modifications — custom functionality is delivered through submodule addons (ztools, Silo) that follow FreeCAD's standard workbench pattern. If the addon submodules are missing, Kindred Create still functions as a themed FreeCAD.
The primary additions to FreeCAD's core are:
- The **origin system** (`FileOrigin` interface in `src/Gui/`) for pluggable file backends
- The **Create bootstrap module** (`src/Mod/Create/`) that loads addons at startup
- The **Catppuccin Mocha theme** (`KindredCreate.qss`) and preference pack
- Patches to **Assembly** (`findPlacement()` datum/origin handling)
## Links

View File

@@ -2,44 +2,116 @@
## Silo workbench
The Silo workbench stores its configuration in FreeCAD's parameter system under `User parameter:BaseApp/Preferences/Mod/KindredSilo`.
### FreeCAD parameters
Stored in `User parameter:BaseApp/Preferences/Mod/KindredSilo`:
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `ApiUrl` | String | (empty) | Silo server API endpoint URL |
| `SslVerify` | Bool | true | Verify SSL certificates when connecting to server |
| `CaCertPath` | String | (empty) | Path to custom CA certificate for self-signed certs |
| `ApiToken` | String | (empty) | Stored authentication token (set by `Silo_Auth`) |
| `FirstStartChecked` | Bool | false | Whether the first-start settings prompt has been shown |
| `ProjectsDir` | String | `~/projects` | Local directory for checked-out CAD files |
### Environment variables
These override the FreeCAD parameter values when set:
| Variable | Default | Description |
|----------|---------|-------------|
| `SILO_API_URL` | `http://localhost:8080/api` | Silo server API endpoint |
| `SILO_PROJECTS_DIR` | `~/projects` | Local directory for checked-out files |
### FreeCAD parameters
### Keyboard shortcuts
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `ApiUrl` | String | (empty) | Silo server URL |
| `FirstStartChecked` | Bool | false | Whether the first-start prompt has been shown |
Recommended shortcuts (prompted on first workbench activation):
| Shortcut | Command |
|----------|---------|
| Ctrl+O | `Silo_Open` — Search and open items |
| Ctrl+N | `Silo_New` — Create new item |
| Ctrl+S | `Silo_Save` — Save locally and upload |
| Ctrl+Shift+S | `Silo_Commit` — Save with revision comment |
## Update checker
Configuration lives in `User parameter:BaseApp/Preferences/Mod/KindredCreate/Update`.
Stored in `User parameter:BaseApp/Preferences/Mod/KindredCreate/Update`:
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `CheckEnabled` | Bool | true | Enable/disable update checks |
| `CheckEnabled` | Bool | true | Enable or disable update checks |
| `CheckIntervalDays` | Int | 1 | Minimum days between checks |
| `LastCheckTimestamp` | String | (empty) | ISO 8601 timestamp of last check |
| `LastCheckTimestamp` | String | (empty) | ISO 8601 timestamp of last successful check |
| `SkippedVersion` | String | (empty) | Version the user chose to skip |
The update checker queries the Gitea releases API at:
The checker queries:
```
https://git.kindred-systems.com/api/v1/repos/kindred/create/releases
https://git.kindred-systems.com/api/v1/repos/kindred/create/releases?limit=10
```
It compares the current version (injected at build time via `version.py.in`) against the latest non-draft, non-prerelease tag. The `latest` rolling tag is ignored. Checks run 10 seconds after GUI startup.
To disable: set `CheckEnabled` to `false` in FreeCAD preferences, or set `CheckIntervalDays` to `0` for on-demand only.
## Theme
The default theme is **Catppuccin Mocha** (`KindredCreate.qss`). It is applied via the KindredCreate preference pack at startup.
The default theme is **Catppuccin Mocha** applied via `KindredCreate.qss`.
To switch themes, go to **Edit > Preferences > General > Stylesheet** and select a different QSS file.
| Setting | Location |
|---------|----------|
| Canonical stylesheet | `src/Gui/Stylesheets/KindredCreate.qss` |
| Preference pack | `src/Gui/PreferencePacks/KindredCreate/` |
| Default theme name | `coal` (in mdBook docs) / `KindredCreate` (in app) |
## Build presets
To switch themes: **Edit > Preferences > General > Stylesheet** and select a different `.qss` file.
See `CMakePresets.json` for available build configurations. The pixi tasks (`configure`, `build`, etc.) use these presets automatically.
The preference pack is synced from the canonical stylesheet at build time via CMake's `configure_file()`. Edits should be made to the canonical file, not the preference pack copy.
## Build configuration
### Version constants
Defined in the root `CMakeLists.txt`:
| Constant | Value | Description |
|----------|-------|-------------|
| `KINDRED_CREATE_VERSION` | `0.1.0` | Kindred Create version |
| `FREECAD_VERSION` | `1.0.0` | FreeCAD base version |
These are injected into `src/Mod/Create/version.py` at build time via `version.py.in`.
### CMake presets
Defined in `CMakePresets.json`:
| Preset | Platform | Build type |
|--------|----------|------------|
| `conda-linux-debug` | Linux | Debug |
| `conda-linux-release` | Linux | Release |
| `conda-macos-debug` | macOS | Debug |
| `conda-macos-release` | macOS | Release |
| `conda-windows-debug` | Windows | Debug |
| `conda-windows-release` | Windows | Release |
### ccache
| Setting | Value |
|---------|-------|
| Max size | 4 GB |
| Compression | zlib level 6 |
| Sloppiness | `include_file_ctime,include_file_mtime,pch_defines,time_macros` |
ccache is auto-detected by CMake at configure time. Clear with `ccache -C`.
## Silo server
Server configuration is defined in YAML. See `mods/silo/deployments/config.prod.yaml` for production settings and `mods/silo/config.example.yaml` for all available options.
Key sections:
- **database** — PostgreSQL connection string
- **storage** — MinIO endpoint, bucket, access keys
- **auth** — LDAP/OIDC provider settings
- **server** — Listen address, TLS, CORS
- **schemas** — Path to part numbering YAML schemas