Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
name: Bug Report
about: Report a bug in tcfs
title: ""
labels: bug
assignees: ""
---

## Describe the bug

<!-- A clear description of what the bug is -->

## To reproduce

1.
2.
3.

## Expected behavior

<!-- What you expected to happen -->

## Environment

- **OS**: <!-- e.g., Ubuntu 24.04, macOS 15, Rocky Linux 10 -->
- **tcfs version**: <!-- `tcfs --version` -->
- **Install method**: <!-- Nix, .deb, .rpm, cargo build, container -->
- **Storage backend**: <!-- SeaweedFS, MinIO, AWS S3 -->

## Logs

<!-- Paste relevant output from `tcfsd` or `tcfs` (redact credentials) -->

```
```
23 changes: 23 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
name: Feature Request
about: Suggest a new feature or improvement
title: ""
labels: enhancement
assignees: ""
---

## Problem

<!-- What problem does this solve? What use case does it address? -->

## Proposed solution

<!-- Describe what you'd like to happen -->

## Alternatives considered

<!-- Any alternative approaches you've thought about -->

## Additional context

<!-- Anything else: screenshots, links, related issues -->
19 changes: 19 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
## Summary

<!-- Brief description of what this PR does and why -->

## Changes

-

## Test plan

- [ ] `task test` passes locally
- [ ] `task lint` passes locally
- [ ] Verified affected functionality manually

## Checklist

- [ ] Docs updated (if user-facing behavior changed)
- [ ] CHANGELOG.md updated (if applicable)
- [ ] No secrets or credentials in diff
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Rust monorepo with 13 workspace crates
- Rust monorepo with 14 workspace crates
- Core daemon (`tcfsd`) with gRPC over Unix domain socket
- CLI (`tcfs`): `status`, `config show`, `push`, `pull`, `sync-status`, `mount`, `unmount`, `unsync`
- FUSE driver for Linux with on-demand hydration via `.tc` stubs
Expand Down
36 changes: 18 additions & 18 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ members = [
]

[workspace.package]
version = "0.3.0"
version = "0.5.0"
edition = "2021"
authors = ["TummyCrypt Contributors"]
license = "MIT OR Apache-2.0"
Expand Down
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ sudo dpkg -i tcfs-*.deb
sudo rpm -i tcfsd-*.rpm

# Container (K8s worker mode)
podman pull ghcr.io/tinyland-inc/tcfsd:v0.3.0
podman pull ghcr.io/tinyland-inc/tcfsd:latest

# Nix
nix build github:tinyland-inc/tummycrypt
Expand Down Expand Up @@ -108,7 +108,7 @@ tummycrypt/
├── Taskfile.yaml # Build tasks (task --list)
├── docker-compose.yml # Local dev stack
├── .sops.yaml # SOPS encryption rules
├── crates/ # Rust workspace members (13 crates)
├── crates/ # Rust workspace members (14 crates)
│ ├── tcfs-core/ # Shared types, config, protobuf definitions
│ ├── tcfs-crypto/ # XChaCha20-Poly1305 encryption, key derivation
│ ├── tcfs-secrets/ # SOPS/age/KDBX + device identity/registry
Expand All @@ -118,6 +118,7 @@ tummycrypt/
│ ├── tcfs-fuse/ # FUSE driver (Linux)
│ ├── tcfs-cloudfilter/ # Windows CFAPI (skeleton)
│ ├── tcfs-sops/ # SOPS+age fleet secret propagation
│ ├── tcfs-file-provider/ # macOS/iOS FileProvider FFI (RFC 0002)
│ ├── tcfsd/ # Daemon binary (gRPC + metrics + systemd)
│ ├── tcfs-cli/ # CLI binary (tcfs)
│ ├── tcfs-tui/ # TUI binary (ratatui dashboard)
Expand Down Expand Up @@ -171,7 +172,7 @@ tummycrypt/

