Skip to content

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

522 Commits

Folders and files

Repository files navigation

Fotollection logo

Fotollection

by @hoangphi01

English · VI · Website

Fast, private, offline photo-print preparation for macOS, Windows and Linux.

Stamp the date and place on your photos, crop them to real print sizes, and get them ready for the lab, all without a single photo leaving your computer.

CI Docs License: GPL-3.0-only Status: pre-alpha Latest release

Platforms Rust 1.99 Tauri 2 React 19 shadcn/ui Offline · zero telemetry

Stars Last commit Issues Repo size


Note

Fotollection is in active development (0.x), with a new version every few days. It works end to end on macOS, Windows and Linux, for JPEG, PNG, HEIC and camera RAW, in three modes: Simple (keep or drop, then print), Collage (two photos on one print, or postcards) and Pro (stars, flags, best shot, crop, date stamp, info frame). Projects save as one .fotollection file that opens the same on another machine. Follow progress in docs/STATUS.md and docs/ROADMAP.md; the manual shows every step.

Fotollection over a photo of Prague: your trip, ready to print

Fotollection main window (light theme) Fotollection main window (dark theme)

Listed on the VNLF App Explorer and in the App Center of CaramOS, the Linux distribution made for Vietnamese users.

Why Fotollection?

You shot 800 photos on a trip and want twenty of them on paper. Getting there today is tedious:

  • Prints don't say when or where. In a few years, nobody remembers.
  • Labs auto-crop your photos to 2:3, 3:4 or 1:1, and that can cut off heads.
  • Online tools upload your photos. GPS data reveals where you live.

Fotollection does all of this locally, at the speed of native Rust.

Features

Feature Phase
📅 Date and location stamps from EXIF, in a film-camera LCD face. Places are resolved offline, with no API calls 1
✂️ Batch crop to 11 EU print sizes (9×13 … 20×30, square, strip), your own sizes (e.g. 4 × 6 in) or the photo's original ratio, with an adjustable crop per photo 1
🎚️ Three modes (new in v0.9.0): Simple, one photo at a time, ↑ keep, ↓ drop, then export; Collage, two photos on one print like a half-frame camera (a 10 × 15 holds two 10 × 7.5), with a suggested size, a cut line and drag to reorder; Pro, every control 1
✉️ Postcards (new in v0.9.4): in Collage mode, one photo and a postcard back on each 10 × 15 print, a dashed stamp box and writing lines, the text typed in a typewriter or a handwriting face or written by hand, one address for the whole set 1
🎨 Colour (new in v0.9.9): Faves (brightness, contrast, warm / cool, saturation, then highlights, shadows, tint, vibrance) and Tools (fade, toned shadows and highlights, black and white through a filter), for every photo or one; the stamp and the border are never tinted, and a photo with nothing set prints as before 2
🔲 3 mm border inside the print size on every print, with or without the info frame (new in v0.9.0) 2
⭐ Culling: stars, pick/reject flags and filters (flag, stars, RAW or not), RAW photos badged in the grid, a filmstrip under the photo in the preview, and a develop view a Lightroom user can read (its keys, before and after side by side or split, Navigator and History, the whole window); export writes exactly the filtered set 1
✨ Best-shot suggestions: groups bursts and similar shots and suggests the best of each (sharpest, eyes open, no shake), with reasons. Fully offline 1
🏷️ "Shot on …" info frame with camera, lens and exposure, LUMIX Lab style, at the exact print ratio 1
🖼️ Original quality: export at full resolution, ICC profile preserved, 4:4:4 JPEG for print 1
💬 Share online: light sRGB JPEGs at the original size, 2048 px for Facebook, 1080 px for Instagram or your own size, whole in a square or any ratio with a fill if you like, with the camera details and "Fotollection" as the editing app, never GPS. Export one photo straight from the preview 2
📱 JPEG, PNG and HEIC (iPhone) input 1
📷 Camera RAW as it is, no DNG needed: RW2, CR2, CR3, NEF, ARW, RAF, ORF and DNG, developed by Fotollection's own engine (a cleaner demosaic, neutral colour or the camera's look in one click, brightness, highlights, shadows and white balance made on the camera's own data); on macOS, Panasonic and Olympus by the system, with its lens corrections; thumbnails from the preview inside each file. Nothing to install on Windows 3
🖱️ Open with Fotollection from Finder or Explorer: the photo opens at once and its folder becomes a tab 2
⏱️ Camera clocks: a camera set to the wrong time is corrected from one phone photo of the same moment; every photo from it moves, the files stay untouched 1
⭐ Stars from Lightroom: stars and rejects saved in XMP sidecars by Lightroom, Bridge, Capture One or darktable come in with the photos; the sidecars are never changed 2
🧭 Places from your phone: a camera without GPS takes the place of a phone photo of the same scene shot minutes apart; sure matches are filled in, the rest are shown side by side to accept 2
📍 Dates and places by hand: give scans and photos without EXIF or GPS a date and a place, one photo or many at once, with an offline place search; rename a place ("Praha 1" → "Prague") and every print follows 1
🎥 Shoot from a camera on a cable: live view with the print's shape, Capture, and the shots in a tab to save or delete; no driver to install (Windows, Sony a6400 first) 2
🔒 GPS stripped on export by default. No account, no cloud, no telemetry 1
🌐 English and Vietnamese interface 1
📦 Project files like .docx: save, open on another machine with the same fonts, logos and settings, relink moved folders 1
🧳 Trip grouping, face-aware smart crop, duplicate detection 2
🎞️ Photo-book preview, QR codes on the back of prints 3

