Change app ID to com.outlay.app, add AppStream metadata, fix toast visibility

- Change app ID from io.github.outlay to com.outlay.app across all files
- Add AppStream metainfo with full feature description, 16 screenshots, and v0.1.0 release
- Update desktop file with expanded metadata (StartupNotify, SingleMainWindow)
- Add summary and description fields to GSchema keys
- Move toast overlay outside ScrolledWindow so notifications stay visible in viewport
- Embed tray icon as ARGB pixmap data for reliable system tray display
- Register hicolor icon theme path for taskbar icon on Wayland
- Remove unused icon variants (old naming, web favicons, SVG, ICO, shadow)
- Add screenshots to data/screenshots/
- Update build script with metainfo and screenshot bundling
This commit is contained in:
2026-03-03 22:15:59 +02:00
parent f46a86134a
commit bdf200211b
63 changed files with 289 additions and 158 deletions

3
.gitignore vendored
View File

@@ -23,6 +23,9 @@ linuxdeploy-plugin-*
*.swo
*~
# Trash
.trash/
# OS
.DS_Store
Thumbs.db

BIN
data/screenshots/01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
data/screenshots/02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

BIN
data/screenshots/03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

BIN
data/screenshots/04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
data/screenshots/05.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
data/screenshots/06.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
data/screenshots/07.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
data/screenshots/08.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
data/screenshots/09.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
data/screenshots/10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
data/screenshots/11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
data/screenshots/12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
data/screenshots/13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
data/screenshots/14.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
data/screenshots/15.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
data/screenshots/16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,11 @@
[Desktop Entry]
Name=Outlay
Comment=Personal income and expense tracker with budgets, charts, and multi-currency support
Exec=outlay-gtk
Icon=com.outlay.app
Terminal=false
Type=Application
Categories=Office;Finance;GTK;
Keywords=expense;budget;money;finance;income;tracker;currency;receipt;
StartupNotify=true
SingleMainWindow=true

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<schemalist gettext-domain="outlay">
<schema id="com.outlay.app" path="/com/outlay/app/">
<key name="window-width" type="i">
<default>900</default>
<summary>Window width</summary>
<description>The width of the main application window.</description>
</key>
<key name="window-height" type="i">
<default>600</default>
<summary>Window height</summary>
<description>The height of the main application window.</description>
</key>
<key name="window-maximized" type="b">
<default>false</default>
<summary>Window maximized</summary>
<description>Whether the main application window is maximized.</description>
</key>
</schema>
</schemalist>

View File

