R
rows.life
WHAT'S NEW

Release Notes

Every improvement, feature, and fix — documented as it ships.

March 2026
fix

Fix location points not updating in edit dialogs

Fixed two issues with adding and removing location points in the entry edit dialog (both mobile and desktop). First, adding or removing a location point wouldn't visually update the list — the dialog appeared frozen, but the change was actually saved, so it would show up after closing and reopening. This was caused by the dialog working on a stale copy of the entry that wasn't kept in sync with the underlying data store. Second, when adding a new location point to an entry that already had one, the picker would show the existing point as a static pin instead of acquiring a fresh GPS fix. Now the picker always starts with GPS active, and all add/remove changes are reflected immediately in the dialog.
fix

TUI: skip passphrase prompt when key is cached

The terminal client no longer asks for your decryption passphrase when a valid cached key already exists. You'll only be prompted the first time or after a passphrase change.
fix

Clickable screenshots in release notes

Screenshots in the release notes page are now clickable — click any image to view it full-size in a lightbox overlay. Press the image or the × to close.
feature

TUI: delete rows from the terminal

You can now delete entries directly from the terminal client. Press Delete or Backspace on any row and confirm with y — any other key cancels. The status bar shows the keybinding hint and a red confirmation prompt so you won't delete anything by accident.
feature

TUI map — browse your locations from the terminal

The terminal client now renders an interactive map with all your GPS-tagged entries. Press m on any row to see its location points on a true-color Mapbox map rendered with half-block pixel art. Pins are color-coded by category, and pressing n/p cycles through markers with a label showing time and category. Press a to toggle between the selected entry's locations and all your locations (fetched live from the API). Rows with GPS data show a indicator in the table so you can spot them at a glance. Pan with arrow keys, zoom with +/-, and switch between six map styles with s.
TUI map — browse your locations from the terminal
feature

Multiple GPS points per entry — trace your path, not just your start

Entries can now hold multiple GPS coordinates instead of just one. This is a big deal for anyone who moves during an entry — a morning hike, a road trip, or an afternoon of running errands across town. Each point appears as its own pin on the Map, and tapping a pin shows the exact time that coordinate was recorded alongside the row's start time. In the entry editor, a new Location tab lists all points with their timestamps, and you can add or remove individual coordinates. Combined with rows import-gps, this means every photo you took during an entry automatically becomes a pin on the map — so a 3-hour bike ride doesn't collapse to a single dot, it becomes a trail of everywhere you stopped to take a picture.
improvement

CLI: smarter GPS import with distance-based dedup and auto-created entries

The rows import-gps command now uses real distance calculations (haversine formula) to deduplicate GPS coordinates. Photos taken within 50 meters of each other on the same entry collapse into a single point — so ten selfies at the same restaurant become one pin, not ten. You can safely re-run the import on the same photo directory: existing coordinates are checked by distance, and only genuinely new locations are added. This also means importing overlapping photo libraries (e.g. iCloud copies + local backups) won't create duplicate pins.

The --create-missing flag is now much smarter. Instead of creating one row per day, it clusters photos by time: if there's more than a 1-hour gap between consecutive photos, it starts a new entry. Each entry gets the proper start and end times from its photo cluster, all GPS points (deduplicated within 50m), and a place name automatically resolved via OpenStreetMap reverse geocoding — so instead of a blank row, you get something like "Calle Mayor, Salamanca" as the note. The entries are created under the 'Location' category.

CLI: smarter GPS import with distance-based dedup and auto-created entries
improvement

Map: formatted notes and "Go to entry" link in popups

Map pin popups now render text formatting — bold, italic, underline, and strikethrough are displayed correctly instead of showing raw markdown markers. Additionally, each popup now includes a "Go to entry" link that takes you straight to that day in the Log view, making it easy to find and edit the full entry.
feature

TUI: create new categories and subcategories inline

You can now create new categories and subcategories directly from the terminal UI picker. Just start typing a name that doesn't exist yet — a '+ create' option appears at the bottom of the list. Press Enter to create it on the server and assign it to the current row in one step. Works for both parent categories and subcategories.
feature

CLI: enrich your entries with GPS locations from your photos

You can now enrich your entries by adding GPS locations extracted from your photo collections! Since photos and videos contain GPS coordinates in their EXIF metadata, the new rows import-gps command reads them and adds the locations to your rows.

For example:

$ rows import-gps C:\Users\pablo\Pictures\2021\ --device "Apple iPhone 7" --device "Apple iPhone 13" --preview

