Releases: AetherAssembly/Attyre
v4.1.0
What's new in v4.1.0
Security fix: Electron image path traversal
The app:// image protocol handler and the save-image IPC handler were not validating filenames, which could allow reads or writes outside the intended images/ folder via crafted paths (e.g. ../../). Both handlers now reject any filename containing path separators or .. sequences.
Bug fixes
- Silent data loss on corrupted storage: if localStorage held data that was neither valid compressed nor plain JSON, the app would silently reset to an empty wardrobe. It now logs a clear error to the console instead of failing invisibly.
- Import rejects invalid categories:
importJSONpreviously accepted any string forcategory. It now validates against the allowed values (top,bottom,outerwear,shoes,accessory) and throws a descriptive error on mismatch. - Case-insensitive category matching in suggestions: items with uppercase category values in existing data were silently excluded from outfit suggestions. Matching is now case-insensitive.
- Calendar outfit save errors are now surfaced: if saving an outfit failed (e.g. storage quota exceeded), the UI gave no feedback. The error message is now shown to the user.
- API errors no longer shown raw: the suggest page was forwarding raw geocoding and weather API error text to users. Errors now show a clean message while the raw error is logged to the console.
Downloads
| Platform | File | SHA256 |
|---|---|---|
| Linux (AppImage) | Attyre-4.1.0.AppImage |
842b288ad500fe93492ba73d28b003004c53f2c335286c3625bfa752ae195648 |
| Linux (deb) | attyre_4.1.0_amd64.deb |
95097a0922cc2a56140a1bdb8c31b5f9ae9f0bbffbe0aa24b0d7876ce98abea7 |
| Linux (rpm) | attyre-4.1.0.x86_64.rpm |
575920f8af036739687a26a262e180d4b1fec20300d83ca7c82e85a14575acc3 |
| Windows | Attyre.Setup.4.1.0.exe |
df1dc37044e33e327eb149d5f9b6bbe9ea7605114d1dc8aeaee9c039cef9deb9 |
| macOS | Attyre-4.1.0-arm64.dmg |
79e311a7910bdd0b20a18334cee8424d76c8588ec5006a6048c95bd5e16cdfec |
Changelog
Full Changelog: v4.0.2...v4.1.0
No account needed. All data stays on your device.
v4.0.2
What's new in v4.0.2
Electron build fix
The packaged desktop app was showing a blank white window on launch. vite.config.js was missing base: './', so Vite emitted absolute asset paths (/assets/index.css) that Electron's loadFile() can't resolve — the CSS and JS simply never loaded. This is now fixed.
PWA removed
Attyre is now desktop-only. The Cloudflare Pages deployment and all PWA infrastructure (service worker, web manifest, wrangler) have been removed.
Downloads
| Platform | File | SHA256 |
|---|---|---|
| Linux (AppImage) | Attyre-4.0.2.AppImage |
9e21f908415fdf64ce4ca3f3b4c170ec788ec56713bc47ae35d6c5a89da8aa5d |
| Linux (deb) | Attyre_4.0.2_amd64.deb |
214c44138586d3dcad779161eaa289945230e3d597b165394f750240ae1f3af3 |
| Linux (rpm) | Attyre-4.0.2-1.x86_64.rpm |
b77d9d57318c2a998149ed8542c351126cdc71a058339609a61e6bd3963a893a |
| Windows | Attyre.Setup.4.0.2.exe |
6c8ffb419da5471bd58e0339ca5a70926021ffe86ab25034efdb995c41e28dd6 |
| macOS | Attyre-4.0.2-arm64.dmg |
ce550af9cea9824e9d72ab7c587c08269b9839dda3142d0909b536ab69ab31d6 |
Changelog
Full Changelog: v4.0.1...v4.0.2
No account needed. All data stays on your device.
v4.0.1
What's new in v4.0.1
The desktop app has been rebuilt on Electron, replacing the previous Tauri/Rust shell.
macOS is back
macOS support returns after being dropped in v2.0.1. Download the .dmg from the assets below.
Attyre is not notarized. On first launch, right-click the app → Open → Open to allow it. You only need to do this once.
Changes
- Desktop shell switched from Tauri 2 (Rust + WebKitGTK) to Electron (Node.js + Chromium)
- Auto-update active on Linux and Windows — macOS shows a link to GitHub releases instead (auto-update requires code signing on macOS)
- Fixes RUSTSEC-2024-0429, a soundness bug in the
glibcrate that could cause crashes on optimized builds
Downloads
| Platform | File | SHA256 |
|---|---|---|
| Linux (AppImage) | Attyre-4.0.1.AppImage |
b764352e32ceb4801fb18ad6c0f0f60013f23da281aa0d37e8fad3ac4f10bd17 |
| Linux (deb) | Attyre_4.0.1_amd64.deb |
019771925e33effc1a89670ad2a7d05e8a03a967403f4c58391f438301145710 |
| Linux (rpm) | Attyre-4.0.1-1.x86_64.rpm |
90141ee14b20e910a40408e2a82845b638ed6912d7681bc70337d2a627cfcd3c |
| Windows | Setup.exe |
8e8cd8f9274df1a5eeb974c7c558512d9f8ca1a032b822703011ad334179a2c4 |
| macOS | .dmg |
e876a22fb373897f40ae8910c42aab3c7aae18e55f32158f36b4ed482b0833cb |
No account needed. All data stays on your device.
v3.1.0
This is a bug fix release.
What's Changed
- Settings links (GitHub, AetherAssembly, Get help, Contact us) now correctly open in the system browser and mail client on the desktop app
- Privacy Policy is now rendered in-app at
#/privacyinstead of linking to a separate HTML file that couldn't be reached from the desktop build - Updater now shows a clear message with a link to GitHub releases when no update package is available for your platform, instead of a raw error
- Added missing
@tauri-apps/plugin-openerJS package required for desktop link handling
Full Changelog: v3.0.1...v3.1.0
Attyre v3.0.1
This is a maintenance release with dependency updates.
What's Changed
- chore(deps): bump actions/setup-node from 4 to 6 by @dependabot[bot] in #20
- chore(deps-dev): bump the non-major group with 2 updates by @dependabot[bot] in #21
No new features or bug fixes. If you missed v3.0.0, that release brought smarter weather-aware suggestions (wind chill, WMO weather codes), occasion scoring, laundry tracking, outfit history, a packing list generator, drag-and-drop wardrobe reordering, and toast notifications. See the CHANGELOG for the full list.
Full Changelog: v3.0.0...v3.0.1
v3.0.0
Release date: May 30, 2026
What's new
Smarter suggestions
- Wind speed and WMO weather code are now fetched from Open-Meteo alongside temperature (same free endpoint, no extra key)
- Wind chill adjustment using the Environment Canada formula shifts clothing bands on cold, blustery days
- WMO weather codes mapped to weather tags: sunny, cloudy, foggy, rain, heavy-rain, snow, wind — merged with temperature-band tags for much more accurate item scoring
- Occasion toggle (Casual / Work / Formal) on the Suggest page re-ranks results in memory without a re-fetch
- Items worn in the last 3 days receive a -2 score penalty so the engine favors fresher picks
- Dirty items receive a -1 score penalty as a soft nudge toward clean clothes
Laundry tracking
- Marking an outfit as worn on the calendar now sets
laundryStatus: dirtyand stampslastWornon each item - A "needs wash" filter chip in the wardrobe shows only items that need cleaning
- Item detail page shows a "Mark as Clean" button when an item is dirty
History page
- New History page shows all past calendar outfits in reverse-chronological order, grouped by month
- Each entry shows item thumbnails and names
- "Wear again" button copies a past outfit to today and increments usage
Packing list
- New Pack page: enter a destination city and date range (up to 14 days)
- Fetches a multi-day forecast from Open-Meteo, runs the suggestion engine per day, deduplicates across days
- Output is a grouped checklist by category (tops, bottoms, outerwear, shoes, accessories) with checkboxes to mark items as packed
- Occasion toggle carried over from the Suggest page
Wardrobe improvements
- Drag-and-drop item reordering: drag cards to rearrange when no filters are active; order persists to localStorage
- Item cards now show a "Last worn X days ago" / "Never worn" label and a laundry badge when dirty
UI polish
- Item grid cards fade and slide up on render, with staggered delays on the first eight items
- Toast notification system: slide-in toasts auto-dismiss after 3 seconds
- History and Pack added to sidebar and mobile-accessible via the hamburger menu
Versioning
- Version bumped to 3.0.0 across
package.json,tauri.conf.json,Cargo.toml,app.js,service-worker.js, and README
Full changelog
See CHANGELOG.md for the complete history of changes across all releases.
Version Changelog: v2.0.1...v3.0.0
v2.0.1
Release date: May 20, 2026
What's new
- Tauri 2 desktop app (Linux, macOS, Windows)
- Vite dev server replacing python
http.server - Filesystem image storage via Rust
save_imagecommand - Service worker with network-first PWA caching
- Per-page error boundaries
- Auto-updater: tauri-plugin-updater + tauri-plugin-process wired up
- Settings page shows
Check for Updatesbutton (desktop only); silent startup check shows dismissible banner if update available - GitHub Actions
release.yml: builds Linux/Windows in parallel, generateslatest.jsonupdate manifest, publishes release on version tag push - Add Item UX: photo required (moved to top), color auto-detected via Canvas API, name optional with auto-generation (Shirt_001, etc.), warmth buttons show temp ranges, weather tags auto-suggested by warmth
- Warmth scale flipped: 1=Freezing (<=0C) -> 5=Hot (25C+) left to right
- Add cross-platform build test workflow
- Lint script: strip template literal expressions before extracting class names (fixes false positive on 'level')
- Remove dead
classList.remove('colorblind-mode');legacy name before renaming to accessibility-mode saved-outfits: replacedelete-outfit-btnclass with data-action attribute for JS selection- wardrobe: move tag-filter-chip inline styles to
style.css style.css: add.error,.success, and.tag-filter-chiprules
Upgraded
- Domain updated to attyre.org
- contact@aetherassembly.org added to Settings
- Semver versioning (was date-based)
- CHANGELOG and README updated for v2.0.0 & v2.0.1
Full changelog
See CHANGELOG.md for the complete history of changes across all releases.
Version Changelog: v2.0.0...v2.0.1)
Attyre v2026.05.18
Release date: May 18, 2026
What's new
Fixed
- Mobile pages appeared static (critical):
add-item.js,item-detail.js, andsaved-outfits.jswere all referencing CSS class names that don't exist instyle.css— buttons rendered as bare browser defaults, forms had no padding or structure, warmth buttons didn't flex, and checkboxes were unstyled. Fixed all three files to use the correct classes:.page-wrap,.warmth-row,.checkbox-item,.btn-stack,.btn-group,.btn.btn-primary,.outfit-section, etc. - Warmth validation silently failed on Edit Item (critical):
item-detail.jscalledshowError('warmth-error', ...)but no element with that ID existed in the DOM — users could submit with no warmth level selected and received no feedback. Added the missing<p>error element. - Crop modal rendered unstyled (critical): Both
add-item.jsanditem-detail.jsused.crop-modal-contenton the crop modal container, but the stylesheet defines.crop-modal-inner. Fixed the class name in both files. - Calendar delete bypassed store error handling: The delete-outfit handler in
calendar.jshardcoded thelocalStoragekey directly instead of going through the store, skipping all error handling. Added adeleteOutfitDate(date)helper tostore.jsand updatedcalendar.jsto call it. - Shuffle button didn't shuffle: The shuffle button on the Home page re-navigated to
#/, which just re-ransuggestForTemp(18)and produced the same result every time. Now performs a Fisher-Yates shuffle over all wardrobe items and updates the chip row in-place. - Offline indicator offset on desktop: The offline banner used
top: var(--topbar-height)in the desktop media query, but the topbar isdisplay: noneon desktop — pushing the banner 56px down from where it should be. Fixed totop: 0. - Crop button missing on Edit Item page:
item-detail.jshad no crop button wired up for the existing image or newly uploaded images. Now consistent withadd-item.js. QuotaExceededErrorsilently swallowed in add/edit forms: Both forms now catch storage quota errors and surface them to the user via the name field error element instead of failing silently.
Known bugs
- Mobile version appears static, working on fix
Upgrading
No migration needed. Data stored in localStorage is fully compatible with this release. If you have the app installed as a PWA, it will update automatically on next launch.
Full changelog
See CHANGELOG.md for the complete history of changes across all releases.
Version Changelog: v2026.05.11...v2026.05.18
Attyre v2026.05.11
Attyre v2026.05.11
Release date: May 11, 2026
What's new
Accessibility overhaul
This release is a big one for keyboard and screen reader users. Item cards are now proper <button> elements, which means screen readers announce them correctly and keyboard users get Enter/Space activation for free. The calendar grid has been rebuilt with full ARIA semantics (role="grid", role="gridcell", aria-selected), and day cells respond to keyboard navigation.
A hidden aria-live region now announces page titles on every navigation, filter result counts in the wardrobe, and calendar date selections, so screen reader users always know what changed without hunting around.
Other additions:
- Skip-to-content link visible on Tab from any page
- Global
:focus-visiblering on all interactive elements, with a thicker blue variant in accessibility mode aria-pressedstate on outfit selector cards so selection state is readable without relying on coloraria-describedbywiring on name and category form inputs to their inline error messagesprefers-reduced-motionsupport: all CSS transitions and animations are suppressed when the OS setting is on
Accessibility mode itself also got expanded. Beyond the color swap, it now bumps the base font size to 16px, strengthens border contrast, and thickens nav icon strokes.
Bug fixes
Mobile app shell invisible on older phones
.app-shell used height: 100dvh with no fallback. The dvh unit is unsupported on iOS older than 16 and Chrome older than 108, which caused the shell to collapse to zero height and render nothing. A height: 100vh fallback has been added immediately before the dvh line.
Initial page never renders on slow mobile connections
app.js registered a DOMContentLoaded listener unconditionally. Because ES modules are fetched asynchronously, the event can fire before the module finishes loading on real phones, leaving #app permanently empty. The router now guards with a document.readyState check so renderPage() always runs.
PWA start_url mismatch on iOS
manifest.json had "start_url": "/" while the app uses hash routing. Launching from the iOS home screen landed on a bare static file instead of the app. Changed to "/index.html#/".
Known bugs
- Mobile version appears static, working on fix
Upgrading
No migration needed. Data stored in localStorage is fully compatible with this release. If you have the app installed as a PWA, it will update automatically on next launch.
Full changelog
See CHANGELOG.md for the complete history of changes across all releases.