195 lines
5.7 KiB
Markdown
195 lines
5.7 KiB
Markdown
# Limitations
|
|
|
|
VaultLink works well for most Obsidian vaults, but has some constraints you should know about.
|
|
|
|
## File Type Limitations
|
|
|
|
### Mergeable Files
|
|
|
|
Only **`.md`** and **`.txt`** files get automatic conflict-free merging.
|
|
|
|
For other file types, a one-sided change is retained. Concurrent unmergeable
|
|
changes keep the server's version and archive displaced local bytes for recovery.
|
|
Review recovery artifacts when both devices edit a binary file.
|
|
|
|
### Binary Detection
|
|
|
|
Files are treated as binary if they:
|
|
|
|
- Contain NUL bytes (`0x00`)
|
|
- Fail UTF-8 validation
|
|
|
|
Binary files within `.md` or `.txt` extensions follow the same unmergeable-content policy.
|
|
|
|
## Performance Constraints
|
|
|
|
### Server Limits (Configurable)
|
|
|
|
| Resource | Default | Maximum Tested |
|
|
| ------------------------ | ------- | -------------- |
|
|
| Clients per vault | 256 | ~256 |
|
|
| Database connections | 12 | 20 |
|
|
| Max file size | 512 MB | 4096 MB |
|
|
| Request timeout | 60s | 180s |
|
|
| WebSocket cursor timeout | 60s | 300s |
|
|
| Database busy timeout | 3600s | - |
|
|
|
|
### Vault Size
|
|
|
|
- **Small vaults** (< 1000 files): Excellent performance
|
|
- **Medium vaults** (1000-10000 files): Good performance
|
|
- **Large vaults** (> 10000 files): Works, but initial sync slower
|
|
|
|
No hard file count limit—constrained by disk space and sync time.
|
|
|
|
### Resource Usage
|
|
|
|
Rough estimates (varies by vault size and activity):
|
|
|
|
- **RAM**: ~50-200 MB base + ~1-5 MB per active client
|
|
- **CPU**: Low (< 5%) for typical usage, spikes during merges
|
|
- **Disk**: Vault size + version history (grows over time)
|
|
|
|
## Version History
|
|
|
|
### Storage
|
|
|
|
- All versions stored indefinitely (no automatic cleanup)
|
|
- Each vault is a separate SQLite database
|
|
- Deletion removes file-manifest membership; content history remains readable
|
|
|
|
**Growth**: Version history grows with every change. A 10 MB vault with frequent edits might grow to 100+ MB over months.
|
|
|
|
Active journals, immutable merge bases and request receipts must not be independently deleted. There is no automatic safe history-pruning protocol.
|
|
|
|
### Implications
|
|
|
|
- Disk usage grows over time
|
|
- Database size affects backup time
|
|
- No built-in retention policy
|
|
|
|
## Merge Quality
|
|
|
|
### Text Merging
|
|
|
|
VaultLink uses word-level tokenisation for merging:
|
|
|
|
```markdown
|
|
Parent: "The quick brown fox"
|
|
User A: "The quick red fox"
|
|
User B: "The very quick brown fox"
|
|
Result: "The very quick red fox" ← Both changes preserved
|
|
```
|
|
|
|
**Imperfect scenarios**:
|
|
|
|
- Complex nested Markdown (tables, code blocks)
|
|
- Simultaneous edits to the same sentence
|
|
- Large structural changes (moving sections around)
|
|
|
|
Merged files may require manual review; there is no measured universal conflict-success rate.
|
|
|
|
## Scalability
|
|
|
|
### SQLite Limitations
|
|
|
|
- One SQLite database per vault
|
|
- Single-server architecture (no built-in clustering)
|
|
- Write serialisation through database
|
|
|
|
**For high concurrency**: Consider multiple vaults instead of one massive shared vault.
|
|
|
|
### Horizontal Scaling
|
|
|
|
Not currently supported. Running multiple servers requires manual vault partitioning.
|
|
|
|
## Network Requirements
|
|
|
|
### Latency
|
|
|
|
- Real-time sync typically < 500ms on good connections
|
|
- Mobile/slow networks: 1-5s latency possible
|
|
- Timeout failures on very slow connections (> 60s)
|
|
|
|
### Offline Behaviour
|
|
|
|
- Clients queue changes locally
|
|
- On reconnect, sync all changes since last connection
|
|
- Conflicts resolved automatically (for mergeable files)
|
|
|
|
**Limitation**: No offline conflict preview—merged result appears after reconnect.
|
|
|
|
## Security
|
|
|
|
### No End-to-End Encryption
|
|
|
|
- Server sees all file contents
|
|
- Transport encryption only (WSS/TLS)
|
|
- Trust your server
|
|
|
|
**Workaround**: Self-host on infrastructure you control.
|
|
|
|
### Authentication
|
|
|
|
- Token-based only (no OAuth, SAML, etc.)
|
|
- Tokens configured in server config file
|
|
- No runtime user management
|
|
|
|
## Restored backups
|
|
|
|
Restore server databases while the server is stopped. API v5 clients detect a
|
|
changed history even when version numbers are reused. Clean files reconcile with
|
|
the restored server; unsent edits are preserved as separate local documents.
|
|
Clients and server must be upgraded together. This does not replace independent
|
|
backups or protect against arbitrary physical-media corruption.
|
|
|
|
## Known Edge Cases
|
|
|
|
### Simultaneous Deletes and Edits
|
|
|
|
```
|
|
User A deletes note.md
|
|
User B edits note.md
|
|
Result: Manifest deletion removes the file; unsent edited bytes are retained for recovery.
|
|
```
|
|
|
|
Content updates do not restore deleted membership. The client retains displaced bytes in its local recovery directory.
|
|
|
|
### Large File Uploads
|
|
|
|
Files > 100 MB may time out on slow connections. Increase `response_timeout_seconds` or split large files.
|
|
|
|
### Mobile Sync
|
|
|
|
- Mobile networks may drop WebSocket connections frequently
|
|
- Client auto-reconnects, but causes sync delays
|
|
- Battery impact from constant reconnections
|
|
|
|
## What VaultLink is NOT
|
|
|
|
- **Not a backup solution**: Version history helps but isn't a backup (make backups!)
|
|
- **Not Git**: No branching, no commit messages, no diffs to review before merge
|
|
- **Not encrypted storage**: Server sees everything
|
|
- **Not multi-master**: One server, multiple clients (not peer-to-peer)
|
|
|
|
## Recommendations
|
|
|
|
### Good Use Cases
|
|
|
|
- Personal multi-device sync (< 10 devices)
|
|
- Small team collaboration (< 20 people)
|
|
- Primarily text/Markdown content
|
|
- Trusted server environment
|
|
|
|
### Poor Use Cases
|
|
|
|
- Large teams (> 50 concurrent users per vault)
|
|
- Primarily binary files (images, videos, large PDFs)
|
|
- Untrusted server (need E2E encryption)
|
|
- Highly regulated environments (HIPAA, etc.)
|
|
|
|
## Next Steps
|
|
|
|
- [Server configuration limits →](/config/server)
|
|
- [Advanced tuning →](/config/advanced)
|
|
- [Architecture details →](/architecture/)
|