Skip to content

Releases: verycareful/kern

Kern 0.1.9.0

26 Jun 13:37

Choose a tag to compare

[0.1.9.0] — 2026-06-26 18:55 IST · UI

This release is the UI overhaul. Every screen in the app has been reskinned against a new design system built from scratch on top of Material 3. The token layer, typography, component library, icon set, and settings screen all land together here. Nothing about how Kern reads, edits, or saves files has changed — this release is entirely about how it looks and feels.


Design system

Kern now has its own token layer (KernColorScheme, KernTheme, KernType, KernRadius, Density) sitting above Material 3's ColorScheme. Legacy call sites that reference Material 3 tokens directly continue to work without changes; the new tokens project onto them at theme resolution time.

Colour. Light and dark neutral palettes, 12 user-selectable accent colours, and per-format identity hues (the colour associated with each file type) are all defined as first-class tokens. Accent and theme choices persist across sessions.

Radius. A single locked value: Soft 6dp, applied consistently everywhere. No mixed corner radii.

Typography. Four font families are bundled as res/font/*.ttf under SIL OFL licences:

Family Use
Outfit UI chrome — labels, buttons, metadata
Quicksand Wordmark
IBM Plex Mono Cell references, technical metadata
Sora EPUB reading body

Brand assets. Theme-aware chevron mark and wordmark lockup PNGs (res/drawable-nodpi/) that switch correctly between light and dark.


Component library (KernComponents.kt)

A shared set of composables used consistently across every screen:

KernIconButton · KernSegmented · FileBadge · OnDevicePill · SectionLabel · KernDivider · KernToggle · KernTopBar · KernBottomSheet · SheetActionRow · EditorToolbar · ToolbarButton · ToolbarSeparator

KernTopBar applies statusBarsPadding() and EditorToolbar applies navigationBarsPadding(), which fixes the top-bar/status-bar and bottom-toolbar/navigation-bar clashes that existed across all editors and the settings screen.


Icon set (KernIcons.kt)

Semantic mappings over Material Outlined icons, plus a custom GitHub vector. All icon references in the app go through this file rather than raw Material icon names.


Settings screen

A new Settings screen is wired from the file browser's settings cog (Destinations.SETTINGS). It is organised into grouped surface cards:

Appearance — Theme (light / dark / system) and Density selector.

Accent — 12-swatch colour picker. The selected accent propagates to header highlights, selection states, and per-format hue tints throughout the app.

Files & storage — Scan toggles for Documents and Downloads folders. These are now functional: FileScanner skips any folder whose toggle is off, so its files no longer appear in the browser or open in the app.

Privacy & permissions — Network access and analytics are shown as permanently off (no network permission in the manifest). Storage access status reflects the real runtime permission state and taps through to the system grant dialog when missing (previously this row was hardcoded to "GRANTED").

About — Version, licence (AGPL-3.0 text displayed in a full-screen scrollable dialog from res/raw/license.txt), Source code (opens the Kern GitHub repo), and PDF engine (opens the Qyra GitHub repo). Both links use external intents and require no network permission.

Settings are persisted via KernSettings.kt, an observable SharedPreferences-backed store for theme mode, accent, density, scan-documents, and scan-downloads.


Per-screen reskin

Every screen has been updated to the new design system. Notable specifics:

File browserBrandMark + OnDevicePill header, KernSegmented tabs (Recent / All / Pinned), KernToggle chips for format filtering, reskinned list rows and grid cards, KernBottomSheet for sort and per-file actions, empty and missing-permission states.

Grid editors (CSV and Excel) — Sunken cell-reference pill styled in IBM Plex Mono, accent-coloured header selection, per-format hue tints on column and row headers, EditorToolbar at the bottom, zoom badge.

Word editor — Paper-page surface with updated formatting toolbar.

EPUB editor — Reading body set in Sora, chapter navigation and TOC sheet reskinned.

PowerPoint editor — 16:9 canvas, thumbnail rail, slide toolbar.

PDF editor — Page and zoom pills, tools bottom sheet.

EditorChrome — Migrated to KernTopBar and tokens; toolbar and extra-actions slots added for per-editor extensibility.


Bug fixes

Browser rescanning. The file list was being rebuilt on every navigation return. It now scans once on first load, again when a scan toggle changes, and again after a permission grant. Returning from an open file shows the cached list.

Scan toggles had no effect. The Documents and Downloads scan toggles in Settings were stored but not read by FileScanner. They are now respected.

Storage permission status was hardcoded. The Privacy & permissions card always showed "GRANTED" regardless of the real state. It now reads the live permission and updates when the user grants or revokes access.

Status-bar and navigation-bar clashes. The settings screen, all editor top bars, and all file viewers now apply statusBarsPadding(). Editor bottom toolbars apply navigationBarsPadding(). The visual overlap with system bars is gone.


Test results

Environment Suites Tests Result
Android Studio (device) 5 15 All passing

No new automated tests in this release. All changes are UI and design. A tests-only release (0.1.9.1) is due next.


What comes next

Currently, not much. I will soon finish up Alpha by focusing on each file type and improving them one by one, especially for editing.

Kern 0.1.8.1

13 Jun 14:13

Choose a tag to compare

[0.1.8.1] — 2026-06-13 19:38 IST · First Major Release

This is the first release of Kern designated as a major milestone. Over the past eight days, the project has grown from an empty scaffold into a fully-featured, on-device document editor for Android: six format editors, a native file browser, a compiled PDF engine, resizable grids, and a complete automated test suite. Version 0.1.8.1 closes the work begun in 0.1.8.0 by adding test coverage for the new grid dimension system and confirming the codebase is clean for the milestone tag.


What's in this release

Resizable grid columns and rows · #12

The spreadsheet grid now supports drag-to-resize for both columns and rows. Explicit drag handles appear at the trailing edge of each selected header — replacing the previous invisible hit-target approach that was hard to discover and easy to misfire. Double-tapping a column or row header auto-resizes to fit the longest content in that column or row. Custom dimensions persist to .xlsx files via Apache POI, so a resized workbook reopens at the same proportions it was saved with.

Implementation notes for contributors:

  • Handles are rendered via Modifier.zIndex and non-consuming pointer input, which means they sit above the grid without blocking the two-finger pan gesture.
  • The subcompose layout uses binary search over a precomputed offset map to locate visible rows and columns under dynamic (non-uniform) cell sizes — a meaningful performance improvement over the previous linear scan.
  • Dimension serialisation stores column widths and row heights in the POI Sheet API's native units and round-trips them through save and reopen without drift.

Test coverage for grid dimensions

A new test, applyEdits_preservesColumnWidthsAndRowHeights, was added to ExcelDocumentTest.kt. It exercises the full POI serialisation path: a sheet with custom row heights and column widths is written out, read back in, and the recovered values are asserted to match the originals. This closes the gap left by 0.1.8.0, where the feature shipped ahead of its unit test.

The .skill-extracted artefact has also been removed from Git tracking and the result verified in the tree.


Test results

Environment Suites Tests Result
Android Studio (device) 5 15 ✓ All passed

The count increased from 14 to 15 with the addition of applyEdits_preservesColumnWidthsAndRowHeights.


Cumulative changelog since project start (0.1.0.0 → 0.1.8.1)

A summary of everything that has shipped across the eight-day development run, for readers coming to the project for the first time.

Format editors

Format Read Edit Save in place Export copy Notes
CSV Scrollable grid, add row/column, insert at selection
Excel .xlsx Multi-sheet, merged cells, resizable grid, formula display
Word .docx Paragraph text, heading styles, pinch-to-zoom
PowerPoint .pptx Text boxes per slide, pinch-to-zoom
PDF Viewer + merge/extract via native lopdf bridge
EPUB Chapter-by-chapter, TOC, DRM detection

File browser (added 0.1.7.0): lists Documents and Downloads; recent, all-files, and pinned-favorites views; search; per-format filter chips; list/grid toggle; sort by date, name, size, or type; per-file share, info, and delete; persisted pins and recents via SharedPreferences.

Grid editor highlights (Excel and CSV): 2D virtualised subcompose layout with true merged-cell spanning (0.1.7.7); LazyRow-based horizontal axis with bidirectional scroll sync (0.1.7.6); insert-at-selection for rows and columns (0.1.7.5); per-sheet scroll reset on tab switch (0.1.7.4); resizable columns and rows with drag handles and auto-fit (0.1.8.0–0.1.8.1).

Native PDF bridge: The kern-bridge Rust crate wraps lopdf and is cross-compiled to arm64-v8a, armeabi-v7a, and x86_64 via cargo-ndk in CI. The bridge is bundled into the APK and its availability is detected at runtime; tools degrade gracefully when the .so is absent (0.1.5.0, 0.1.7.3).

Quality and correctness

  • Unsaved-changes guard on back navigation across all editors (0.1.7.2).
  • Error feedback split between AlertDialog (long/instructional messages) and Snackbar (short confirmations), per Material 3 guidelines (0.1.7.8).
  • mutableStateOf<Int> replaced with mutableIntStateOf across all ViewModels to eliminate boxing allocations (0.1.7.9).
  • Modifier.clickable on Surface replaced with the native onClick parameter (0.1.7.10).
  • Dependencies: compose-bom updated to 2026.05.01, apache-poi to 5.5.1 (0.1.7.11).
    Automated tests (added 0.1.7.1, grown to 0.1.8.1):
Suite Coverage
CSV Parse/serialise round-trip, ragged rows, quoting, column labels
Excel Multi-sheet read; edit-only save preserves untouched cells and sheets; column/row dimension persistence
Word Paragraph text and coarse style read; edit-only save
PowerPoint Slide text read; edit-only save
EPUB Spine/TOC/block parsing; edit-only save with correct mimetype ordering; DRM rejection

All test fixtures are generated in-test via POI, OpenCSV, Jsoup, and zip — no binary files committed to the repository.


Upgrade notes

No migration steps are required. The .skill-extracted file has been removed from Git tracking; if you have it locally, git rm --cached .skill-extracted will clean it up.


What comes next

Comprehensive UI redesign is on the way!

Kern 0.1.8.0

13 Jun 14:03

Choose a tag to compare

Kern 0.1.7.7

07 Jun 16:22

Choose a tag to compare

Kern 0.1.7.6

07 Jun 16:21

Choose a tag to compare

Kern 0.1.7.5

07 Jun 16:22

Choose a tag to compare

Kern 0.1.7.4

07 Jun 16:22

Choose a tag to compare

Kern 0.1.7.3

07 Jun 05:37

Choose a tag to compare

Kern 0.1.7.2

07 Jun 05:35

Choose a tag to compare

Kern 0.1.7.1

07 Jun 05:18

Choose a tag to compare