This scans all photos and videos in the directory, filters by the specified devices (your phones, not your family's), and shows a preview of which entries would be enriched — without changing anything. The command displays a summary of all camera devices found, so you can decide which ones to include.

Remove --preview to actually apply the changes. Photos are strictly matched to rows by time window: a photo only enriches a row if it was taken during that row's time range. Existing locations are never overwritten.

Use --create-missing to also create new 'Location' entries for dates where you have GPS-tagged photos but no matching row. Without it, only existing rows are enriched.

Supports JPEG, HEIC, PNG, TIFF, MOV, and MP4 files.

improvement

Decryption effect enabled for everyone

The visual decryption effect — where your encrypted notes unscramble into readable text as they load — is now enabled for all users. We had temporarily restricted it to a single test account while we hardened it against edge cases with contenteditable fields and virtualized scrolling. After several days of testing with zero data corruption issues, we're confident it's solid. Enjoy the crypto vibes.
feature

Map view — see where your life happens

A brand new Map tab lets you visualize all your location-tagged entries on an interactive map. Pins are color-coded by category, and tapping one reveals the date, time, and notes. Filter by time range (today, this week, a specific month, or all time) and by category to answer questions like "where did I work from in February?" Pins cluster automatically when you zoom out, so even thousands of entries stay clean. As always, your coordinates are zero-knowledge encrypted — they're decrypted only in your browser.
Map view — see where your life happens
fix

Year shown in filtered day headers on mobile

When filtering rows on mobile, day headers now include the year (e.g. "Sun, Jan 15, 2026") so you always know the full date.
fix

Rows no longer disappear when editing dates

Fixed a long-standing issue where changing a row's date or start time to a different day caused it to vanish mid-edit. The row would silently re-sort to its new chronological position, leaving you staring at a gap. Now the row stays pinned in place while you edit. When you move to another row, the view automatically navigates to the entry's new date so you can see exactly where it landed. Also fixed inserting rows between existing entries (via Ctrl+Shift+Enter or the insert icon): new rows now correctly inherit the time of the row above instead of jumping to the current date, so they stay right where you'd expect them.
fix

Fix categories showing as [unknown] in stats

Fixed a bug where reusing a pre-existing type (e.g. Rest / General) could cause it to appear as [unknown] in the stats breakdown. This happened because the app kept a stale reference to a category the server had already cleaned up. Most likely to affect accounts with only a few entries.
February 2026
fix

Bold and formatting kept when editor expands

Applying bold or other formatting to a long line no longer loses the formatting when the full editor opens automatically.
improvement

More room to type on mobile edit

Removed the delete button from the mobile edit screen to free up vertical space for typing. You can still delete rows by swiping on them in the rows list.
fix

Fixed database issue that prevented saving rows

A database permission issue caused row updates to fail for approximately 2 hours. The new row versioning table was created during a deployment but the application's database user was not granted access to it. Since row versioning runs before every save, all updates were blocked. No data was lost — rows that were already saved remained intact, but new edits during the window were not persisted. The issue has been fixed and a permission step has been added to prevent this from happening again.
fix

Fixed notes corruption caused by decryption visual effect

Fixed a bug where the decryption visual effect could leave garbled cipher characters stuck on screen, on both desktop and mobile. When data refreshed in the background while the scramble animation was still playing (e.g. returning to the tab, or saving another entry), the animation could lose track of the original text — leaving some fields permanently showing a mix of real text and random characters. Data in the database was never corrupted by this bug; it only affected what was shown on screen. However, if you edited and saved while the garbled text was visible, the corrupted text would be saved. The fix ensures the animation properly preserves and restores original content, and adds safety checks that cancel the animation when you interact with a field.
fix

Mobile row updates after save

Saving a mobile row entry now immediately reflects the changes in the rows list. Previously, edited values wouldn't appear until the page was refreshed.
fix

Mobile save reliability

Fixed an issue where row edits on mobile appeared saved locally but were lost on reload. The save button now shows 'Saving...' while the server confirms, and rolls back the UI if the save fails so you always see the truth.
improvement

Row version history (safety net)

Every time you update a row, the server now saves a snapshot of the previous values before overwriting. If a bug ever corrupts a row's content, the original data can be recovered from the version history. Versions are kept as long as the row exists and cleaned up automatically when a deleted row is permanently purged (30+ days after deletion). No impact on normal usage.
feature

Filter and search on mobile

The filter system now works on mobile. Tap the filter icon to open a bottom sheet with category, subcategory, date range, and notes search. A crimson bar shows your active filter with one-tap clear. All five filter types from desktop are available on mobile.
Filter and search on mobileFilter and search on mobileFilter and search on mobile
improvement

Smarter date handling for new rows

New rows now use the current date and time when the gap from your last entry exceeds 5 hours. No more manually correcting the date after a night's sleep or a long break.
feature

GPS location tracking

Optionally attach your GPS location to time entries. An interactive map picker shows where you are, and coordinates appear in both the diary view and PDF exports. Location data is encrypted with the same zero-knowledge architecture as your notes — the server only sees encrypted blobs.
feature

Rich text editing for notes

Notes now support rich text formatting with bold, italic, and underline. A compact formatting toolbar appears when editing, and keyboard shortcuts (Ctrl+B, Ctrl+I, Ctrl+U) work too. What you type is what you see — true WYSIWYG editing right inside the spreadsheet row.
feature

Diary view for mobile

The diary view is now available on mobile with a dedicated single-page layout optimized for smaller screens. Browse your days as a journal, right from your phone.
feature

Demo mode

New users can now explore rows.life with two years of realistic demo data (4,260 entries) before committing to their own tracking. See what long-term time tracking looks like — statistics, diary entries, and patterns — all without creating a single row.
feature

Filter and search your rows

New Filter panel lets you narrow down rows by category, subcategory, and date range. Also includes full-text notes search — your encrypted notes are decrypted client-side and searched locally, so the server never sees your search queries.
feature

Mobile date editing and cross-device sync

You can now edit dates and manage categories directly on mobile. Categories also refresh automatically when switching devices, so changes sync across all your sessions.
improvement

Smarter autocomplete

Autocomplete suggestions are now ranked by usage frequency — your most-used categories and subcategories appear first. Also added the ability to reassign subcategories between categories.
improvement

Mobile experience overhaul

Major improvements to the mobile experience: better button handling, fixed layout issues, smoother view transitions without blank screens, and landscape mode support.
feature

rows.life launches

The first public release of rows.life — a time tracking app with zero-knowledge encryption. Log your hours in a spreadsheet-like interface, view statistics by category, and export everything to PDF.