@@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>com.outlay.app</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>CC0-1.0</project_license>
<name>Outlay</name>
<summary>Personal income and expense tracker with budgets, charts, and multi-currency support</summary>
<description>
<p>
Outlay is a native GTK4/libadwaita personal finance application for
tracking income and expenses, managing budgets, and visualizing spending
patterns. It stores everything locally in SQLite with no cloud dependency.
</p>
<p>Key features:</p>
<ul>
<li>Log expenses and income with category tagging and notes</li>
<li>Multi-currency support with live exchange rate conversion</li>
<li>Category-based budgets with threshold alerts and sparkline trends</li>
<li>Recurring transactions with flexible scheduling (daily, weekly, monthly, yearly)</li>
<li>Subscription tracking with pause, resume, and cost overview</li>
<li>Interactive charts: donut breakdown, monthly bars, and smooth net trend lines</li>
<li>Calendar heatmap view of daily spending</li>
<li>Financial forecasting based on historical patterns</li>
<li>Savings goals with progress tracking</li>
<li>Credit card balance and payment tracking</li>
<li>Wishlist with priority ranking and affordability estimates</li>
<li>Spending anomaly detection and monthly insights</li>
<li>Natural language transaction input</li>
<li>Receipt OCR for automatic amount extraction</li>
<li>Export to CSV, JSON, PDF, OFX, and QIF formats</li>
<li>Import from CSV, JSON, OFX, QIF, and PDF bank statements</li>
<li>Automatic and manual backup with restore</li>
<li>System tray with quick-add actions</li>
<li>Bill reminders and budget threshold notifications</li>
<li>Achievement system for building financial habits</li>
<li>Split transactions across multiple categories</li>
<li>Transaction templates for frequent entries</li>
</ul>
</description>
<icon type="stock">com.outlay.app</icon>
<launchable type="desktop-id">com.outlay.app.desktop</launchable>
<developer id="com.outlay">
<name>Outlay Contributors</name>
</developer>
<url type="homepage">https://git.lashman.live/lashman/outlay</url>
<url type="bugtracker">https://git.lashman.live/lashman/outlay/issues</url>
<url type="vcs-browser">https://git.lashman.live/lashman/outlay</url>
<url type="donation">https://ko-fi.com/lashman</url>
<url type="contact">https://git.lashman.live/lashman/outlay/issues</url>
<url type="contribute">https://git.lashman.live/lashman/outlay</url>
<update_contact>lashman@robotbrush.com</update_contact>
<screenshots>
<screenshot type="default">
<caption>Log view with numpad calculator for quick expense entry</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/01.png</image>
</screenshot>
<screenshot>
<caption>Transaction history with search, category filters, and daily totals</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/02.png</image>
</screenshot>
<screenshot>
<caption>Charts with donut category breakdown and monthly income vs expenses</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/03.png</image>
</screenshot>
<screenshot>
<caption>Budget tracking with sparkline trends, spending pace, and insights</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/04.png</image>
</screenshot>
<screenshot>
<caption>Savings goals with progress bars and monthly contribution targets</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/05.png</image>
</screenshot>
<screenshot>
<caption>Cash flow forecast with projected monthly balances</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/06.png</image>
</screenshot>
<screenshot>
<caption>Recurring transactions with next due dates and amounts</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/07.png</image>
</screenshot>
<screenshot>
<caption>Subscription management with monthly and yearly cost overview</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/08.png</image>
</screenshot>
<screenshot>
<caption>Wishlist with wanted items, prices, and purchase tracking</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/09.png</image>
</screenshot>
<screenshot>
<caption>Credit card tracking with balances, utilization, and payment details</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/10.png</image>
</screenshot>
<screenshot>
<caption>Insights with streaks, achievements, and monthly spending recap</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/11.png</image>
</screenshot>
<screenshot>
<caption>Settings for currency, appearance, and budget notifications</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/12.png</image>
</screenshot>
<screenshot>
<caption>Category management, auto-categorization rules, and transaction templates</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/13.png</image>
</screenshot>
<screenshot>
<caption>Export and import in CSV, JSON, QIF, OFX, and PDF formats</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/14.png</image>
</screenshot>
<screenshot>
<caption>Backup and restore with automatic scheduled backups</caption>
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/15.png</image>
</screenshot>
<screenshot>
<caption>Quick Add popup for fast expense logging from the system tray</caption>
<image type="source" width="461" height="650">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/16.png</image>
</screenshot>
</screenshots>
<branding>
<color type="primary" scheme_preference="light">#62a0ea</color>
<color type="primary" scheme_preference="dark">#1a5fb4</color>
</branding>
<categories>
<category>Office</category>
<category>Finance</category>
<category>GTK</category>
</categories>
<keywords>
<keyword>Expense</keyword>
<keyword>Income</keyword>
<keyword>Budget</keyword>
<keyword>Finance</keyword>
<keyword>Money</keyword>
<keyword>Currency</keyword>
<keyword>Receipt</keyword>
<keyword>Tracker</keyword>
<keyword>Chart</keyword>
<keyword>Subscription</keyword>
</keywords>
<content_rating type="oars-1.1">
<content_attribute id="social-info">mild</content_attribute>
</content_rating>
<requires>
<display_length compare="ge">360</display_length>
</requires>
<recommends>
<control>keyboard</control>
<control>pointing</control>
</recommends>
<supports>
<internet>first-run</internet>
</supports>
<provides>
<binary>outlay-gtk</binary>
</provides>
<translation type="gettext">com.outlay.app</translation>
<releases>
<release version="0.1.0" date="2026-03-03" type="stable">
<description>
<p>Initial release of Outlay with core features:</p>
<ul>
<li>Expense and income logging with multi-currency support</li>
<li>Category-based budgets with alerts and sparkline trends</li>
<li>Recurring transactions and subscription management</li>
<li>Interactive donut, bar, and net trend charts</li>
<li>Calendar heatmap, forecast, goals, and wishlist views</li>
<li>Credit card tracking with payment schedules</li>
<li>Natural language input and receipt OCR</li>
<li>Export to CSV, JSON, PDF, OFX, and QIF</li>
<li>Import from CSV, JSON, OFX, QIF, and PDF statements</li>
<li>Spending anomaly detection and monthly insights</li>
<li>System tray integration with quick-add actions</li>
<li>Automatic backup scheduling and restore</li>
<li>Achievement system for financial habit building</li>
</ul>
</description>
</release>
</releases>
</component>

