LibraRex T-Rex reading a book logo

LibraRex

Your Library App
☁️ Your data, your Drive 🍎 iOS · 🤖 Android · 🖥️ Windows 🏷️ v0.22 — T-Rex Branding

📖 What is LibraRex?

LibraRex is your personal library app — a beautiful, easy-to-use way to keep track of every book in your life. Whether you're an avid reader juggling multiple series, a collector with shelves overflowing, or someone who simply wants to remember what they've read and what to read next, LibraRex keeps it all in one place.

Your data, always yours. LibraRex stores your library in your own Google Drive — not on someone else's servers. You can open it as a spreadsheet any time, export it whenever you want, and you'll never lose access if the app goes away.
📚
Your whole collection, organised

Track books you own, books you've borrowed, your wishlist, and your digital reads — all in one beautifully organised library you can search, filter, and browse instantly.

📷
Scan barcodes to add books

Point your phone at any book's barcode and LibraRex looks it up automatically — cover art, author, series, everything. Scan one book or a whole stack at once. (iPhone & Android)

🔖
Never lose track of a series

LibraRex automatically detects which series your books belong to, shows you what you own in reading order, and highlights the gaps so you know exactly which books to hunt for next.

🤝
Remember who has your books

Lent a book to a friend and can't remember who? LibraRex tracks who you've lent to and who you've borrowed from, so you'll always know where your books are.

Rate and review your reads

Give books a star rating (with half-star precision), write personal notes, log when you finished reading, and tag books by genre — build a record of your reading life.

📱
Works on your phone, tablet & PC

LibraRex is preparing for initial iPhone, iPad, Android phone, and Android tablet tester releases. Windows remains build-verified outside the first mobile tester gate.

Available on

🍎 iOS ✅ Tester target
🤖 Android ✅ Tester target
🖥️ Windows 🧪 Build verified
🍏 macOS 🗺 Roadmap

📸 Screenshots

LibraRex running with a real book collection across iPhone and iPad.

Book library grid view
Book grid — covers & read status at a glance
Book detail screen
Book detail — full metadata & personal notes
Series grid view
Series view — auto-detected from your collection
Quick Add search screen
Quick Add — search & tap to import
Library Settings dialog
Library Settings — manage your connected spreadsheet
Series detail with missing books
Series detail — ghost slots for books you don't own yet

🔐 Authentication

🔑
Google Sign-In

OAuth 2.0 via google_sign_in. Session persists across reloads via flutter_secure_storage.

👤
Per-User Sheets

Each Google account gets its own isolated spreadsheet. No data is shared between users.

🚪
Sign-Out

Confirmation dialog before sign-out. Clears session and returns to the auth screen.

🦖
Splash Screen

Branded auth screen with the LibraRex T-Rex mascot badge, wordmark, and "Your library app" tagline.

📚 Book Collection Management

📗
Four Book Types

Owned, Borrowed, Wishlist, and Digital — each with appropriate icon and colour treatment.

📍
Physical Status

Available, Lent Out (with borrower name), or Missing. Status is filterable independent of type.

Read / Unread

Simple read flag displayed as a badge in grid cards and list items.

Half-Star Ratings

0.5 increments from 0.5 to 5.0 (e.g. 4.5 ★). Tap left half of a star for a half-star.

📝
Rich Metadata

Notes, genre, publisher, publication year, ISBN, cover URL, and full blurb storage.

🔗
Lent-To Tracking

Record who you've lent a book to. Shown prominently in card and list views.

🖥️ Library UI

Grid View

Card layout with cover art, title, author, and contextual status info at the bottom.

List View

Compact rows with thumbnail, title, author, rating, and type badge overlay on the cover.

🔍
Animated Search

Search bar slides in/out with ClipRect animation. Searches title, author, and ISBN.

🔽
Filter Pills

Two popup filter buttons — Type and Status. Status is always active regardless of type filter.

🔄
Pull-to-Refresh

Swipe down to re-sync the latest data from Google Sheets.

💀
Shimmer Skeletons

Animated loading placeholders for grid and list views during the initial data fetch.

✏️ Add / Edit & Detail

Quick Add Screen

Dedicated entry point via the library FAB. Search tab with live results (cover, series chip, author) or ISBN tab for direct entry. Tap any result to pre-fill the full form instantly.

