Commit Graph

228 Commits

Author SHA1 Message Date
43db35e9a2 feat(ui): add animated empty states 2026-07-15 18:34:26 +02:00
7cd125053c feat(shared): polish beta UX copy and friendly errors
Map snackbars to stable user-facing strings, rewrite transfer-oriented
empty states and settings copy, and resource-back progress/status labels.
2026-07-15 03:53:24 +02:00
Hammed Abass
bf81661667 Merge pull request #14 from vnidrop/feat/diagnostics-telemetry
feat(diagnostics): ship production telemetry and bug reporting
2026-07-15 02:49:03 +02:00
502d724743 fix(diagnostics): configure production ingestion safely 2026-07-15 02:36:21 +02:00
24e14565b3 fix(android): package native core for x86_64 2026-07-15 01:35:10 +02:00
37c364d66a fix(shared): keep dense transfer QR codes scannable 2026-07-15 01:10:48 +02:00
b602a3acb6 feat(diagnostics): harden ingestion and delivery 2026-07-15 00:43:49 +02:00
ead4e09a60 feat(shared): add opt-in diagnostics client with compile-time kill switch
Ship client-side telemetry, crash capture, and bug-report assembly behind a
user opt-in, with NoOp transport until Cloudflare is wired. Builds can set
vnidrop.diagnostics.included=false to omit the Share-diagnostics UI and
disable the telemetry/crash auto-upload stack while keeping bug reports.
2026-07-14 08:27:42 +02:00
Hammed Abass
6dd867e43d Merge pull request #13 from vnidrop/fix/security-hardening
fix(security): harden transfer ACL, tickets, and local secret handling
2026-07-13 19:06:49 +02:00
d0c8d8774a fix(security): address medium findings for ACL, limits, and UX
Tighten approve-endpoint to active shares with TTL sessions, reject non-file
FDs, lower default ticket/approval/size caps, show endpoint IDs and Public-mode
warnings, harden Android receive path checks, and run cargo-audit in CI.
2026-07-13 18:54:28 +02:00
e7fb0331b5 fix(security): harden provider ACL, tickets, and local secrets
Close high-severity findings from the security review: default-deny blob
gets for unmapped hashes, map collection members for ACL, fail closed on
unknown access modes, require vnd1 tickets only, redact tickets from events,
exclude Android app-data backups, and tighten secret-file creation.
2026-07-13 18:41:43 +02:00
98375f479a feat(desktop): unify Linux window chrome 2026-07-13 16:43:13 +02:00
76dbff5a7c fix(shared): build only host-compatible targets 2026-07-13 10:17:40 +02:00
Hammed Abass
fe97ad1b8a Merge pull request #12 from vnidrop/feat/macos-unified-window-chrome
feat(desktop): unify macOS window chrome
2026-07-13 08:44:00 +02:00
4059bce3e4 feat(desktop): unify macOS window chrome 2026-07-13 08:34:44 +02:00
Hammed Abass
b90148f6b8 Merge pull request #11 from vnidrop/docs/agents-md
docs: AGENTS.md guides and multi-platform app icons
2026-07-13 00:52:58 +02:00
47e828200e chore: ignore local output/ design exports 2026-07-13 00:44:43 +02:00
9b7d5fd586 chore(branding): add multi-platform app icons and source assets
Wire Android adaptive/webp launchers, iOS AppIcon, and desktop package
icons (macOS icns, Windows ico, Linux png) from a shared assets/ tree.
2026-07-13 00:44:43 +02:00
ff8e046cf7 docs: rewrite AGENTS.md to agents.md / Codex style
Make agent instructions imperative and command-first, add nested
crates/vnidrop and shared guides, and keep compose-skill as the UI
source of truth with VniDrop-specific overrides.
2026-07-12 20:26:31 +02:00
4de004cc1f docs: add root AGENTS.md for future AI collaborators
Capture stack map, hard rules, compose-skill usage, sparse comment
policy, testing/CI commands, git/PR conventions, and anti-patterns so
agents adapt to VniDrop without rediscovering them.
2026-07-12 20:21:44 +02:00
Hammed Abass
938ac0be77 Merge pull request #10 from vnidrop/refactor/split-runtime-module
refactor(core): split runtime into focused modules
2026-07-12 20:09:44 +02:00
a63c64a525 refactor(core): split oversized runtime.rs into focused modules
Break the ~1.7k-line runtime orchestration unit into facade, share,
receive, lifecycle, and provider modules so future send/receive work
stays reviewable. Behavior and UniFFI surface are unchanged.
2026-07-12 19:27:05 +02:00
Hammed Abass
f835b68b95 Merge pull request #9 from vnidrop/feat/step3-remaining
feat(send): finish step 3 — iOS QR/NFC, folders, per-receiver progress
2026-07-12 19:13:35 +02:00
e1abba3fde fix(core): drop active_transfers guard before await in status
Clippy await_holding_lock failed because the sync MutexGuard lived
across the active_shares.lock().await in the RuntimeStatus struct expr.
2026-07-12 19:07:45 +02:00
c348aa1c09 style(core): rustfmt cancel and output_sink test changes 2026-07-12 19:03:31 +02:00
2e6d1fa48e fix(core): stop cancel-during-export test hangs
Signal transfer cancel synchronously before any runtime await, drive
API calls via Handle::block_on so concurrent cancel cannot deadlock a
receive, and rewrite the gated output-sink cancel test to avoid the
slow multi-megabyte write loop that starved CI.
2026-07-12 18:45:22 +02:00
07ec727c23 feat(send): show live progress per receiver
Attribute provider transfer progress to each remote endpoint so the
receivers panel and catalog can show per-peer send bars for multi-file
collections while a share is active.
2026-07-12 18:16:59 +02:00
50d43a3867 feat(send): share folders as multi-file collections
Add folder pickers on Android, iOS, and desktop. Desktop and iOS walk
directory paths in Rust; Android expands SAF trees to per-file FDs
with relative collection paths because directory FDs are unsupported.
2026-07-12 17:57:00 +02:00
d2929fbfbb feat(ios): enable QR and NFC invitation share/receive
Wire Core NFC entitlements and implement invitation ticket export,
QR presentation, and NDEF read/write on iOS so send/receive parity
matches Android.
2026-07-12 17:57:00 +02:00
Hammed Abass
ed9d9ce8c5 Merge pull request #8 from vnidrop/feat/step3-multifile-receivers
feat(send): multi-file shares and receivers polish
2026-07-12 17:41:41 +02:00
d3a5f19ecb feat(send): multi-file shares and receivers polish
Allow selecting multiple files on Android, desktop, and iOS and share them
as one transfer through the core multi-source path. Update the composer UI
for multi-file review, hide unfinished iOS receive methods, and surface
refusal reasons on the receivers list.
2026-07-12 17:03:53 +02:00
Hammed Abass
ceec383473 Merge pull request #7 from vnidrop/fix/ui-cleanup-username
fix(ui): username input and transfer details cleanup
2026-07-12 17:00:29 +02:00
9ffdaeaa50 fix(ui): drop redundant stop-sharing UI and fix username field
Remove the transfer-details progress bar and Stop sharing control now that
delete already revokes a share. Fix preferences username typing by keeping
local draft state and debouncing DataStore writes so trim/races no longer
fight the caret.
2026-07-12 16:33:48 +02:00
Hammed Abass
e114396738 Merge pull request #6 from vnidrop/feat/transfer-progress
feat(ui): transfer progress, cancel, and delivery events
2026-07-12 16:08:43 +02:00
172f244ed4 ci: avoid duplicate workflow runs on pull requests
Limit push triggers to master so PR branch updates only run once via
pull_request, and cancel superseded in-progress runs with concurrency groups.
2026-07-12 15:57:47 +02:00
e1f82c8ef3 feat(ui): surface transfer progress, cancel, and delivery events
Make the transfer loop feel live: parse real core progress payloads, show
progress on send/receive surfaces, allow cancel/stop, retry failed receives,
and fix delivery-phase events so receiver completion updates the UI.
2026-07-12 15:53:51 +02:00
Hammed Abass
443aa7461c Merge pull request #5 from vnidrop/feat/kmp-ci
ci(shared): add thin KMP jvmTest workflow
2026-07-12 15:44:38 +02:00
95eeeb6a23 ci(shared): run jvmTest on pull requests
Add a path-filtered Shared KMP workflow so receive/send ViewModel and
Compose foundation regressions fail CI. Runs on macOS arm64 because host
Rust embedding for Linux JVM is disabled in the Gradle cargo config.
2026-07-12 08:56:30 +02:00
Hammed Abass
5b36de627d Merge pull request #4 from vnidrop/feat/receive-flow
feat(receive): adaptive receive flow and Android Downloads
2026-07-12 08:51:47 +02:00
a79c61b9d7 feat(android): receive into system Downloads via MediaStore
Default Android receive destination is now the shared system Downloads
collection (like desktop), using MediaStore on API 29+ instead of
app-private storage. Legacy app-private defaults are promoted back to
public Downloads so existing installs pick up the fix.
2026-07-12 04:43:34 +02:00
d5d4e37d1c fix(android): make default receive path actually writable
Android emulated storage rejects hard-link commit even when canWrite()
reports success. Fall back to exclusive rename for publish, probe real
writes during folder validation, and label the default app downloads dir
clearly so it is not confused with shared system Downloads.
2026-07-12 04:40:10 +02:00
4050a7c011 fix(receive): harden invitation open path and cover receive loop
Tighten cold-open and in-app invitation handling so ticket acquisition is
stricter and less racey across hosts, and expand automated coverage for the
receive history and acquisition flow before merge.
2026-07-12 04:31:19 +02:00
996cc0a5ab feat(receive): add adaptive receive flow and document opening 2026-07-12 04:15:21 +02:00
757966379b feat(core): add atomic receive history cleanup 2026-07-12 04:15:11 +02:00
Hammed Abass
5580ae7fe9 Merge pull request #3 from vnidrop/feat/ui-next
Harden transfer lifecycle and build the modular send experience
2026-07-11 13:57:58 +02:00
a18b1fb4e8 feat(macos): open transfer invitations in native share sheet 2026-07-11 09:31:41 +02:00
3da91be771 feat(send): build durable transfer details and sharing flow 2026-07-11 09:31:19 +02:00
dc862bc01c feat(core): track delivery receipts and transfer deletion 2026-07-11 09:30:56 +02:00
1e6404abfa fix(ui): present approvals modally and package fresh native builds 2026-07-10 22:06:35 +02:00
b4306d6694 feat(send): build adaptive transfer creation flow 2026-07-10 22:06:31 +02:00