Full specification: docs/PRD.md.

Performance

Fotollection is built for enthusiast and professional photographers, so speed is a requirement, not a nice-to-have. Every number below is measured, not estimated, on an Apple M3 (8 cores, 16 GB) with real 16 MP JPEGs, 2026-10-23. Each chart has a reference to read it against: the budget, the memory ceiling, or the browser. Full results: docs/RESULT.md.

Against the budgets

Open a folder: 0.12 s per 1,000 photos, budget under 1 s. Preview: 18 ms, budget under 50 ms. Export: 18.0 photos/s, budget at least 8. Peak memory: 1.45 GB, budget at most 2 GB.

What Budget Measured
Open a folder (import + EXIF + first thumbnails) < 1 s per 1,000 photos 0.12 s per 1,000 (5,035 photos in 0.62 s) ✓
Preview update after a settings change < 50 ms (p95) 18 ms p95, 17 ms p50 ✓
Export throughput ≥ 8 photos/s at 24 MP 18.0 photos/s at 16 MP ✓
Peak memory ≤ 2 GB at any batch size 1.45 GB with 5,035 photos ✓
Best-shot analysis, per photo (2026-10-24) ≤ 20 ms, ≤ 40 ms with faces 17 ms, 28 ms with faces ✓

On a real trip (one folder of 20 MP Lumix GX9 photos, 422 files) the export reached only 7.6 photos/s with a 2.14 GB peak on 2026-11-03. The fix, in v0.9.7, exports its JPEGs at 10.1 photos/s, and the whole run peaks at 1.31 GB, within both budgets (RESULT.md §20).

Opening a photo

Since v0.11.0 a preview of every photo is prepared in the background and kept on disk, so any photo opens at once, RAW too (FR-091). On one trip's 422 photos, each version measured from its own code:

Opening a photo: v0.9.0 took 274 ms for a JPEG and 531 ms for a RAW, v0.10.0 278 and 440 ms, v0.11.0 27 ms for both, against a 100 ms budget.

Large batches

Memory must not grow with the number of photos. A batch 53 times larger costs 0.1 GB more at peak:

Peak memory: 1.35 GB for 95 photos and 1.45 GB for 5,035 photos, against a 2 GB ceiling.

Photos Peak memory Export Library in memory
95 1.35 GB 18.0 photos/s —
5,035 1.45 GB 15.4 photos/s 13 MB

The 5,035-photo export runs for more than 5 minutes, and the M3 throttles under that load, which explains the lower throughput.

Against the browser