View File

@@ -1,69 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { background: transparent; width: 100%; height: 100%; }
body {
background-image:
linear-gradient(45deg, #ccc 25%, transparent 25%),
linear-gradient(-45deg, #ccc 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #ccc 75%),
linear-gradient(-45deg, transparent 75%, #ccc 75%);
background-size: 20px 20px;
background-position: 0 0, 0 10px, 10px -10px, -10px 0;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
}
.icon-wrapper {
padding: 50px;
filter: drop-shadow(0 8px 14px rgba(26, 95, 180, 0.45));
}
.icon-container {
width: 512px;
height: 512px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
/* GNOME-style rounded square - ~22% radius */
border-radius: 22%;
/* GNOME blue gradient - wider range for visible depth */
background: linear-gradient(180deg, #62a0ea 0%, #1a5fb4 55%, #144a8a 100%);
}
/* Sharp top highlight + bottom shadow edges */
.icon-container::before {
content: '';
position: absolute;
inset: 0;
border-radius: 22%;
border-top: 4px solid rgba(255,255,255,0.2);
border-bottom: 40px solid rgba(0,0,0,0.12);
border-left: none;
border-right: none;
pointer-events: none;
z-index: 2;
}
.icon {
font-size: 286px;
line-height: 1;
color: #ffffff;
position: relative;
z-index: 1;
filter: drop-shadow(0 4px 8px rgba(0,0,0,0.2));
}
</style>
</head>
<body>
<div class="icon-wrapper">
<div class="icon-container" id="icon-target">
<i class="icon fa-solid fa-receipt"></i>
</div>
</div>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

View File

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 679 B

View File

Before

Width:  |  Height:  |  Size: 679 B

After

Width:  |  Height:  |  Size: 679 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

View File

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#3584e4"/>
<stop offset="100%" stop-color="#1a73e8"/>
</linearGradient>
</defs>
<!-- Background circle -->
<circle cx="64" cy="64" r="60" fill="url(#bg)"/>
<!-- Wallet body -->
<rect x="24" y="38" width="72" height="52" rx="8" fill="#ffffff" opacity="0.95"/>
<!-- Wallet flap -->
<path d="M24 50 Q24 38 36 38 L88 38 Q96 38 96 46 L96 50 Z" fill="#e8e8e8"/>
<!-- Coin circle -->
<circle cx="82" cy="64" r="14" fill="#f5c211" stroke="#e0a800" stroke-width="2"/>
<!-- Dollar sign on coin -->
<text x="82" y="70" font-family="sans-serif" font-size="18" font-weight="bold" fill="#8b6914" text-anchor="middle">$</text>
<!-- Arrow out (expense indicator) -->
<path d="M40 64 L54 54 L54 58 L66 58 L66 70 L54 70 L54 74 Z" fill="#2ec27e" opacity="0.9"/>
</svg>

Before

Width:  |  Height:  |  Size: 1015 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 685 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -1,9 +0,0 @@
[Desktop Entry]
Name=Outlay
Comment=Personal income and expense logger
Exec=outlay-gtk
Icon=io.github.outlay
Terminal=false
Type=Application
Categories=Office;Finance;
Keywords=expense;budget;money;finance;income;

View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>
<schema id="io.github.outlay" path="/io/github/outlay/">
<key name="window-width" type="i">
<default>900</default>
</key>
<key name="window-height" type="i">
<default>600</default>
</key>
<key name="window-maximized" type="b">
<default>false</default>
</key>
</schema>
</schemalist>

View File

@@ -1634,8 +1634,7 @@ impl LogView {
inner.append(&recent_group);
clamp.set_child(Some(&inner));
toast_overlay.set_child(Some(&clamp));
container.append(&toast_overlay);
container.append(&clamp);
LogView {
container,

View File

@@ -28,7 +28,7 @@ use gtk::glib;
use outlay_core::db::Database;
use std::rc::Rc;
const APP_ID: &str = "io.github.outlay";
const APP_ID: &str = "com.outlay.app";
fn main() {
let app = Application::builder()
@@ -100,6 +100,25 @@ fn build_ui(app: &Application) {
load_css();
icon_theme::setup_themed_icons();
// Register app icon for the hicolor theme so it works for window + tray
{
let display = gtk::gdk::Display::default().expect("Could not get display");
let theme = gtk::IconTheme::for_display(&display);
let exe_path = std::env::current_exe().unwrap_or_default();
let exe_dir = exe_path.parent().unwrap_or(std::path::Path::new("."));
let candidates = [
exe_dir.join("../../outlay-gtk/data/icons"),
exe_dir.join("../share/icons"),
];
for candidate in &candidates {
if candidate.exists() {
theme.add_search_path(candidate);
break;
}
}
}
gtk::Window::set_default_icon_name("com.outlay.app");
let data_dir = glib::user_data_dir().join("outlay");
std::fs::create_dir_all(&data_dir).expect("Failed to create data directory");
let db_path = data_dir.join("outlay.db");

View File

@@ -1,6 +1,5 @@
use ksni::menu::StandardItem;
use ksni::{Category, ToolTip, Tray, TrayMethods};
use std::path::PathBuf;
use ksni::{Category, Icon, ToolTip, Tray, TrayMethods};
use std::sync::mpsc;
pub enum TrayCommand {
@@ -11,9 +10,11 @@ pub enum TrayCommand {
Quit,
}
static TRAY_ICON_32: &[u8] = include_bytes!("../data/icons/tray-icon-32x32.argb");
static TRAY_ICON_48: &[u8] = include_bytes!("../data/icons/tray-icon-48x48.argb");
struct OutlayTray {
sender: mpsc::Sender<TrayCommand>,
icon_theme_path: String,
}
impl Tray for OutlayTray {
@@ -26,11 +27,22 @@ impl Tray for OutlayTray {
}
fn icon_name(&self) -> String {
"io.github.outlay".into()
String::new()
}
fn icon_theme_path(&self) -> String {
self.icon_theme_path.clone()
fn icon_pixmap(&self) -> Vec<Icon> {
vec![
Icon {
width: 32,
height: 32,
data: TRAY_ICON_32.to_vec(),
},
Icon {
width: 48,
height: 48,
data: TRAY_ICON_48.to_vec(),
},
]
}
fn category(&self) -> Category {
@@ -98,34 +110,8 @@ impl Tray for OutlayTray {
}
}
fn find_icon_theme_path() -> String {
let exe_path = std::env::current_exe().unwrap_or_default();
let exe_dir = exe_path.parent().unwrap_or(std::path::Path::new("."));
let candidates = [
exe_dir.join("../../outlay-gtk/data/icons"),
exe_dir.join("../share/icons"),
PathBuf::from("/usr/share/icons"),
];
for candidate in &candidates {
if candidate.exists() {
if let Ok(resolved) = candidate.canonicalize() {
return resolved.to_string_lossy().into_owned();
}
}
}
String::new()
}
pub fn spawn_tray(sender: mpsc::Sender<TrayCommand>) {
let icon_theme_path = find_icon_theme_path();
let tray = OutlayTray {
sender,
icon_theme_path,
};
let tray = OutlayTray { sender };
std::thread::spawn(move || {
let rt = tokio::runtime::Builder::new_current_thread()

View File

@@ -89,7 +89,8 @@ impl MainWindow {
.hscrollbar_policy(gtk::PolicyType::Never)
.child(&log_view.container)
.build();
content_stack.add_named(&log_scroll, Some("log"));
log_view.toast_overlay.set_child(Some(&log_scroll));
content_stack.add_named(&log_view.toast_overlay, Some("log"));
// History view
let history_view = HistoryView::new(db.clone());

View File

@@ -13,7 +13,6 @@ echo "==> Creating AppDir structure..."
rm -rf AppDir
mkdir -p AppDir/usr/bin
mkdir -p AppDir/usr/share/applications
mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps
mkdir -p AppDir/usr/share/glib-2.0/schemas
mkdir -p AppDir/usr/share/fonts/truetype/liberation
@@ -21,19 +20,29 @@ mkdir -p AppDir/usr/share/fonts/truetype/liberation
cp target/release/outlay-gtk AppDir/usr/bin/
# Copy desktop file
cp outlay-gtk/data/io.github.outlay.desktop AppDir/
cp outlay-gtk/data/io.github.outlay.desktop AppDir/usr/share/applications/
cp outlay-gtk/data/com.outlay.app.desktop AppDir/
cp outlay-gtk/data/com.outlay.app.desktop AppDir/usr/share/applications/
# Copy app icon
cp outlay-gtk/data/icons/hicolor/scalable/apps/io.github.outlay.svg AppDir/usr/share/icons/hicolor/scalable/apps/
# Copy app icons (all hicolor sizes)
for size_dir in outlay-gtk/data/icons/hicolor/*/apps; do
size=$(basename "$(dirname "$size_dir")")
mkdir -p "AppDir/usr/share/icons/hicolor/$size/apps"
cp "$size_dir"/com.outlay.app.* "AppDir/usr/share/icons/hicolor/$size/apps/" 2>/dev/null || true
done
# Copy Tabler action icons
mkdir -p AppDir/usr/share/icons/hicolor/scalable/actions
cp outlay-gtk/data/icons/hicolor/scalable/actions/outlay-*.svg AppDir/usr/share/icons/hicolor/scalable/actions/
cp outlay-gtk/data/icons/hicolor/scalable/actions/tabler-*.svg AppDir/usr/share/icons/hicolor/scalable/actions/
# Copy metainfo and screenshots
mkdir -p AppDir/usr/share/metainfo
cp outlay-gtk/data/com.outlay.app.metainfo.xml AppDir/usr/share/metainfo/
mkdir -p AppDir/usr/share/screenshots
cp data/screenshots/*.png AppDir/usr/share/screenshots/
# Copy GSettings schema
cp outlay-gtk/data/io.github.outlay.gschema.xml AppDir/usr/share/glib-2.0/schemas/
cp outlay-gtk/data/com.outlay.app.gschema.xml AppDir/usr/share/glib-2.0/schemas/
glib-compile-schemas AppDir/usr/share/glib-2.0/schemas/
# Bundle Liberation Sans fonts (needed for PDF report generation)
@@ -102,8 +111,8 @@ export DEPLOY_GTK_VERSION=4
--appdir AppDir \
--plugin gtk \
--output appimage \
--desktop-file AppDir/io.github.outlay.desktop \
--icon-file AppDir/usr/share/icons/hicolor/scalable/apps/io.github.outlay.svg
--desktop-file AppDir/com.outlay.app.desktop \
--icon-file AppDir/usr/share/icons/hicolor/256x256/apps/com.outlay.app.png
echo "==> Done! AppImage created."
ls -lh Outlay-*.AppImage 2>/dev/null || echo "Note: Output filename may vary."