Compare commits

..

95 Commits

Author SHA1 Message Date
lashman 6b41f63d12 Add app icons, screenshots, and complete AppStream metainfo 2026-03-01 14:46:41 +02:00
lashman 91efff75bc Rewrite README with better header and project framing 2026-03-01 13:12:45 +02:00
lashman fd0393bf7b Rewrite README with feature documentation 2026-03-01 12:54:55 +02:00
lashman 6b939db37b Change license to CC0-1.0 2026-03-01 12:49:17 +02:00
lashman 4743c3eb8e Remove archived plan documents from tracking 2026-03-01 12:44:35 +02:00
lashman 5c99f3eb77 Add WCAG 2.2 AAA compliance and automated AT-SPI audit tool 2026-03-01 12:44:21 +02:00
lashman 817ecf67be Add tags, export/import, and changelog features 2026-03-01 01:01:43 +02:00
lashman 1da3c08bbe Add design doc for tags, export/import, and changelog improvements 2026-03-01 00:47:14 +02:00
lashman 5112338c0f Add UX enhancements: carousel, filter chips, command palette, and more 2026-03-01 00:39:43 +02:00
lashman 960eab965d Add AppImageHub.com OCS API as primary catalog source 2026-02-28 20:33:40 +02:00
lashman 848f4e7de7 Add GitHub metadata enrichment for catalog apps 2026-02-28 16:49:13 +02:00
lashman f22438d960 Add Launch and Uninstall buttons to detail view header 2026-02-28 01:56:21 +02:00
lashman 174d10772d Use relative time for update_checked in detail view 2026-02-28 01:54:51 +02:00
lashman badffe9b8d Use relative timestamps everywhere instead of raw date strings 2026-02-28 01:52:56 +02:00
lashman 5a4e11a459 Use undo toast for integration removal instead of immediate action 2026-02-28 01:51:40 +02:00
lashman 45b878545a Consolidate preferences into General and Updates pages 2026-02-28 01:50:38 +02:00
lashman d5e8fdcaaa Show updates-available banner in Installed view 2026-02-28 01:48:50 +02:00
lashman 38bac5b8e6 Add Ctrl+1/2/3 keyboard shortcuts for view switching 2026-02-28 01:45:32 +02:00
lashman e07a24c7c8 Default to Catalog tab when library is empty on first launch 2026-02-28 01:44:41 +02:00
lashman ea2354fad5 Replace technical jargon with user-friendly labels in detail view 2026-02-28 01:44:09 +02:00
lashman ba64cb53fa Consolidate detail view from 4 tabs to 2 (About + Details) 2026-02-28 01:42:35 +02:00
lashman 3622243271 Simplify app card badges, remove colored status borders 2026-02-28 01:41:28 +02:00
lashman 67e5c1ed7a Show update count badge on Updates tab in ViewSwitcherBar 2026-02-28 01:40:22 +02:00
lashman 218afbb998 Slim down hamburger menu, move Preferences to bottom section 2026-02-28 01:38:40 +02:00
lashman d2e82caf54 Improve catalog view with relative timestamps, auto-refresh, and installed badges 2026-02-28 01:38:01 +02:00
lashman 1cde1e63d9 Add scan button, sort dropdown, and improved empty state to library view 2026-02-28 01:36:47 +02:00
lashman cbc3463643 Replace single NavigationView with ViewSwitcher (Installed, Catalog, Updates) 2026-02-28 01:33:43 +02:00
lashman 3d349f05b6 Add dedicated Updates view with check-now and update-all 2026-02-28 01:26:10 +02:00
lashman 36ce1ed451 Add relative_time() helper for human-readable timestamps 2026-02-28 01:24:08 +02:00
lashman a4a7464354 Fix catalog refresh: handle null fields in AppImageHub feed JSON 2026-02-28 00:46:39 +02:00
lashman 5e1c10cea3 Clean up unused catalog function and wire source info into catalog view 2026-02-28 00:25:05 +02:00
lashman c82c9ad9e9 Add AppImageHub in-app catalog browser with search, categories, and install 2026-02-28 00:23:36 +02:00
lashman 294420ed65 Add similar app recommendations from shared categories 2026-02-28 00:17:55 +02:00
lashman 10cd5c6a1b Add portable mode with removable media detection and scanning 2026-02-28 00:16:52 +02:00
lashman cb205fa9ee Add update-all, autostart, purge, and verify CLI commands 2026-02-28 00:13:31 +02:00
lashman 9125f7f6f3 Add system-wide installation via pkexec with polkit policy 2026-02-28 00:11:57 +02:00
lashman 4d8e882735 Add default application selector for browsers, email, and file managers 2026-02-28 00:10:39 +02:00
lashman d60fd6bb5e Add first-run permission summary dialog before launch 2026-02-28 00:07:49 +02:00
lashman 557dc6c900 Add download verification with signature and SHA256 support 2026-02-28 00:05:43 +02:00
lashman fe353e1c5d Extract and apply StartupWMClass for proper taskbar icons 2026-02-28 00:02:44 +02:00
lashman a61f976546 Add file type association manager with MIME type support 2026-02-28 00:00:42 +02:00
lashman 05391ea1fe Add FUSE fix wizard with pkexec installation 2026-02-27 23:59:26 +02:00
lashman 5884453c42 Add icon preview to drag-and-drop dialog 2026-02-27 23:58:09 +02:00
lashman d896bfb720 Add full uninstall dialog with data cleanup options 2026-02-27 23:56:56 +02:00
lashman 96832608b0 Add one-click Update All with batch progress dialog 2026-02-27 23:55:04 +02:00
lashman ecb4057e99 Add background update checks with configurable interval 2026-02-27 23:52:28 +02:00
lashman 1490be467c Add per-app storage breakdown to detail view 2026-02-27 23:48:21 +02:00
lashman b1fddbbcad Add system notification support for crashes and updates 2026-02-27 23:47:19 +02:00
lashman 7e7887d1f2 Add autostart manager with XDG autostart support 2026-02-27 23:45:58 +02:00
lashman 665b6fa736 Add batch selection and bulk operations to library view 2026-02-27 23:45:01 +02:00
lashman 1cf605e5db Wire auto-integrate setting to scan pipeline 2026-02-27 23:42:22 +02:00
lashman 542a854612 Add launch statistics to dashboard 2026-02-27 23:41:22 +02:00
lashman f8e7773e4c Add source URL tracking and display for AppImages 2026-02-27 23:40:18 +02:00
lashman 832176866b Add version rollback support for AppImage updates 2026-02-27 23:38:36 +02:00
lashman fab2dfce4a Add keep-in-place option for drag-and-drop imports 2026-02-27 23:37:03 +02:00
lashman d3f32fc053 Auto-fix executable permissions on discovered AppImages 2026-02-27 23:36:14 +02:00
lashman 2aa141b410 Add system modification tracking for reversible installs 2026-02-27 23:35:27 +02:00
lashman eea3d2af8a Add detailed implementation plan for 26-task feature roadmap 2026-02-27 23:30:18 +02:00
lashman f3dafb451d Add feature roadmap design for 25 new features 2026-02-27 23:24:34 +02:00
lashman 1da69dd44e Fix second audit findings and restore crash detection dialog 2026-02-27 22:48:43 +02:00
lashman df8606251f Fix 29 audit findings across all severity tiers 2026-02-27 22:08:53 +02:00
lashman bfd91104f7 Remove module-wide dead_code allows, annotate individual items instead 2026-02-27 21:05:56 +02:00
lashman 6eb50998fa Wire backup, notification, report export, and file watcher modules into UI 2026-02-27 21:03:19 +02:00
lashman 1372d42350 Switch crash dialog from AlertDialog to Dialog for proper sizing 2026-02-27 20:31:03 +02:00
lashman 500fa45c73 Enlarge crash error dialog for better readability 2026-02-27 20:25:09 +02:00
lashman 0d24ea7795 Add launch crash detection with detailed error dialog, fix all warnings 2026-02-27 20:23:10 +02:00
lashman d4ac469ac0 Rewrite detail view copy for beginners, add tab transitions and lightbox fixes 2026-02-27 19:48:59 +02:00
lashman f649b8eb9f Stop executing AppImages during analysis, add screenshot lightbox and favicons 2026-02-27 18:58:12 +02:00
lashman 0ef4c239f8 Fix performance, add screenshots, make banner scrollable 2026-02-27 18:44:50 +02:00
lashman e69c5f7a7c Add AppImage metadata extraction, display, and bug fixes 2026-02-27 18:31:07 +02:00
lashman abf61f5c32 Add implementation plan for AppImage metadata extraction 2026-02-27 18:12:33 +02:00
lashman b72398d090 Add AppImage metadata extraction design document 2026-02-27 18:08:24 +02:00
lashman a9ccc91090 Fix icon extraction, drop overlay styling, and card padding 2026-02-27 17:49:04 +02:00
lashman 40f7f12834 Add Phase 5 enhancements: security, i18n, analysis, backup, notifications 2026-02-27 17:16:41 +02:00
lashman 870ef2a739 Fix GTK CSS warnings and popover cleanup on widget destroy 2026-02-27 11:14:14 +02:00
lashman 539a570bd0 Implement UI/UX overhaul - cards, list, tabbed detail, context menu 2026-02-27 11:10:23 +02:00
lashman 5b8c9d76cf Add UI/UX overhaul design document 2026-02-27 10:56:02 +02:00
lashman 9e086b8a4b Suppress unused warning on announce() accessibility helper 2026-02-27 10:10:21 +02:00
lashman ee5de0ff47 Update window title dynamically for WCAG 2.4.8 Location compliance 2026-02-27 10:09:31 +02:00
lashman 2604e35a8c Add WCAG accessible labels and confirmation dialog to duplicate removal 2026-02-27 10:07:34 +02:00
lashman 4969d0638d Add WCAG accessible labels and confirmation dialog to cleanup wizard 2026-02-27 10:07:17 +02:00
lashman 0a200c22bd Add WCAG accessible labels to preferences buttons and directory list 2026-02-27 10:06:37 +02:00
lashman 4a9de759b9 Add WCAG accessible labels to integration dialog list boxes 2026-02-27 10:06:33 +02:00
lashman 718fd88351 Rewrite update dialog text to plain language for WCAG readability 2026-02-27 10:06:30 +02:00
lashman 76209c9cad Add WCAG tooltips and expanded abbreviations to security report 2026-02-27 10:06:21 +02:00
lashman 905f5987fd Add WCAG tooltips, plain language, busy states, and banner role to detail view 2026-02-27 10:04:46 +02:00
lashman 5077b35068 Add WCAG accessible labels to library view buttons, list box, and search bar 2026-02-27 10:03:28 +02:00
lashman 784415834e Add WCAG tooltips for technical terms on dashboard 2026-02-27 10:03:16 +02:00
lashman 19e4844a8e Add accessible label to integration emblem overlay in app cards 2026-02-27 10:02:53 +02:00
lashman 7d4a9d9c95 Add WCAG accessibility helpers: labeled badges, live announcements, copy button label 2026-02-27 10:01:37 +02:00
lashman c43c2b73ba Add WCAG AAA focus indicators, high-contrast mode, and reduced-motion coverage 2026-02-27 09:59:44 +02:00
lashman 682ae73ab7 Add WCAG 2.2 AAA compliance design document 2026-02-27 09:35:35 +02:00
lashman 667f0eb1c2 Implement Driftwood AppImage manager - Phases 1 and 2 2026-02-26 23:04:27 +02:00
lashman d256c008f4 Remove design document from tracking 2026-02-26 20:53:41 +02:00
lashman e5d1bd8590 Add Driftwood design document - modern AppImage manager for Wayland-era Linux desktops 2026-02-26 20:51:46 +02:00
4 changed files with 35 additions and 30 deletions
+24 -19
View File
@@ -29,6 +29,7 @@ pub struct AppImageRecord {
pub first_seen: String,
pub last_scanned: String,
pub file_modified: Option<String>,
// Phase 2 fields
pub fuse_status: Option<String>,
pub wayland_status: Option<String>,
pub update_info: Option<String>,
@@ -37,17 +38,20 @@ pub struct AppImageRecord {
pub update_checked: Option<String>,
pub update_url: Option<String>,
pub notes: Option<String>,
// Phase 3 fields
pub sandbox_mode: Option<String>,
// Phase 5 fields
pub runtime_wayland_status: Option<String>,
pub runtime_wayland_checked: Option<String>,
// Async analysis pipeline
pub analysis_status: Option<String>,
// Custom launch arguments
pub launch_args: Option<String>,
// Phase 6 fields
pub tags: Option<String>,
pub pinned: bool,
pub avg_startup_ms: Option<i64>,
// extended metadata
// Phase 9 fields - extended metadata
pub appstream_id: Option<String>,
pub appstream_description: Option<String>,
pub generic_name: Option<String>,
@@ -65,7 +69,7 @@ pub struct AppImageRecord {
pub desktop_actions: Option<String>,
pub has_signature: bool,
pub screenshot_urls: Option<String>,
// system modification tracking
// Phase 11 fields - system modification tracking
pub previous_version_path: Option<String>,
pub source_url: Option<String>,
pub autostart: bool,
@@ -342,7 +346,7 @@ impl Database {
}
fn init_schema(&self) -> SqlResult<()> {
// base tables
// Phase 1 base tables
self.conn.execute_batch(
"CREATE TABLE IF NOT EXISTS schema_version (
version INTEGER NOT NULL
@@ -531,8 +535,8 @@ impl Database {
}
fn migrate_to_v2(&self) -> SqlResult<()> {
// Add columns to appimages table
let extra_columns = [
// Add Phase 2 columns to appimages table
let phase2_columns = [
"fuse_status TEXT",
"wayland_status TEXT",
"update_info TEXT",
@@ -542,11 +546,12 @@ impl Database {
"update_url TEXT",
"notes TEXT",
];
for col in &extra_columns {
for col in &phase2_columns {
let sql = format!("ALTER TABLE appimages ADD COLUMN {}", col);
self.conn.execute_batch(&sql).ok();
}
// Phase 2 tables
self.conn.execute_batch(
"CREATE TABLE IF NOT EXISTS launch_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -590,7 +595,7 @@ impl Database {
}
fn migrate_to_v3(&self) -> SqlResult<()> {
// security scanning
// Phase 3 tables: security scanning
self.conn.execute_batch(
"CREATE TABLE IF NOT EXISTS bundled_libraries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -1707,7 +1712,7 @@ impl Database {
self.conn.query_row("SELECT COUNT(*) FROM appimages", [], |row| row.get(0))
}
// --- Status updates ---
// --- Phase 2: Status updates ---
pub fn update_fuse_status(&self, id: i64, status: &str) -> SqlResult<()> {
self.conn.execute(
@@ -1806,7 +1811,7 @@ impl Database {
rows.collect()
}
// --- Launch tracking ---
// --- Phase 2: Launch tracking ---
pub fn record_launch(&self, appimage_id: i64, source: &str) -> SqlResult<()> {
self.conn.execute(
@@ -1849,7 +1854,7 @@ impl Database {
rows.collect()
}
// --- Update history ---
// --- Phase 2: Update history ---
pub fn record_update(
&self,
@@ -1869,7 +1874,7 @@ impl Database {
Ok(())
}
// --- Security scanning ---
// --- Phase 3: Security scanning ---
pub fn clear_bundled_libraries(&self, appimage_id: i64) -> SqlResult<()> {
self.conn.execute(
@@ -2021,7 +2026,7 @@ impl Database {
Ok(summary)
}
// --- App data paths ---
// --- Phase 3: App data paths ---
pub fn insert_app_data_path(
&self,
@@ -2101,7 +2106,7 @@ impl Database {
Ok(())
}
// --- Runtime Wayland ---
// --- Phase 5: Runtime Wayland ---
pub fn update_runtime_wayland_status(&self, id: i64, status: &str) -> SqlResult<()> {
self.conn.execute(
@@ -2111,7 +2116,7 @@ impl Database {
Ok(())
}
// --- Config Backups ---
// --- Phase 5: Config Backups ---
pub fn insert_config_backup(
&self,
@@ -2181,7 +2186,7 @@ impl Database {
Ok(())
}
// --- CVE Notifications ---
// --- Phase 5: CVE Notifications ---
pub fn has_cve_been_notified(&self, appimage_id: i64, cve_id: &str) -> SqlResult<bool> {
let count: i32 = self.conn.query_row(
@@ -2206,7 +2211,7 @@ impl Database {
Ok(())
}
// --- Sandbox Profiles ---
// --- Phase 5: Sandbox Profiles ---
pub fn insert_sandbox_profile(
&self,
@@ -2276,7 +2281,7 @@ impl Database {
rows.collect()
}
// --- Tags, Pin, Startup Time ---
// --- Phase 6: Tags, Pin, Startup Time ---
pub fn update_tags(&self, id: i64, tags: Option<&str>) -> SqlResult<()> {
self.conn.execute(
@@ -2350,7 +2355,7 @@ impl Database {
}
}
// --- Runtime Updates ---
// --- Phase 5: Runtime Updates ---
pub fn record_runtime_update(
&self,
@@ -3254,7 +3259,7 @@ mod tests {
}
#[test]
fn test_status_updates() {
fn test_phase2_status_updates() {
let db = Database::open_in_memory().unwrap();
let id = db.upsert_appimage("/path/app.AppImage", "app.AppImage", Some(2), 1000, true, None).unwrap();
+2 -2
View File
@@ -87,7 +87,7 @@ pub fn detect_duplicates(db: &Database) -> Vec<DuplicateGroup> {
let mut groups = Vec::new();
// Find exact duplicates by SHA256 hash
// Phase 1: Find exact duplicates by SHA256 hash
let hash_groups = group_by_hash(&records);
for (hash, members) in &hash_groups {
if members.len() > 1 {
@@ -95,7 +95,7 @@ pub fn detect_duplicates(db: &Database) -> Vec<DuplicateGroup> {
}
}
// Find same app name groups (excluding already-found exact dupes)
// Phase 2: Find same app name groups (excluding already-found exact dupes)
let exact_dupe_ids: std::collections::HashSet<i64> = groups
.iter()
.flat_map(|g| g.members.iter().map(|m| m.record.id))
+2 -2
View File
@@ -117,7 +117,7 @@ pub fn show_drop_dialog(
let on_complete_ref = on_complete.clone();
glib::spawn_future_local(async move {
// Fast registration (copy + DB upsert only)
// Phase 1: Fast registration (copy + DB upsert only)
let result = gio::spawn_blocking(move || {
register_dropped_files(&files, copy)
})
@@ -143,7 +143,7 @@ pub fn show_drop_dialog(
toast_ref.add_toast(widgets::info_toast(&msg));
}
// Background analysis for each file
// Phase 2: Background analysis for each file
let on_complete_bg = on_complete_ref.clone();
for reg in registered {
let on_complete_inner = on_complete_bg.clone();
+7 -7
View File
@@ -1571,11 +1571,11 @@ impl DriftwoodWindow {
let toast_overlay = self.imp().toast_overlay.get().unwrap().clone();
let window_weak = self.downgrade();
// Two-pass scan:
// Fast pass: discover files, upsert into DB, mark pending analysis
// Background pass: heavy analysis per file
// Two-phase scan:
// Phase 1 (fast): discover files, upsert into DB, mark pending analysis
// Phase 2 (background): heavy analysis per file
glib::spawn_future_local(async move {
// Fast registration
// Phase 1: Fast registration
let result = gio::spawn_blocking(move || {
let bg_db = Database::open().expect("Failed to open database for scan");
let start = Instant::now();
@@ -1646,7 +1646,7 @@ impl DriftwoodWindow {
}
log::info!(
"Scan: {} files, {} new, {} removed, {} skipped (unchanged), took {}ms",
"Scan phase 1: {} files, {} new, {} removed, {} skipped (unchanged), took {}ms",
total, new_count, removed_count, skipped_count, start.elapsed().as_millis()
);
@@ -1665,7 +1665,7 @@ impl DriftwoodWindow {
.await;
if let Ok((total, new_count, needs_analysis)) = result {
// Dismiss the "Scanning..." toast now that fast scan is done
// Dismiss the "Scanning..." toast now that Phase 1 is done
if let Some(ref toast) = scan_toast {
toast.dismiss();
}
@@ -1689,7 +1689,7 @@ impl DriftwoodWindow {
};
toast_overlay.add_toast(widgets::info_toast(&msg));
// Background analysis per file with debounced UI refresh
// Phase 2: Background analysis per file with debounced UI refresh
let running = analysis::running_count();
if running > 0 {
log::info!("Analyzing {} AppImage(s) in background ({} already running)", needs_analysis.len(), running);