The obvious alternative is a web app that does the same work in the browser (createImageBitmap + OffscreenCanvas, one Web Worker per core). Both ran on the same 95 photos on the same machine:

Batch export: Fotollection 18.0 photos/s, browser 17.9. Warm preview: Fotollection 17.4 ms, browser 18.5 ms. Peak memory: Fotollection 1.35 GB, browser 1.78 GB.

Fotollection (Rust) Browser (Chromium 156)
Batch export 18.0 photos/s 17.9 photos/s About the same
Warm preview, 1600 px (p50) 17.4 ms 18.5 ms Fotollection faster
Peak memory 1.35 GB 1.78 GB Fotollection 24 % lower

On raw export speed the browser is just as fast, because Chromium uses libjpeg-turbo with SIMD. Fotollection is now faster on previews. Speed alone is not the argument for a native app, though:

  • The browser can only encode JPEG with 4:2:0 chroma, which halves colour resolution. Fotollection exports prints in 4:4:4, with twice the chroma data, in the same time.
  • Fotollection uses 24 % less memory, and its export is bounded, as the large-batch test shows. A browser tab has a hard ceiling.
  • Fotollection writes the files with atomic renames and writes no EXIF, so GPS never leaves your machine. The browser only produced blobs and never wrote them.
  • Colour profiles (ICC), 16-bit RAW in Phase 3, and HEIC are out of reach in the browser.

Where the preview time goes

Preview breakdown: crop and resize 9.7 ms, date stamp under 0.1 ms, JPEG encode 7.0 ms, 16.7 ms in total, against Chromium at 18.5 ms and the 50 ms budget.

Step Time Share
Crop + resize 9.7 ms 58 %
Date stamp < 0.1 ms ≈ 0 %
JPEG encode 7.0 ms 42 %
Total 16.7 ms budget 50 ms · Chromium 18.5 ms

The encoder used to be the bottleneck: 16.2 ms, 62 % of a 26 ms preview. Previews are only ever shown on screen, so they now encode with 4:2:0 chroma and plain Huffman tables, which looks the same at 3× zoom. Print exports keep 4:4:4. That one change took the preview from 26 ms to 17 ms.

The graphics card while editing, every core for exports

One step of a colour slider: the CPU path 25.7 ms (Rust's render, its JPEG and the web view's decode), on the GPU 1.0 ms in WebKit and 2.0 ms in Chromium with Metal; 16.5 ms without a GPU (SwiftShader).

While a colour slider is dragged, the look is drawn by the graphics card from the same table Rust builds, so a step costs 1–2 ms instead of about 26, and the photo follows the slider; the date stamp, the frame and the border are left out, and Rust's render takes over when the drag ends (ΔE2000 to it: mean 0.13, p99 0.77). A machine without a capable GPU keeps the CPU path; the app decides by itself. Exports stay on the processor, so a print comes out the same on every computer (ADR-0039).

Export of 22 photos of 24–26 MP: 4.9 photos/s with 2 at once, 9.4 with 4, 11.5 with 6 (what the app uses), 12.5 with 8.

A photo is decoded and encoded on one core, so speed follows how many are worked on at once, within the memory budget. The app takes six: on a real trip folder with RAW files, eight was no faster and used 0.2 GB more.

Print quality: does the export keep the photo?

Speed means nothing if the print comes out flat. Prints made through a web editor often look shallow, with flat, blotchy colour and less depth than the original. So Fotollection's export is checked pixel by pixel against the original (bench/quality/audit.py), next to a typical web-editor export.

Detail kept: Fotollection 100 %, web editor 13 %. Colour saturation kept on Display P3 photos: 99.9 % against 86.8 %. Colour error ΔE2000: 0.19 against 1.39, where 1 is visible.

