Razvan Dimescu
f849a4d65f
feat: self-host fonts, styled block page, wildcard TLS ( #16 )
...
* perf: optimize hot path — RwLock, inline filtering, pre-allocated strings
- Mutex → RwLock for cache, blocklist, and overrides (concurrent read access)
- Make cache.lookup() and overrides.lookup() take &self (read-only)
- Eliminate 3 Vec allocations per DnsPacket::write() via inline filtering
- Pre-allocate domain strings with capacity 64 in parse path
- Add criterion micro-benchmarks (hot_path + throughput)
- Add bench README documenting both benchmark suites
Measured improvement: ~14% faster parsing, ~9% pipeline throughput,
round-trip cached 733ns → 698ns (~2.3M queries/sec).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* chore: simplify benchmark code after review
- Remove redundant DnsHeader::new() (already set by DnsPacket::new())
- Remove unused DnsHeader import
- Change simulate_cached_pipeline to take &DnsCache (lookup is &self now)
- Remove unnecessary mut on cache in cache_lookup_miss bench
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* site: landing page overhaul, blog, benchmarks, numa.rs domain
Landing page:
- Split features into 3-layer card layout (Block & Protect, Developer Tools, Self-Sovereign DNS)
- Add DoH and conditional forwarding to comparison table
- Fix performance claim (2.3M → 2.0M qps to match benchmarks)
- Add all 3 install methods (brew, cargo, curl)
- Add OG tags + canonical URL for numa.rs
- Fix code block whitespace rendering
- Update roadmap with .onion bridge phase
Blog:
- Add "Building a DNS Resolver from Scratch in Rust" post
- Blog index + template for future posts
Other:
- CNAME for GitHub Pages (numa.rs)
- Benchmark results (bench/results.json)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* feat: self-host fonts, styled block page, wildcard TLS
Fonts:
- Replace Google Fonts CDN with self-hosted woff2 (73KB, 5 files)
- Serve fonts from API server via include_bytes! (dashboard works offline)
- Proxy error pages use system fonts (zero external deps when DNS is broken)
- Fix Instrument Serif font-weight: use 400 (only available weight) instead of synthetic bold 600/700
Proxy:
- Styled "Blocked by Numa" page when blocked domain hits the proxy (was confusing "not a .numa domain" error)
- Extract shared error_page() template for 403 + 404 pages (deduplicate ~160 lines of CSS)
TLS:
- Add wildcard SAN *.numa to cert — unregistered .numa domains get valid HTTPS (styled 404 without cert warning)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 02:19:54 +02:00
Razvan Dimescu
5495107c9e
add Windows support (Phase 1)
...
Cross-platform paths: config_dir() uses %APPDATA%, data_dir() uses
%PROGRAMDATA% on Windows. TLS cert directory uses data_dir() instead
of hardcoded /usr/local/var/numa. Windows DNS discovery via ipconfig.
Fixed cfg gates from not(macos) to explicit linux to prevent Linux
code compiling on Windows. Added Windows target to CI and release
workflows with zip packaging.
System integration (numa install/service) not yet supported on Windows
— users run numa.exe manually.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-22 08:13:53 +02:00
Razvan Dimescu
3bfcd827ac
add TLS, service persistence, blocking panel, query types
...
- Local TLS: auto-generated CA + per-service certs (explicit SANs, not
wildcards — browsers reject *.numa under single-label TLDs). HTTPS
proxy on :443 via rustls/tokio-rustls. `numa install` trusts CA in
macOS Keychain / Linux ca-certificates.
- Service persistence: user-added services saved to
~/.config/numa/services.json, survive restarts.
- Blocking panel: renamed "Check Domain" to "Blocking" with sources
display, allowlist management UI, unpause button.
- Query types: recognize SOA, PTR, TXT, SRV, HTTPS (type 65) instead
of logging as UNKNOWN.
- Blocklist gzip: reqwest now decompresses gzip responses from CDNs.
- Unified config_dir() in lib.rs for consistent path resolution under
sudo and launchd. TLS certs use /usr/local/var/numa/ (writable as
root daemon).
- Dashboard UX: panel subtitles differentiating overrides vs services,
better placeholders, proxy route display, 600px query log height.
- Deploy: make deploy handles build+copy+codesign+restart cycle.
- Demo: scripts/record-demo.sh for recording hero GIF with CDP.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-21 01:15:07 +02:00