# jax-daemon

CLI and daemon for end-to-end encrypted P2P storage buckets.

## Installation

```bash
cargo install jax-daemon
```

## Quick Start

```bash
# Initialize configuration
jax init

# Start the daemon
jax daemon

# Create a bucket
jax bucket create my-bucket

# Add files
jax bucket add <bucket-id> ./file.txt

# List contents
jax bucket ls <bucket-id>
```

## Commands

### Global Options

```bash
jax [OPTIONS] <COMMAND>

Options:
  --remote <URL>       API endpoint (default: http://localhost:3000)
  --config-path <PATH> Config directory (default: ~/.jax)
```

### init

Initialize a new jax configuration directory.

```bash
jax init
```

Creates `~/.jax/` with identity keypair and local database.

### daemon

Start the background service with HTTP API, P2P networking, and web UI.

```bash
jax daemon
```

### daemon --gateway-only

Start a minimal gateway service for content serving only (no UI, no API).

```bash
jax daemon --gateway-only

# Or with full daemon + gateway on separate port
jax daemon --gateway --gateway-url http://localhost:9090
```

The gateway provides:
- P2P peer syncing (mirror role)
- `/gw/:bucket_id/*path` for serving published bucket content with HTML file explorer
- `/_status/livez`, `/_status/readyz`, `/_status/identity` health endpoints
- Content negotiation (`Accept: application/json` for JSON responses)
- `?download=true` query param for raw file downloads

Use `--gateway-only` for lightweight deployments when you only need content serving without the full daemon features.

### version

Display version information.

```bash
jax version
```

## Bucket Commands

### create

```bash
jax bucket create <NAME>
```

### list

```bash
jax bucket list
```

### add

```bash
jax bucket add <BUCKET_ID> <SOURCE_PATH> [DEST_PATH]

# Examples
jax bucket add abc123 ./photo.jpg              # Adds as /photo.jpg
jax bucket add abc123 ./photo.jpg /images/     # Adds as /images/photo.jpg
```

### ls

```bash
jax bucket ls <BUCKET_ID> [PATH]
```

### cat

```bash
jax bucket cat <BUCKET_ID> <PATH>
```

### share

```bash
jax bucket share <BUCKET_ID> --public-key <PEER_PUBLIC_KEY> [--role <ROLE>]

# Roles: owner (full access), mirror (read after publish)
```

### clone

```bash
jax bucket clone <TICKET>
```

### sync

```bash
jax bucket sync <BUCKET_ID>
```

## HTTP API

When the daemon is running, it exposes a REST API at `http://localhost:3000`:

### Health

```
GET /health/live
GET /health/ready
GET /health/version
```

### Bucket API (v0)

```
POST   /api/v0/bucket/create
GET    /api/v0/bucket/list
POST   /api/v0/bucket/:id/add
GET    /api/v0/bucket/:id/ls
GET    /api/v0/bucket/:id/cat
DELETE /api/v0/bucket/:id/delete
POST   /api/v0/bucket/:id/mkdir
POST   /api/v0/bucket/:id/mv
POST   /api/v0/bucket/:id/share
POST   /api/v0/bucket/:id/publish
PUT    /api/v0/bucket/:id/rename
GET    /api/v0/bucket/:id/export
```

## Web UI

The daemon serves a web interface with file explorer, viewer, editor, history, and peer management.

## Gateway

Serves published bucket content over HTTP at `/gw/:bucket_id/*path`.

**Via daemon + gateway:** Run `jax daemon --gateway` to enable gateway on separate port alongside UI and API.

**Via gateway-only:** Run `jax daemon --gateway-only` for standalone gateway (no UI/API).

```bash
# Access content (HTML file explorer)
curl http://localhost:9090/gw/<bucket-id>/

# Access content (JSON)
curl -H "Accept: application/json" http://localhost:9090/gw/<bucket-id>/

# Download raw file
curl "http://localhost:9090/gw/<bucket-id>/file.txt?download=true"
```

Features HTML file explorer, content negotiation, URL rewriting for relative links, and automatic index file serving.

## Configuration

Default location: `~/.jax/`

```
~/.jax/
├── identity.key     # Ed25519 private key
├── database.sqlite  # Local metadata
└── blobs/           # Content-addressed storage
```

## Environment Variables

```bash
RUST_LOG=debug       # Debug logging
RUST_BACKTRACE=1     # Backtraces on panic
```

## License

MIT
