Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
77af7e1
refactor(bench): move the library generator into its own crate
vyrti Aug 14, 2026
85f1dc3
perf(scan): read only the files that changed, and read them in parallel
vyrti Aug 14, 2026
8401d7c
perf(scan): make the five-minute tick cost what changed, not what exists
vyrti Aug 14, 2026
20b079e
perf(database): stop pruning on every batch and re-counting on every …
vyrti Aug 14, 2026
69462bb
fix(lifecycle): stop compacting the database on every shutdown
vyrti Aug 14, 2026
1c91eca
fix(lifecycle): announce the server before scanning the library
vyrti Aug 14, 2026
1c64937
perf(database): drop two indexes nothing queries, and one pointless d…
vyrti Aug 14, 2026
969fba1
docs(config): say that the index cache is per connection
vyrti Aug 14, 2026
4b022ea
perf(web): stop counting the whole result to render one page
vyrti Aug 14, 2026
97ba1ae
perf(watcher): bound the file-id cache instead of indexing the library
vyrti Aug 14, 2026
7bae0de
fix(config): stop the config watcher walking the tree it sits in
vyrti Aug 14, 2026
27279bf
docs(config): correct what cache_mb costs and what it buys
vyrti Aug 14, 2026
3eaaf0f
perf(config): default the index cache to 8 MB
vyrti Aug 14, 2026
2f527d5
perf(scan): count what a scan changed instead of keeping every record
vyrti Aug 14, 2026
21bddca
perf(metrics): stop refreshing every process on the host
vyrti Aug 14, 2026
c6460e1
u
vyrti Aug 14, 2026
87cf201
u
vyrti Aug 14, 2026
0e461a1
perf(scan): read the index a page at a time when validating deletions
vyrti Aug 14, 2026
dad71a2
style(test): drop a trailing blank line rustfmt rejects
vyrti Aug 14, 2026
3c66c1f
refactor(scan): size the read window to the write batch
vyrti Aug 14, 2026
380a2a3
style: satisfy clippy on the new scan and watcher code
vyrti Aug 14, 2026
9f80080
fix(config): watch the config file itself, not only its directory
vyrti Aug 14, 2026
7a1f88a
u
vyrti Aug 14, 2026
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
22 changes: 21 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
[workspace]
members = ["crates/vuio-cast", "crates/vuio-core", "crates/vuio-cli", "crates/vuio-web"]
members = [
"crates/vuio-cast",
"crates/vuio-core",
"crates/vuio-cli",
"crates/vuio-web",
# Development tool, `publish = false`. Kept out of `vuio-cli` so the crate that
# ships the binary does not carry its dependencies.
"crates/vuio-bench",
]

# `vuio-bench` is deliberately not a default member. Cargo unifies features across
# everything it builds in one go, so leaving it in would mean a plain
# `cargo build` — which is what the release pipeline runs — compiling `vuio-core`
# with `unstable-internals` on, for the benefit of a tool that never ships.
# Build it explicitly: `cargo run -p vuio-bench`.
default-members = [
"crates/vuio-cast",
"crates/vuio-core",
"crates/vuio-cli",
"crates/vuio-web",
]
resolver = "2"

[profile.release]
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# VuIO Media Server

A cross-platform media server written in Rust. Streams video, audio, and images to DLNA, Chromecast/Google TV, and compatible AirPlay video receivers.
Less than 18Mb of RAM needed
25Mb of RAM used for 5000 objects library

Built with Tokio, Axum, and SQLite for high performance and reliability.

Expand Down
11 changes: 10 additions & 1 deletion config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,20 @@ recursive = true
# extensions = ["mp3", "flac", "wav"]

[database]
# Reclaim free space in the index at startup and shutdown; rewrites the whole file.
vacuum_on_startup = false
backup_enabled = false
# Omit to use the platform-appropriate default location.
path = "./config/media.db"
# cache_mb = 128 # Megabytes of index kept cached
# Megabytes of index cached, as a budget *per connection* — one writer plus two
# to four readers. Only a connection that runs a large query fills its share, so
# in practice resident memory grows by about this much, not a multiple of it.
# Folder browsing is served from indexes and does not care. Full-text search does:
# on a very large library it stays slow until the whole search index fits, then
# roughly halves. Measured at 500,000 files that threshold was near 192, and
# anything below it cost memory without making search faster — which is why the
# default is small. Raise it past the threshold, or not at all.
# cache_mb = 8

# The modern browser interface, served on a second port beside the built-in
# dashboard. It is a second front end, not a second server: the same API, the
Expand Down
28 changes: 28 additions & 0 deletions crates/vuio-bench/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
[package]
name = "vuio-bench"
version = "0.0.44"
edition = "2021"
authors = ["vyrti"]
description = "Generates large VuIO libraries for performance work. Not published."
license = "MIT OR Apache-2.0"
repository = "https://github.com/vuiodev/vuio"
# A development tool, never a release artifact. It lives in its own crate so that
# the dependencies it needs to write rows quickly — a direct SQLite handle, and
# vuio-core with its internals open — stay off `vuio-cli`, which ships the
# `vuio` binary.
publish = false

[[bin]]
name = "vuio-bench"
path = "src/main.rs"

[dependencies]
anyhow = "1.0"
clap = { version = "4.6", features = ["derive"] }
rusqlite = { version = "0.40.2", features = ["bundled", "collation"] }
tokio = { version = "1.53", features = ["rt-multi-thread", "macros"] }
# `unstable-internals` is what core forbids a *dependent* crate from enabling,
# because it opens every internal module and carries no stability promise. This
# crate is `publish = false` and exists only to drive the database from the
# inside, which is the same category as core's own dev-dependency on itself.
vuio-core = { path = "../vuio-core", version = "0.0.44", features = ["unstable-internals"] }
Loading