Add Book Form

Full 18-field form with type picker, status selector, read toggle, format chip picker, location field, and half-star rating.

🔎
Book Lookup

Search by ISBN or title via Google Books / OpenLibrary. Auto-fills cover, publisher, year, series, and blurb.

📄
Detail Screen

Full read-only view with large cover. Inline editable rating and location. Series chip links directly to the Series Detail screen.

🗑️
Delete with Confirm

Confirmation dialog before removing a book from the library and Google Sheets.

🖼️
Bulk Scan

Scans all books to fetch/update cover artwork and blurbs. Progress dialog with per-book status.

🔖 Series Intelligence

LibraRex can discover, display, and track book series — showing you what you own, what's missing, and making it easy to fill the gaps.

📋
Series Detail Screen

Rich view of all books in a series in reading order. Owned books show with cover art; missing books appear as ghost slots with their order number and title.

🔍
Find Missing Books

4-tier API lookup: Google Books → WikiData SPARQL (exact + fuzzy) → OpenLibrary by series name → OL author + keyword supplement. Catches partial coverage across all sources.

👻
Ghost Row Slots

Missing series books shown as dim placeholders. One-tap "Add to Wishlist" CTA turns any gap into a tracked wishlist entry.

✏️
Editable Series Name

Series name editable directly from the Series Detail screen. Changes save to all owned books in the series at once.

🔢
Series Order Chips

Each book slot shows its reading order number. Owned books without a stored order are matched to slots by normalised title comparison.

🔎
Search Within Series

Filter bar inside the Series Detail screen to quickly find a specific book when a series spans many entries.

How the lookup works: The app queries Google Books first (fastest, best mainstream coverage), then WikiData SPARQL (excellent for classic and literary series), then OpenLibrary by series name, and finally OpenLibrary by author + series keyword as a final supplement. Results from all sources are merged and de-duplicated by series order — preferring entries with cover art.

↕️ Import / Export

⬇️
Export CSV

Downloads the full library as a CSV file. Smart decimal formatting (writes "4.5" not "4.5000").

⬆️
Import CSV

Maps CSV columns to book fields with row-level validation. Reports errors for malformed rows.

📁
File Picker

Native file picker on iOS, Android, and Windows via file_picker. Platform download utility handles save correctly per platform.

⚙️ Library Manager

Accessible via the ⋮ overflow menu → Library settings…, the Library Manager gives you a full view of all your libraries and complete control over them — no spreadsheet IDs or technical knowledge required.

📋
See All Your Libraries

All your LibraRex libraries appear in one list — each showing how many books it contains and when it was last updated. The one you're currently using is highlighted with a checkmark.

👆
Switch Libraries with a Tap

Tap any library to switch to it instantly. LibraRex validates it before connecting — it will never load a library that isn't in the right format.

✏️
Rename Libraries

Tap the pencil icon on any library to rename it inline. The new name saves to Google Drive immediately so it's easy to find later.

🗑️
Move to Trash

Remove a library you no longer need. It moves to your Google Drive trash — not permanently deleted — so you can restore it any time if you change your mind.

Create a New Library

Tap the + New Library button to create a fresh empty library in your Google Drive. Your existing library is never touched — you can switch back to it any time.

🔒
Always Safe

LibraRex never permanently deletes your data. Trashing a library only moves it to Google Drive's trash, where it can be restored. Switching or creating new libraries never affects your existing books.

Tip: You can maintain separate libraries for different purposes — a personal collection, a family shared library, or a wishlist-only view — and switch between them with a single tap.

🎨 Brand & Themes

LibraRex full T-Rex mascot badge
LibraRex simplified app icon
LibraRex horizontal T-Rex wordmark lockup
🦖
T-Rex Mascot

LibraRex is a friendly green T-Rex with reading glasses and a book. The full mascot badge is used for splash, website, and marketing; the simplified mark is used for small app surfaces.

🟠
Amber / Cognac Palette

Primary #B5621E (warm cognac), accent #D4943A (gold). Inspired by aged leather and parchment.

☀️
Light Theme