Measured against the original (median) Fotollection Typical web editor
Colour error, ΔE2000 mean (camera JPEGs; 1 is the threshold of a visible difference) 0.19 1.39
Colour error, 95th percentile 1.06 3.50
Fine detail kept (camera JPEGs) 100 % 13 %
Colour saturation kept (Display P3 photos, like an iPhone's) 99.9 % 86.8 %
Contrast and tonal levels kept 100 % 100 %
Pixel fidelity (PSNR) 52.6 dB 37.9 dB
Colour profile (ICC) kept 20 / 20 dropped

Why a web-editor print looks flat, and what Fotollection does instead:

  • The colour profile is dropped. Phone photos are in Display P3, a wider colour space than sRGB. Without the profile, the lab reads the colours as sRGB and they print about 13 % less saturated. Fotollection keeps the photo's own ICC profile in every export.
  • The photo is shrunk, then blown up again. A 2000 px image printed at 10 × 15 cm loses 87 % of the fine detail, so surfaces turn smooth and colours look blotchy. Fotollection exports at full resolution, and only resizes, with a Lanczos3 filter, when a print size needs it.
  • The colour is halved, and the JPEG is squeezed harder. Common editors use 4:2:0 chroma, which halves colour resolution, at quality 80. Fotollection exports prints at 4:4:4 and quality 90 by default, adjustable up to 100.

The test used 20 photos from a Canon compact, plus 5 of them converted to Display P3 with macOS's own profile. The web editor is simulated with standard settings (sRGB assumed, profile dropped, 4:2:0, q80, 2000 px, upscaled back for print). Reproduce it with cargo run --release -p fotollection-core --example quality_export -- <out> <photos…>, then uv run bench/quality/audit.py <photos> <out>.

Photos for social media

The Share online export makes light sRGB files with the camera details, sized for each platform. Measured on the same photos, then recompressed the way Facebook does (RESULT.md §10):

After Facebook recompresses: colour saturation kept on Display P3 photos 99.6 % against 86 %; difference from the original 3.5 % against 3.9 %; file size 3.08 MB camera file, 1.42 MB original size, 0.51 MB for Facebook.

Median Original size Facebook, 2048 px
File size (camera JPEGs, 3.08 MB) 1.42 MB 0.51 MB
Similarity to the original (SSIM, 1 = identical) 0.981 0.979
Colour error, ΔE2000 mean 0.96 1.27
After Facebook: colour of Display P3 photos kept, against the usual way — 99.6 % against 86 %

How good are the best-shot suggestions?

Speed is not enough for a feature that suggests which photo to keep, so best-shot suggestions are also scored for accuracy. 95 real photos (people, food, streets, night shots, sunsets) were labelled by hand: 22 groups of shots of one moment, and for 6 of them the photo that should be kept. eval_bestshot compares the app's groups and picks with those labels.

Groups found, of 22 labelled: dHash 3, plus layout and colour signature 13, plus zoom from focal length 15, plus fair sharpness and hidden faces 15. Acceptable picks: 2 of 2, 3 of 4, 5 of 6, 6 of 6. No group was ever wrong.

Step Groups found (of 22) Pairs found Wrong groups Acceptable picks
dHash (before) 3 9 % 0 2/2
+ layout and colour signature 13 67 % 0 3/4
+ zoom from focal length 15 73 % 0 5/6
+ fair sharpness, hidden faces 15 73 % 0 6/6
  • dHash (a 64-bit hash of brightness steps) flips its bits in flat areas such as sky. Two near-identical shots of a hotel scored as far apart as two unrelated scenes. It is replaced by a 32 × 24 layout signature compared by correlation over small shifts and zooms, plus a colour histogram that separates different scenes with a similar layout.
  • Re-shooting closer is common, for example 5 → 9.9 mm on the church at night. Zooming no longer splits a group: the focal lengths in EXIF tell the comparison how much closer the second shot is.
  • Fair comparisons. A shot with the face turned away used to be compared on whole-image sharpness against eye sharpness in the other shot. Now every shot in a group is measured the same way, and a face turned away or hidden counts against a shot.
  • Still missed: 7 groups where the pose or the framing changed a lot, such as a second pizza shot from the other side or a selfie taken upside down. Those need an image-understanding model, which is a next step. The 2 extra groups the app made are pairs labelled as ambiguous, not mistakes.

The analysis stays within its budget: 17.4 ms per photo, 27.6 ms with faces (NFR-014). The labels hold file names only, since the photos are private: label your own folder in the same format (bench/bestshot/truth-103_09.json) to score it.

Reproduce everything with bench/run.sh <photo-folder> and bench/batch.sh <photo-folder>; score best-shot suggestions with cargo run --release -p fotollection-core --example eval_bestshot -- <photo-folder> <labels.json>. The method is in docs/OPTIMIZATION.md §2, and the budgets every change must respect are in §3.

Download

Get the latest version from the Download page or the Releases page: a .dmg for macOS 11+ (Apple Silicon and Intel), a -setup.exe or .msi for Windows 10/11, and an AppImage or .deb for 64-bit Linux (which distributions). Versions follow Semantic Versioning; 0.x releases are previews until the MVP is complete. The app never checks for updates on its own: Check for updates, in the popover of the version number at the foot of any panel, asks GitHub when you click it. Installing over an older one keeps your settings and projects.

Important

Builds are unsigned for now (ADR-0009). On first launch:

  • macOS: System Settings → Privacy & Security → Open Anyway
  • Windows: SmartScreen → More info → Run anyway
  • Linux: nothing to approve; make the AppImage executable, or install the .deb (below)

Verify each download against SHA256SUMS.txt on the release page. See the code signing and privacy policy.

By system

The same app on every system, with these differences (ADR-0034):

macOS Windows Linux
Culling, stars, flags, best shot, print basket ✓ ✓ ✓
Print sizes, crop, straighten, zoom, date stamp, info frame ✓ ✓ ✓
Offline places, dates and places by hand, camera clocks ✓ ✓ ✓
Export for print and for social media ✓ ✓ ✓
JPEG and PNG ✓ ✓ ✓
Camera RAW ✓ ¹ ✓ ✓
HEIC (iPhone photos) ✓ ✓ ² not yet ³
Shoot with a camera over USB not yet ✓ ⁴ —
"Open with" from the file manager ✓ ✓ ✓ ⁵
Check for updates downloads the new version ✓ ✓ ✓ ⁶
  1. Every system develops RAW with Fotollection's own engine; on macOS, Panasonic and Olympus RAW go to the system first, for its lens corrections, which Fotollection's engine does not make yet. On Windows, Microsoft's Raw Image Extension, when installed, is only a last fallback.
  2. With Microsoft's free HEIF Image Extensions and HEVC Video Extensions.
  3. HEIC needs an HEVC decoder, which Linux does not ship and Fotollection will not bundle (patents). A later version will use the libheif your distribution installs (FR-068). Until then, convert HEIC photos to JPEG.
  4. Sony a6400 first (FR-063).
  5. With the .deb. An AppImage is not registered with the file manager unless a tool such as AppImageLauncher does it.
  6. The AppImage downloads the new AppImage; the .deb opens the release page.

Linux

Works on 64-bit Linux with glibc 2.35 or later, x86_64 or ARM64:

  • AppImage: Ubuntu 22.04+, Debian 12+, Linux Mint 21+, Pop!_OS 22.04+, elementary OS 7+, Zorin OS 17+, Fedora 36+, openSUSE Tumbleweed, Arch, Manjaro and others of that age.
  • .deb: Ubuntu, Debian, Mint, Pop!_OS, elementary OS and Zorin OS.

Works with a step:

  • Ubuntu 24.04 and newer: the AppImage needs FUSE 2 once: sudo apt install libfuse2t64. You can also run it with --appimage-extract-and-run.
  • NixOS: appimage-run Fotollection_*.AppImage.
  • Fedora Silverblue and other immutable systems: use the AppImage.
  • Nvidia graphics: Fotollection turns off WebKit's DMA-BUF renderer by itself, which avoids a blank window.

Does not run on:

  • glibc older than 2.35: Ubuntu 20.04, Debian 11, RHEL, CentOS, Rocky or Alma 8, openSUSE Leap 15;
  • musl systems such as Alpine;
  • 32-bit machines;
  • ChromeOS without its Linux container.

Install:

# One line for any distribution above: the signed APT repository on Ubuntu, Debian, Mint and
# their family (updates then come with sudo apt upgrade), the AppImage in ~/.local elsewhere
curl -fsSL https://fotollection.org/install.sh | sh

# Or the APT repository by hand
curl -fsSL https://fotollection.org/apt/fotollection.gpg | sudo tee /usr/share/keyrings/fotollection.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/fotollection.gpg] https://fotollection.org/apt stable main" | sudo tee /etc/apt/sources.list.d/fotollection.list
sudo apt update && sudo apt install fotollection

# AppImage (any distribution above), x86_64; use _aarch64 on ARM
chmod +x Fotollection_*_amd64.AppImage && ./Fotollection_*_amd64.AppImage

# .deb (Ubuntu, Debian, Mint…), from the folder you downloaded it to; _arm64.deb on ARM
sudo apt install ./Fotollection_*_amd64.deb

System requirements

Minimum Recommended Notes
Operating system macOS 11 Big Sur, Windows 10 64-bit, or 64-bit Linux with glibc 2.35 (which distributions) macOS 13 or later, Windows 11, or Ubuntu 24.04 Apple Silicon and Intel Macs. Windows uses the WebView2 runtime, built into Windows 11 and installed automatically on Windows 10. Linux uses WebKitGTK 4.1, bundled in the AppImage and installed with the .deb
Processor Any 64-bit CPU from the last ~8 years Apple Silicon, or a recent 4+ core x64 Work is spread over all cores. Every number in Performance is from an Apple M3
Memory (RAM) 4 GB 8 GB or more An export stays under 2 GB even for 5,000+ photos (measured peak 1.45 GB, NFR-004). Since v0.11.0, the preview keeps up to a quarter of the memory so photos open at once (FR-091)
Disk 100 MB free plus the cache 1 GB free The app is meant to stay under 25 MB (NFR-008). The cache takes about 25 MB per 1,000 photos (thumbnails about 22 KB and best-shot analysis about 4 KB each) and is safe to delete. Exports need space for the full-resolution files
Display 1280 × 800 1920 × 1080 or a Retina display The toolbar adapts to narrow windows
Internet Not needed — Everything runs offline: faces, places and previews included. Nothing is uploaded
HEIC (iPhone photos) macOS: built in — Windows: install HEIF Image Extensions and HEVC Video Extensions from the Microsoft Store (ADR-0017). Linux: not yet (ADR-0034)
Camera RAW macOS: built in — Windows and Linux: built into Fotollection, nothing to install (ADR-0029). With Microsoft's Raw Image Extension installed, the system's codec is a last fallback on Windows (ADR-0023)

To build from source you also need about 10 GB free for Rust build files (a debug and a release build; scripts/clean.sh reclaims them), Rust (installed by rustup, version pinned in rust-toolchain.toml), Node.js 22 or later, and Xcode Command Line Tools (macOS), the MSVC Build Tools (Windows), or WebKitGTK 4.1 and GTK 3 development packages (Linux, as scripts/bootstrap.sh installs them). The full list is in docs/DEVELOPMENT.md §1.3.

Build from source

git clone https://github.com/hoangphi01/fotollection.git
cd fotollection
scripts/bootstrap.sh --install     # macOS / Linux (Windows: scripts\bootstrap.ps1 -Install)
npm run dev                        # start the app

Every tool version is pinned: rust-toolchain.toml, .node-version, Cargo.lock, package-lock.json and, for the Python tooling managed with uv, uv.lock. A fresh clone therefore builds the same on any machine. See docs/DEVELOPMENT.md for prerequisites, commands and build-disk cleanup (scripts/clean.sh).

Tech stack

Layer Technology
Core (Rust) Pure-Rust codecs: zune-jpeg with jpeg-decoder for rare layouts, jpeg-encoder, png (ADR-0012, ADR-0033); HEIC through the OS (ImageIO / WIC, ADR-0017); camera RAW through Fotollection's own reader and rawler, the system's codec first on macOS (ADR-0029, ADR-0030); colour management with qcms (FR-027); fast_image_resize, ab_glyph, rayon; GeoNames for offline places (ADR-0003)
Shell Tauri 2: the system webview, no bundled Chromium
UI React 19, TypeScript, Tailwind CSS 4, shadcn/ui, Lucide
Typed IPC tauri-specta: TypeScript bindings generated from Rust

Design: docs/ARCHITECTURE.md. Decisions: docs/adr/.

Documentation

All docs live in docs/ and change together with the code (ADR-0006).

Doc What's inside
PRD Requirements (FR-xxx, NFR-xxx)
Architecture Crates, pipeline, IPC contract
Results Latest measured speed and memory
Optimization Budgets, methodology, benchmark log
File formats .fotollection, .fotopreset and every other file type
Style rules Rust, TypeScript, UI, git and docs conventions
Security Threat model, privacy, supply chain
Roadmap / Status Phases and progress
User guide How to use the app, step by step; also the manual on the website
Error codes Every ERR-… code the app can show: cause and what to do
Docs guide What to update when something changes
Development / Testing / Release Setting up, tests, how a version ships
Lessons What each debugging session taught
Changelog What changed in each version

Contributing

Contributions are welcome, from people and from AI agents. Please read CONTRIBUTING.md first: it explains where each fact lives, how to keep the docs in step with the code, how to read and add error codes, and how to open issues and pull requests. In short:

  • Every change traces to a requirement ID (FR-…, NFR-…), and IDs are never reused.
  • Docs are updated in the same commit, following docs/DOCS_GUIDE.md.
  • A bug report brings the ERR-… code and the app's Copy diagnostics text.
  • Outside contributions require signing a CLA (ADR-0008).

Report security issues through a private GitHub security advisory, not a public issue.

Support

Fotollection is free, made by a student between classes and a part-time job. If it saves you time, you can sponsor it on GitHub, monthly or once, or, from Vietnam, scan the VietQR code on the website.

License

GPL-3.0-only © hoangphi01.

Third-party notices

  • JPEG encoding uses jpeg-encoder, which is based in part on the work of the Independent JPEG Group.
  • The text inside the photo uses DSEG14 Classic Italic by keshikan, and the info frame uses Inter; both under the SIL Open Font License 1.1 (crates/core/assets/fonts/). The interface uses Be Vietnam Pro and, for figures set mono, Geist Mono (both OFL 1.1), bundled so it looks the same on Windows, macOS and Linux.
  • The website's support section draws its VietQR code with qrcode-generator by Kazuhiko Arase, MIT licence (site/assets/js/qrcode.js, kept as published). QR Code is a registered trademark of DENSO WAVE INCORPORATED.
  • Postcard text uses Xanh Mono Regular and Italic by Yellow Type Foundry, and Patrick Hand by Patrick Wagesreiter, both under the SIL Open Font License 1.1 (crates/core/assets/fonts/, sources and checksums in FONTS.md).
  • Place names come from GeoNames (CC BY 4.0), bundled for offline geocoding: towns and cities with at least 1,000 people, snapshot 2026-10-24 (crates/core/assets/geo/).
  • Trademarks. The camera-brand logos in the info frame (Apple, Canon, Fujifilm, Hasselblad, Leica, Lumix, Nikon, Noritsu, Phase One, Ricoh, Samsung, Sony) are trademarks of their owners. They are public-domain renderings from Wikimedia Commons (list and sources), used only to show which camera (or film scanner) took a photo. Fotollection is not affiliated with, sponsored or endorsed by any of these companies, and a logo is removed on request.
  • Camera RAW on Windows (and on macOS for what ImageIO cannot read), except the formats Fotollection's own reader has taken over (DNG for now, ADR-0030), is decoded by rawler by Daniel Vogelbacher and contributors, under the GNU Lesser General Public License 2.1 (ADR-0029). Fotollection's complete source is published, so it can be rebuilt with a modified rawler.
  • Best-shot suggestions bundle the YuNet face detector (MIT, © 2020 Shiqi Yu) and Google's MediaPipe FaceMesh V2 landmark model (Apache License 2.0), converted to ONNX. Licences and checksums: crates/core/assets/models/.

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages