- C# 84.9%
- Vue 8.6%
- TypeScript 4.2%
- Shell 1.2%
- CSS 0.8%
- Other 0.2%
- add Shared.Api project and move DTOs into it as per-type files, renaming *ListItem types to *Dto - reorganize Shared.Models: one type per file, entities under Entities/ - restructure stream model: StreamSpec hierarchy (Source/Derived), StreamProfile as persistent entity, MediaTimestamp on NAL units, StreamHierarchy in Server.Core - update plugins, server services, and plugin host to match the new stream model - web setup wizard auto-activates plugins with no schema and stamps active=true on save - web CameraEditView renders metadata-kind streams with inherited recording status - web PluginSettingsView gains a toggle switch for bool fields, with disabled state for boolean-enable-only - apply sVMS / SimpleVMS branding across client titles, placeholders, certificate subjects, tunnel description, README, and CHANGELOG - update tests, docs, and build script accordingly |
||
|---|---|---|
| .config | ||
| .github | ||
| docs | ||
| native/ffmpeg | ||
| scripts | ||
| src | ||
| tests | ||
| .editorconfig | ||
| .gitignore | ||
| build-ct.sh | ||
| build.sh | ||
| CHANGELOG.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| coverage.runsettings | ||
| Directory.Build.props | ||
| Directory.Packages.props | ||
| docker-compose.yml | ||
| LICENSE | ||
| nuget.config | ||
| README.md | ||
| Solution.NoMobile.slnx | ||
| Solution.slnx | ||
SimpleVMS
A network video management system for home and power users. Supports up to 32 cameras on a single node with no transcoding, minimal resource usage, and first-class ONVIF support.
Note: This project is under active development. Not all documented features are implemented yet, and APIs may change without notice.
Highlights
- Zero transcoding -- video passes through as raw data units; the server never decodes or re-encodes
- Single port access -- all native client communication (API, live video, playback, events) multiplexed over one TCP/TLS port
- Plugin-first architecture -- capture, storage, formats, analytics, auth, and notifications are all behind extension point interfaces with no privileged internal code paths
- Cross-platform clients -- native desktop (Windows, Linux, macOS), mobile (Android, iOS), and web UI
- Mutual TLS -- clients authenticate with certificates signed by a server-generated root CA; revocation is immediate
- Network-storage-safe -- sequential writes, no mmap, no flock; runs directly against NFS or SMB mounts
- CPU-only by default -- runs efficiently on hardware without a GPU
Documentation
See the docs/ directory for architecture, deployment, API reference, protocol specification, and more.
Getting Started
Prerequisites
- .NET 10 SDK
- Node.js 22+ (for web UI)
Build
./build.sh build # build
./build.sh test # run tests
./build.sh publish # publish to out/
Run
./out/server/server
./out/server/server --data-path /mnt/nas/data
On first run, the web UI at http://localhost:8080 serves a setup wizard to configure the data provider and generate certificates. After setup, discover cameras or add them manually.
See Deployment for Docker Compose, systemd, and other installation methods.
Technology Stack
| Component | Technology |
|---|---|
| Server | .NET 10, ASP.NET Core (Kestrel) |
| Transport | TCP + TLS 1.3 (SslStream), mutual TLS |
| Serialization | MessagePack (tunnel framing), JSON (API bodies) |
| Database | Pluggable via IDataProvider (SQLite included) |
| Web UI | Vue.js 3 + Vite |
| Native clients | Avalonia UI + LibVLCSharp |
Contributing
See CONTRIBUTING.md for guidelines on submitting changes, issues, etc.
License
This project is licensed under the MIT License.