Parchment background (#FDF5EC) with white card surfaces. Warm and readable.

🌙
Dark Theme

Deep brown background (#191410) with warm dark surfaces (#271D15). Easy on the eyes at night.

⚙️
System Theme

Follows the device OS preference. Switches automatically between light and dark.

🔁
Theme Toggle

Overflow menu (⋮) cycles System → Light → Dark → System. Updates the whole app instantly.

🗺️ Roadmap

The following are potential enhancements, not yet prioritised or scheduled. They are grouped by theme to aid planning conversations.

☁️ Alternative Backends & Sync

  • OneDrive / SharePoint — store the library as an Excel file in a user's OneDrive account, enabling Microsoft 365 users to use LibraRex without a Google account
  • Dropbox / iCloud Drive — JSON or CSV file sync for Apple-ecosystem users
  • Firebase Firestore — real-time multi-device sync, potential for social / sharing features
  • Supabase (PostgreSQL) — open-source Firebase alternative for self-hosters
  • Local-only mode — full offline use with no cloud backend required

📶 Offline & Performance

  • Hive / SQLite local cache — persist books locally so the app loads instantly and works without connectivity
  • Background sync — push local changes to the backend when connectivity is restored
  • Optimistic UI updates — reflect edits instantly without waiting for the API round-trip
  • Pagination — load books in pages for very large libraries (1,000+ books)

🔍 Book Discovery & Metadata

  • Author pages — aggregate all books by an author, with bio from Open Library
  • Richer metadata — page count, language, subjects, awards
  • Book recommendations — suggest similar books based on genres and ratings in the library

📊 Reading Tracking

  • Reading progress — track current page or percentage complete per book
  • Reading dates — log when a book was started and finished
  • Annual reading goals — set a target number of books for the year
  • Statistics dashboard — charts for books read per month/year, genre breakdown, average rating, reading pace
  • Reading streaks — gamified daily reading habit tracking

📦 Collections & Organisation

  • Multiple shelves — custom named collections (e.g. "Holiday Reads", "Book Club")
  • Tagging system — flexible user-defined tags in addition to type/status
  • Bulk actions — select multiple books to move, tag, or delete at once
  • Custom sort orders — sort by title, author, rating, date added, year published

📥 Import from Other Services

  • Goodreads CSV import — map Goodreads export columns to LibraRex fields
  • Apple Books — import reading history
  • Kindle / Amazon — import purchased and read book lists
  • LibraryThing — support the LibraryThing export format

🔗 Export & Integrations

  • Notion export — push library as a Notion database
  • Airtable sync — two-way sync with an Airtable base
  • Push notifications — remind user when a lent book is overdue for return
  • Webhook support — trigger external automations on book events

👥 Social & Sharing

  • Public profile / shelf — opt-in shareable reading list URL
  • Book club mode — shared libraries for a group with per-member read status
  • Lend notifications — notify a friend via link when a book is lent
  • Book reviews — longer-form review text separate from the notes field

📱 Platform & UX

  • iPad / tablet layout — master-detail split view with sidebar navigation
  • macOS & Windows desktop — Flutter desktop targets with keyboard shortcuts
  • Apple Watch / Wear OS — quick "Mark as read" and lend/return companion actions
  • Home-screen widgets — iOS and Android widgets showing current read or recently added
  • Accessibility — full screen-reader support, dynamic text size, high-contrast mode
  • Internationalisation — multi-language UI (Spanish, French, German, Japanese)

📋 Change Log

All notable changes to LibraRex. Format inspired by Keep a Changelog.

v0.22 April 2026 Mobile Tester Readiness & T-Rex Branding
AddedTwo-tier T-Rex brand system: detailed reading mascot badge/lockup for splash, docs, and marketing, plus a simplified app icon for launcher-sized surfaces
AddedCommitted PNG brand assets for the Flutter app and public documentation
ChangedRegenerated Android, iOS, and Windows launcher icons from the approved T-Rex app icon artwork
ChangedUpdated public-facing docs, README, and app metadata from the old tagline to "Your Library App"
FixedMobile tester readiness review items: widget smoke test provider setup, iOS 16.0 deployment-target alignment, default Google Books API key removal, and reproducible Git baseline cleanup
v0.21 March 2026 Library Manager, Search Cache & Smarter Search UX
AddedLibrary Manager screen — replaces the Library Settings dialog with a full screen showing all your libraries at once. Each library tile displays its name, book count (loaded in the background), and how recently it was modified. Tap to switch, tap the pencil to rename inline, tap the bin to move to Drive trash. Active library is highlighted with a checkmark and primary-colour border
AddedNew Library button — floating action button in the Library Manager creates a fresh empty library with a single tap and a confirmation; existing libraries are never affected
AddedIn-session search cache — Quick Add search results are cached in memory for 10 minutes per query. Typing the same search a second time (or coming back to the tab) returns instantly without any network call, significantly reducing Google Books API quota usage
AddedOpenLibrary fallback indicator — when Google Books is unavailable and results come from OpenLibrary instead, a subtle "Google Books unavailable — results via OpenLibrary" notice appears beneath the search bar so users know what's happening without it being intrusive
ChangedSearch debounce increased from 900 ms → 1 200 ms — reduces API calls further during fast typing; cached results still return instantly so the extra wait is never felt on repeated searches
ChangedLibrary Settings menu item now opens the full Library Manager screen rather than a modal dialog, giving more room to display and manage multiple libraries
v0.20 March 2026 Barcode Scanner, iOS Platform, Borrowed Fix & Lookup Improvements
AddedCamera barcode scanner — new Scan tab in the Add Book screen; point the camera at any book's barcode to instantly look up and add it. Supports single-book mode (scan → lookup → add form in one step) and multi-book mode (scan a stack, review a list, then add them all at once). Custom viewfinder overlay with orange corner-bracket guides; real-time ISBN detection via mobile_scanner 6.x. Tested and confirmed working on physical iPhone 17 Pro. ⚠️ iOS Simulator not supported — MLKit ships device-only binaries; always test scanner on a real device
AddediOS platform support — full Xcode project committed to repo; bundle ID au.com.aze.librarex; app running on physical iPhone via Xcode personal team signing. Camera permission (NSCameraUsageDescription) added to Info.plist. Minimum iOS version: 16.0 (required by mobile_scanner 6.x)
AddedOpenLibrary fallback for ISBN lookuplookupByIsbn now tries OpenLibrary automatically when Google Books returns no result (e.g. regional editions, quota exhausted). Increases successful scan rate for less-common ISBNs
FixedBorrowed From field — was read-only in the book detail screen; now shows a teal tap-to-edit inline field matching the Lent Out pattern. Date Borrowed also gains a tap-to-change date picker
FixedBook search author misidentification — two-word capitalised titles (e.g. "Poison Study") were being incorrectly sent as inauthor: queries, returning wrong results. Plain keyword search is now the primary pass; inauthor: is a secondary enrichment only
FixedSecurity: GoogleService-Info.plist (iOS credentials) removed from git history tracking and permanently excluded via ios/.gitignore
ChangedSearch debounce increased from 450 ms / 3 chars → 900 ms / 5 chars to reduce Google Books API quota usage during fast typing
Changedmobile_scanner upgraded to ^6.0.0 (from 5.2.0) — resolves MLKit / GoogleUtilities version conflict with google_sign_in on iOS
v0.19 March 2026 OAuth Scope Reduction & Drive Search-Before-Create
ChangedOAuth scope reduced from spreadsheets (all Google Sheets) to drive.file (only files created by LibraRex) — consent screen now shows "See and edit files you create with LibraRex" only
ChangedSheetsService now searches Google Drive for an existing "LibraRex 🦖 — My Book Collection" sheet before creating a new one, and still recognises legacy tester sheets so reinstalls and cleared sessions reconnect to the existing library automatically
FixedApp created a duplicate spreadsheet on every restart when flutter_secure_storage was cleared (e.g. fresh browser profile or app reinstall)
v0.18 March 2026 Library Settings & Import Fix
AddedLibrary Settings dialog — accessible from the overflow (⋮) menu; shows current spreadsheet name & copyable link, a connect-by-ID field for switching to any LibraRex-format Google Sheet, and a reset action that creates a fresh sheet without touching the old one
AddedLibraRex never deletes or overwrites a previously connected spreadsheet — connect and reset only change which sheet the app reads
ChangedSpreadsheet created by the app renamed to "LibraRex 🦖 — My Book Collection" for easier identification in Google Drive
FixedCSV import silently dropped description, format, location, series, and seriesOrder columns — all five are now correctly imported
v0.17 March 2026 Responsive Series Grid & Searchable Genre Filter
ChangedSeries grid now uses SliverGridDelegateWithMaxCrossAxisExtent(200px) — automatically fills available width so wider screens show 4–7 tiles per row instead of a fixed 2
ChangedGenre filter pill opens a searchable bottom sheet showing the top 10 genres sorted by frequency (book count shown per entry); a live search field reveals the full genre list
ChangedA "N more — type to search" hint appears when the library has more than 10 distinct genres
FixedGenre allowlist (~100 recognised terms) replaces the old denylist — OpenLibrary scan results no longer include plot elements, character types, marketing labels, place names, or series names
v0.16 March 2026 Unified Scan Library Dialog
AddedScan Library dialog — single entry point with checkboxes for Artwork, Blurbs, Series Info, and Genre Tags; runs all selected scans in a single pass per book
AddedPer-type breakdown in scan results: "Books updated" summary with indented sub-rows for covers found, blurbs found, series matched, and genres tagged
AddedZero-value sub-rows shown in muted style rather than hidden, so the full scope of each scan run is always visible
RemovedSeparate "Scan artwork & blurbs", "Refresh missing covers", and "Scan series info" menu items replaced by the unified dialog
v0.15 March 2026 Genre Tags
AddedGenre Tags field — new genres column (column U) in the Google Sheets schema; stores a comma-separated list of genre labels per book
AddedlookupGenres() in BookLookupService — fires Google Books volumeInfo.categories and OpenLibrary subject queries in parallel via Future.wait() and merges deduplicated results
AddedGoogle Books categories split on / separators (e.g. "Fiction / Thrillers / General" → "Fiction", "Thrillers"); generic and very short segments dropped automatically
AddedOpenLibrary subjects capped at 6 results per book and filtered to remove non-genre entries (place names, language tags, accessibility markers)
AddedGenre filter pill in the library filter row — filters the book grid to a single selected genre; selecting "All Genres" clears the filter
ChangedGoogle Sheets schema expanded from 18 to 19 columns — genres at column U; existing sheets without this column are backwards-compatible
v0.14 March 2026 Quick Add Screen & Smart Search
AddedQuickAddScreen — two-tab entry point (Search + ISBN) accessible from a new "Add Book" extended FAB on the Library screen
AddedSearch tab with 450 ms debounced live search, showing cover thumbnails, series chip, and author for each result — tap any result to pre-fill the full Add/Edit form
AddedISBN tab with auto-lookup triggered at 10 or 13 digits — preview card with cover, title, and author appears before committing the add
AddedquickSearch() method in BookLookupService — detects name-like queries and uses inauthor: prefix for better author results; single smart query with fallback only when primary returns empty, preserving API quota
Addedprefill: BookLookupResult? parameter on AddEditBookScreen — pre-populates all fields from a lookup result without requiring a second manual lookup
ChangedLibrary screen "Add Book" menu item and FAB now route to QuickAddScreen instead of the bare Add/Edit form
v0.13 March 2026 Find Missing Books — Multi-Source Lookup
Added4-tier series lookup: Google Books → WikiData SPARQL (exact match + fuzzy fallback) → OpenLibrary series name → OpenLibrary author + keyword supplement (always runs, catches partial-coverage sources)
AddedCross-source de-duplication by series order — when two sources return the same slot number, keeps the entry with a cover image; ties broken by shorter title
AddedBundle/omnibus filter — regex pattern removes box sets, collected editions, and multi-book sets from series results
FixedSeries with no WikiData coverage (e.g. Fractalverse) now discovered via OL author + keyword query using combined author:"name" seriesTitle syntax
FixedOpenLibrary results without a series field are now accepted when returned by the combined keyword query (trust the query filtering, not just the metadata field)
FixedDuplicate entries at the same series order (e.g. "Catching Fire" and "The Hunger Games: Catching Fire") now correctly collapsed to one slot
v0.12 March 2026 Series Detail Screen
AddedSeries Detail Screen — shows owned books grouped by series in reading order, with series order chips and a "Find Missing Books" action button
AddedGhost row slots for missing books — dim placeholder cards showing the book's order, title, and a one-tap "Add to Wishlist" CTA
AddedSearch / filter bar within the Series Detail screen
AddedEditable series name — pencil icon on the detail screen header saves changes to all books in the series
FixedOwned books with no stored seriesOrder now correctly matched to series API slots via normalised title comparison (_normTitle strips leading "Series: " prefix)
FixedOwned books no longer appear as both an owned row and a ghost row when seriesOrder is absent
v0.11 March 2026 Book Detail Polish & Light Mode Improvements
ChangedBook Detail Screen — inline editable rating row; no longer requires opening the full edit form to update a rating
ChangedBook Detail Screen — series name shown as a tappable chip that navigates directly to the Series Detail screen
ChangedBook Detail Screen — location field editable inline with a tap-to-edit interaction
DesignLight mode AppBar now uses warm cognac tones instead of white, aligning with the brand palette
DesignCard shadows added in light mode for improved visual depth and separation
v0.10 March 2026 Book Format & Library Location
AddedBook Format field — chip picker supporting Hardcover, Paperback, Large Print, eBook, and Audiobook; options filter by book type (e.g. Digital books only show eBook / Audiobook)
AddedLibrary Location field — free-text input with smart pre-populated suggestions based on type: physical books suggest shelf names, digital books suggest Kindle, Kobo, Apple Books, Audible, Scribd, Hoopla, Libby
AddedLocation suggestion chips appear below the location text field and tap-to-fill the input
ChangedGoogle Sheets schema expanded from 16 to 18 columns — format at column Q, location at column R; existing sheets are backwards-compatible (new columns read as empty)
ChangedGrid card now shows location (with shelf/cloud icon) when set, before falling through to stars or read/unread
ChangedList view status row now shows a secondary line with format (layers icon) and/or location (shelf/cloud icon) when either field is populated
v0.9 March 2026 Brand Identity & Theme System
DesignWarm Amber / Cognac primary colour (#B5621E), Gold accent (#D4943A) — replacing the original indigo/green palette
DesignLight theme: parchment background (#FDF5EC) and white card surfaces. Dark theme: deep brown background (#191410) with warm dark surfaces
AddedLegacy CustomPainter brand mark. This has since been replaced by the T-Rex mascot artwork.
AddedRexLogoFull (AppBar wordmark) and RexSplashLogo (auth screen hero) widgets
AddedLight / Dark / System theme toggle in the overflow (⋮) menu — cycles System → Light → Dark → System
AddedThemeMode state in LibraryProvider with cycleTheme() method
ChangedLibraRexApp now uses context.select to read ThemeMode from LibraryProvider, causing MaterialApp to rebuild on theme change
v0.8 March 2026 UI Polish — Cards, List View & Search Bar
FixedSearch bar semi-transparent bleed-through when hidden — replaced OverflowBox with ClipRect + AnimatedContainer so content is properly clipped to 0 height
ChangedGrid card layout: title/author pushed to top, contextual status info pushed to bottom using MainAxisAlignment.spaceBetween
Added_GridStatusLine widget — shows lent-to name, missing indicator, wishlist/borrowed labels, star rating, or Read/Unread in priority order
AddedType icon badge (_TypeBadge) overlaid on list view thumbnails for Borrowed, Wishlist, and Digital types
v0.7 March 2026 Half-Star Ratings (0.5 Increments)
ChangedBook.rating type: int? → double? — supports 0.5 increments from 0.5 to 5.0
ChangedRating parsing, validation, and serialisation updated across Book model, sheets service, and import/export service
FixedDart null-safety compile error on double? field — resolved with local variable pattern (final r = rating) for Dart field promotion
Addedstar_half_rounded icon in _MiniStarRow for fractional star display
AddedPosition-based half-star tap detection using GestureDetector.onTapDown + localPosition.dx in both detail screen and add/edit form
v0.6 March 2026 Filter UI Overhaul & Status Filter Fix
ChangedReplaced scrollable chip strip with two PopupMenuButton filter pills (Type + Status)
FixedStatus filter was visually greyed out whenever Type was not set to Owned — removed all muted/disabled logic; Status is now always equally usable
FixedStatus book counts now use countFor(_activeType, ...) rather than hardcoded BookType.owned
AddedLive book count in the filter row that updates as filters change
AddedPer-option book counts shown inside the popup menus
v0.5 Feb 2026 Import / Export & Bulk Scan
AddedExport full library to CSV; import from CSV with row-level validation and error reporting
AddedImport/Export screen with file picker
AddedBulk Scan dialog — fetches cover artwork and blurbs for all books with progress tracking
Addedplatform_download utility with web, mobile, and stub variants
v0.4 Feb 2026 Book Lookup, Detail Screen & Cover Art
AddedBook detail screen with cover image and inline editable star rating
AddedBookLookupService — searches Google Books and OpenLibrary by ISBN or title
AddedCachedNetworkImage for covers with shimmer placeholder
AddedUser profile avatar in the AppBar with initial fallback
v0.3 Jan 2026 Library UI — Grid, List & Add/Edit
AddedLibrary screen with AppBar, filter row, and book grid/list
AddedBookCard (grid) and BookListItem (list) widgets
AddedAnimated search bar with toggle button
AddedAdd/Edit book screen with all 16 fields; create and update flows
AddedShimmer loading skeletons for both grid and list views
AddedEmpty-state illustrations with contextual messaging per filter
AddedPull-to-refresh and error view with retry button
v0.2 Jan 2026 Google Sheets Backend & Data Model
AddedSheetsService with full CRUD over the Google Sheets API v4
AddedAuto-create sheet with header row on first sign-in
AddedLibraryProvider (ChangeNotifier) — books list, loading/error states, user session
AddedBook model with 16-column schema, BookType and PhysicalStatus enums
AddedfilteredBooks() method — filter by type and/or status
AddedUUID-based book IDs and updatedAt timestamp on every save
v0.1 Dec 2025 Project Foundation & Authentication
AddedFlutter project scaffolded for web, iOS, and Android
AddedGoogle Sign-In (OAuth 2.0) with session persistence via flutter_secure_storage
AddedAuthScreen and AuthService
AddedNamed route navigation and Material 3 MaterialApp
Addedpubspec.yaml with full dependency list and analysis_options.yaml

🚀 Getting Started

Prerequisites

Run locally

flutter pub get
flutter run -d ios          # iPhone / iPad
flutter run -d android      # Android device or emulator
flutter run -d windows      # Windows desktop

Key Packages

PackageVersionPurpose
google_sign_in^6.2.1OAuth authentication
googleapis^13.2.0Sheets API client
provider^6.1.2State management
google_fonts^6.2.1Inter font family
cached_network_image^3.3.1Cover image caching
shimmer^3.0.0Loading skeleton effect
file_picker^8.0.3CSV import file dialog
csv^6.0.0CSV parse & serialise
flutter_secure_storage^9.2.2Token persistence

☁️ Deployment & Google Drive Setup

One of the most common questions is: "If I share this app with someone, what do they have to set up with Google Drive?" The short answer is nothing — end users just sign in with their Google account and the app does everything else automatically. The only one-time setup is done by the developer (you) when configuring the Google Cloud project.

👤 What end users do

From a user's perspective the setup is completely invisible:

  1. Download and install LibraRex from the App Store (iOS), Google Play (Android), or Windows Store (PC).
  2. Tap Sign in with Google and complete the standard OAuth consent screen.
  3. The app automatically creates a Google Sheet called LibraRex 🦖 — My Book Collection in their Google Drive.
  4. They can start adding books immediately — no spreadsheet configuration needed.
Users own their data. The sheet lives in their Google Drive account. They can open it, export it, or delete it at any time. LibraRex only requests the minimum required scopes: Sheets (read/write) and Drive (file metadata to locate the sheet).

🛠️ One-time developer / operator setup

Before the app can be shared, a developer needs to configure a Google Cloud project once. This is a ~15-minute process:

StepActionWhere
1Create a Google Cloud projectconsole.cloud.google.com
2Enable Google Sheets APIAPIs & Services → Enable APIs
3Enable Google Drive APIAPIs & Services → Enable APIs
4Create an OAuth 2.0 iOS Client ID (application type: iOS)APIs & Services → Credentials
5Create an OAuth 2.0 Android Client ID (application type: Android)APIs & Services → Credentials
6Create an OAuth 2.0 Desktop Client ID (application type: Desktop app) for WindowsAPIs & Services → Credentials
7Add credentials to platform config files (ios/Runner/Info.plist, android/app/google-services.json) and lib/services/auth_service.dart for WindowsFlutter project source
8(Optional) Create a Google Books API key and add it to the projectAPIs & Services → Credentials
Books API key tip. LibraRex uses the Google Books API for metadata lookups (Quick Add, book lookup, series search). Without a key it uses anonymous quota (~1,000 requests/day shared across all users of the app). For a multi-user deployment, create an API key, restrict it to your domain, and add it to lib/services/book_lookup_service.dart.

📱 iOS & Android

Build and submit through Xcode / Android Studio as usual. Platform-specific OAuth client IDs go in ios/Runner/Info.plist and android/app/google-services.json respectively. The Sheets and Drive API usage is identical across platforms; only the auth credential type differs.

flutter build ios --release
flutter build appbundle --release   # Google Play

🖥️ Windows Store

LibraRex packages for the Windows Store using the msix pub package. The Windows OAuth flow uses a Desktop OAuth 2.0 client (credentials stored in auth_service.dart) and opens the browser for consent, with a local redirect server to capture the token.

dart run msix:create   # produces build\windows\x64\runner\Release\librarex.msix

Submit the resulting .msix to Microsoft Partner Center. A one-time developer account registration ($19 USD) is required before first submission.

🔒 OAuth consent screen & app verification

While in development, add test users to the OAuth consent screen so they can sign in without Google's verification process. For a wider public release, Google requires an app verification review (typically free, takes a few days) to remove the "unverified app" warning from the consent screen. The review verifies that the app only requests the scopes it actually uses.

⚠️ Known Limitations

No offline support (current). All reads and writes go directly to the Google Sheets API. The app requires connectivity to load or save books. Local caching (Hive) is a high-priority roadmap item.
Sheets API rate limits. The API allows ~300 read requests/min per project. For large libraries or frequent refreshes, a local cache is recommended to reduce API calls.
Single-user per sheet. Each signed-in Google account has its own sheet. There is no sharing or multi-user collaboration on a single library yet (see Roadmap §Social).
Duplicate spreadsheets after Reset. When Library Settings → Reset is used, the app currently creates a new sheet without checking Drive for an existing one with the same name. During testing this can accumulate orphaned sheets named LibraRex 🦖 — My Book Collection in your Drive. Future improvement: search Drive by title before creating a new sheet.
🛠️ Developer Reference

Technical details for contributors and anyone building on or deploying LibraRex. End users don't need to read past here.

⚙️ Tech Stack

LayerTechnologyPurpose
UI FrameworkFlutter 3.x / Dart 3Cross-platform UI and state management
Backend / StorageGoogle Sheets API v4Persistent cloud data store, user-owned
AuthenticationGoogle Sign-In (OAuth 2.0)Secure identity, per-user sheets
State ManagementProvider (ChangeNotifier)App-wide reactive state
FontsGoogle Fonts — InterUI text throughout the app
Image Cachingcached_network_imageBook cover thumbnails with shimmer
Import / Exportcsv + file_pickerCSV round-trip for data portability
Book LookupGoogle Books + OpenLibrary APIsISBN / title search for metadata
Logo / ArtworkPNG app assetsTwo-tier T-Rex system: simplified app icon plus full mascot badge/lockup
Loading Statesshimmer packageSkeleton screens while loading
Token Storageflutter_secure_storagePersists auth across app restarts

🗄️ Data Schema

Each book is a single row in Google Sheets with 21 columns. The sheet is created automatically on first sign-in with a header row.

ColFieldTypeDescription
AidStringUUID — unique stable identifier
BtitleStringBook title (required)
CauthorStringAuthor name (required)
DtypeEnumowned | borrowed | wishlist | digital
EstatusEnumavailable | lent_out | missing
FreadBooleantrue | false — Read / Unread flag
GlentToStringName of person the book is lent to
HisbnStringISBN-10 or ISBN-13
IcoverUrlStringURL to cover thumbnail image
JratingDouble0.5–5.0 in 0.5 increments (half-star support)
KnotesStringFree-text annotations
LgenreStringGenre label (curated from OpenLibrary subjects)
MpublisherStringPublisher name
NyearIntegerPublication year
OdescriptionStringBook synopsis / blurb (populated by Scan Library)
PupdatedAtStringISO 8601 timestamp of last edit
QformatStringHardcover · Paperback · Large Print · eBook · Audiobook
RlocationStringShelf / room (physical) or service name (digital, e.g. Kindle)
SseriesStringSeries name (e.g. "The Stormlight Archive")
TseriesOrderDoublePosition within the series (e.g. 1, 2, 2.5)
UdateFinishedStringISO date when the book was finished reading