```bash
task build # Build all Rust crates
task test # Run all tests (133 tests + 18 proptest properties)
task test # Run all tests (150 tests + 18 proptest properties)
task lint # Clippy + rustfmt check
task deny # License + advisory check
task check # All of the above
Expand Down
4 changes: 2 additions & 2 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ task docs:pdf

## Overview

tcfs is a Rust monorepo of 13 workspace crates organized around a daemon (`tcfsd`) that exposes 11 gRPC RPCs over a Unix domain socket. The daemon manages FUSE mounts, coordinates with SeaweedFS via OpenDAL, and synchronizes state across a device fleet using NATS JetStream with vector clocks. Clients (CLI, TUI, MCP server) connect to the daemon via gRPC. Files are content-addressed using FastCDC chunking with BLAKE3 hashes, compressed with zstd, and encrypted with XChaCha20-Poly1305 before upload.
tcfs is a Rust monorepo of 14 workspace crates organized around a daemon (`tcfsd`) that exposes 11 gRPC RPCs over a Unix domain socket. The daemon manages FUSE mounts, coordinates with SeaweedFS via OpenDAL, and synchronizes state across a device fleet using NATS JetStream with vector clocks. Clients (CLI, TUI, MCP server) connect to the daemon via gRPC. Files are content-addressed using FastCDC chunking with BLAKE3 hashes, compressed with zstd, and encrypted with XChaCha20-Poly1305 before upload.

## Quick Reference

See the [Architecture PDF](https://github.com/tinyland-inc/tummycrypt/actions/workflows/docs.yml) for full details including:

- System architecture (client + server components)
- Crate map (13 workspace crates)
- Crate map (14 workspace crates)
- Stub file format specification
- Hydration sequence
- Credential chain
Expand Down
6 changes: 4 additions & 2 deletions docs/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ integration tests (S3 access key, secret key, endpoint, bucket name).

## Project Structure

The workspace is split into 13 crates under `crates/`:
The workspace is split into 14 crates under `crates/`:

| Crate | Type | Description |
|-------|------|-------------|
Expand All @@ -70,6 +70,7 @@ The workspace is split into 13 crates under `crates/`:
| `tcfs-fuse` | lib | Linux FUSE driver (fuse3 crate) |
| `tcfs-cloudfilter` | lib | Windows Cloud Files API (skeleton) |
| `tcfs-sops` | lib | SOPS+age fleet secret propagation |
| `tcfs-file-provider` | lib | macOS/iOS FileProvider FFI (RFC 0002) |
| `tcfsd` | bin | Daemon: gRPC, FUSE, metrics, systemd notify |
| `tcfs-cli` | bin | CLI: push, pull, mount, unmount, status, device management |
| `tcfs-tui` | bin | Interactive terminal UI (ratatui) |
Expand Down Expand Up @@ -105,6 +106,7 @@ cargo clippy --workspace --all-targets --fix # Auto-fix lints

```bash
# Start the dev stack (SeaweedFS + NATS + Prometheus + Grafana)
# This runs docker-compose with the local dev infrastructure
task dev

# In another terminal, run the daemon
Expand All @@ -118,7 +120,7 @@ cargo run -p tcfs-cli -- mount seaweedfs://localhost:8333/tcfs /tmp/tcfs-mount

## Pull Request Guidelines

1. **Branch from** `main`
1. **Branch from** `main` (use `sid/` prefix for feature branches)
2. **Run checks locally** before pushing: `task check` (fmt + clippy + test + build)
3. **Keep PRs focused** - one feature or fix per PR
4. **Add tests** for new functionality
Expand Down
8 changes: 5 additions & 3 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ sudo rpm -i tcfsd-*.rpm
### Container (K8s worker mode)

```bash
podman pull ghcr.io/tinyland-inc/tcfsd:v0.3.0
podman pull ghcr.io/tinyland-inc/tcfsd:latest
```

### From Source
Expand Down Expand Up @@ -122,15 +122,17 @@ Build locally: `task docs:pdf` (outputs to `dist/docs/`)
### RFCs

- [RFC 0001: Fleet Sync Integration](rfc/0001-fleet-sync-integration.md) — multi-machine sync design and rollout plan
- [RFC 0002: Darwin FUSE Strategy](rfc/0002-darwin-fuse-strategy.md) — FileProvider as primary macOS/iOS path
- [RFC 0003: iOS File Provider](rfc/0003-ios-file-provider.md) — UniFFI bridge and .appex architecture

## Platform Support

| Platform | Status | Notes |
|----------|--------|-------|
| Linux x86_64 | Full | FUSE mount, CLI, daemon, TUI, MCP |
| Linux aarch64 | Full | FUSE mount, CLI, daemon, TUI, MCP |
| macOS (Apple Silicon) | CLI + FUSE-T | No daemon (gRPC uses Unix socket); FUSE via macFUSE/FUSE-T |
| macOS (Intel) | CLI + FUSE-T | No daemon (gRPC uses Unix socket); FUSE via macFUSE/FUSE-T |
| macOS (Apple Silicon) | CLI + FUSE-T | Daemon over Unix socket; FileProvider extension in progress (RFC 0002) |
| macOS (Intel) | CLI + FUSE-T | Daemon over Unix socket; FileProvider extension in progress (RFC 0002) |
| Windows x86_64 | CLI only | Cloud Files API skeleton; no FUSE or daemon |
| NixOS | Full | Flake + NixOS module + Home Manager module |

Expand Down
Loading
Loading