Skip to content

Personalizing FilmCalc

Trent Bauer edited this page Jul 12, 2026 · 4 revisions

Personalizing FilmCalc

Most of this lives in the Settings tab, plus a one-time setup screen the first time you import data. Everything here is stored per-browser (localStorage) unless you export it.

First time using the app

If you haven't saved any films or labs yet, a banner offers 📥 Import Presets… — pick from the project's built-in film/lab data (grouped by country/city), or upload your own config.yaml. Right after an import, a Set Up Your Favourites screen walks you through the two things below.

Your home lab

Settings → Default Lab & Service (or the ♥ Set Up Favourites… screen). Pick your usual lab and service tier here, and:

  • The Film Lookup headline shows your cost with that lab, noting the actual cheapest option underneath if a different one would save you money.
  • The Dev Cost → Per Film view pins your home lab to the top of the list regardless of price.

Leave it as "None" to have both of those always show the theoretical cheapest instead.

Favouriting and ignoring films

The same setup screen (also reachable via Settings → ♥ Set Up Favourites…) lists every saved film with two toggles:

  • ✕ Ignore — hides the film everywhere the calculators look (same effect as the "Hide this film from the Calculator" checkbox in Film Setup). Use it for stocks you'll never shoot, without losing the saved data.
  • ♥ Favourite — marks stocks you actually shoot. On the Dev Cost → Per Photo view (the one ranked film-first), a favourited film is pinned to the top of the list regardless of price — the same ♥ toggle is also right on each row there, not just in the setup screen.

Favouriting labs

Separately, tap the star on any lab row in the Dev Cost tab. Starred labs are pinned to the top of every other Dev Cost view (Per Film, Per Lab, Per ISO — everywhere rows are grouped by lab rather than by film), ahead of price order — while the ⭐ "cheapest" marker keeps reflecting true price rank underneath. Handy for keeping "my usual place" visible without it needing to actually be the cheapest.

Recommended Pick Threshold

Settings → Recommended Pick Threshold. In "Labs For This Roll", if the cheapest Hi-Res + Next-Day option costs less than this percentage more than the absolute cheapest, its card is highlighted gold as the recommended pick — the idea being a small premium for both perks is usually worth it. The same threshold drives the equivalent "upgrade" flag on the Dev Cost → Per ISO view. Defaults to 4%; "Cheapest Total" always shows the true cheapest regardless of this setting.

Currency symbol

Settings → Currency. Purely a display label in front of every cost shown in the app — it doesn't convert any numbers. Pick from the list or choose Custom… to type your own (e.g. kr).

Themes

Settings → Theme. Custom colour themes shipped in the project's themes/ folder, each defining both a light and a dark variant so the dark-mode toggle keeps working no matter which theme is active. The dark/light toggle itself is the icon in the top corner of the app — it follows your system preference until you change it.

Writing your own theme

A theme is a YAML file in themes/, listed in themes/index.json. The minimum is a page background, card background, and accent color, each for light and dark:

label: Ocean
light:
  pageBg: "#eff6ff"
  cardBg: "#ffffff"
  accent: "#0369a1"
dark:
  pageBg: "#0b1220"
  cardBg: "#111c2e"
  accent: "#38bdf8"

Beyond that, a theme can optionally recolour seven specific result meanings the app uses everywhere — the cheapest option, a recommended pick, a ★/♥ favourited row, your 🏠 default lab, warning banners (e.g. an aggressive push/pull), danger flags (e.g. over your film's push/pull limit), and the general grouping/input cards (e.g. Film Lookup's "Film" and "Shooting at" blocks, Library's Film/Lab Management panels, the Expired tab's info box):

light:
  # ...pageBg/cardBg/accent as above, plus:
  cheapestBg: "#e0f2fe"        # background of cheapest-option cards
  cheapestText: "#0369a1"
  recommendedBg: "#fef9c3"     # background of recommended-pick / ⭐ cheapest-marker cards
  recommendedText: "#a16207"
  favourite: "#0891b2"         # ★/♥ fill color when something's favourited
  defaultLab: "#0369a1"        # 🏠 "this is your default lab" note text
  warningBg: "#ffedd5"         # push/pull warnings, "a cheaper option exists" callouts
  warningText: "#9a3412"
  dangerBg: "#fee2e2"          # over your film's push/pull limit
  dangerText: "#b91c1c"
  sectionBg: "#f1f5f9"         # generic grouping cards (Film/Shooting At/Expired info/Library panels)
  sectionText: "#334155"
dark:
  # same keys, dark-mode values

Every one of these is optional — leave any out and that piece keeps the app's normal green/gold/red/ indigo/slate colors, even while the rest of your theme is active. See themes/ocean.yaml for a theme that sets all of them, and themes/sepia.yaml for one that only sets the original three (proving the two styles mix freely).

Backing up and moving your data

Settings → Export Data:

  • Export Everything writes a single config.yaml with your films, labs, and settings — the exact format the app reads on load, so it can be dropped straight into a fresh browser or a self-hosted instance.
  • Export Films Only / Labs Only asks for a preset name, saved inside the file, so it shows up under that name when re-imported — handy for sharing just your own list with someone else, or for contributing it to the project's public presets.

Settings → Import Data offers the same two paths in reverse: pick from the project's built-in presets, or upload/drag-and-drop your own config.yaml, films.yaml, or labs.yaml — multiple files at once are fine.

If you're self-hosting and the server allows it, Write Live Config to Server appears automatically and saves your current films/labs/settings straight to config.yaml on the box — no download/upload round-trip. It only shows up when the app detects write support; the public GitHub Pages build never shows it, since static hosting has nowhere to write to.

Settings → Delete All Data permanently clears every saved film, lab, and setting this app has written to your browser — favourites, pins, home lab, currency, theme, everything. Built-in defaults seeded via config.yaml on a self-hosted instance aren't affected, since those live on the server, not in your browser. Export a backup first — this can't be undone.

Clone this wiki locally