Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .easignore
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ dist/
web-build/
.expo/
.expo-shared/
tmp/
coverage/

# File di documentazione
docs/
Expand Down
63 changes: 63 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@ All notable project changes are documented here.

## [Unreleased]

## [3.3.2] - 2026-10-23

### Release

- Prepared Keysoft 3.3.2 with native runtime 3.3.2 and Android production build target 131.
EAS remote versioning remains authoritative: the production profile auto-increments the
remote Android version from 130 to 131. Google Play submission remains a separate manual
step.
- Aligns `expo-notifications` with the Expo SDK 57 patch set (`57.0.24`) so Expo Doctor
passes, and uses the portable `bun x` invoker in release scripts instead of a `bunx`
shim. Jest keeps its cache and Expo CLI temp files inside the project `tmp/` directory.

### Security

- Made transparent KDF upgrades and master-password changes crash-safe. The vault is
Expand All @@ -21,6 +33,57 @@ All notable project changes are documented here.
always rebuilds from the committed cache and re-encryptions run before any concurrent
write on the same collection.

### Fixed

- Production builds no longer misdetect themselves as Expo Go. `Constants.expoGoConfig`
is truthy in standalone builds because expo-constants resolves it to the embedded update
manifest, so the app forced the pure-JS PBKDF2 fallback (about 6–7 seconds per PIN
unlock on a current phone), skipped the native Argon2id KDF, and kept local notifications
in history-only mode. Environment detection now relies on `executionEnvironment` and
`appOwnership`. New vaults use Argon2id again, and existing PBKDF2 vaults are
transparently upgraded on the next PIN login (the first unlock after the update still
derives the old PBKDF2 key).
- Backup export and import now show a blocking progress dialog while the password-derived
key is calculated, the file is written or read, and the decrypted payload is imported.
The screen no longer appears frozen for several seconds with no feedback.

### UI/UX

- Reworked the mobile design system ("Nocturne v2") around a single source of truth:
responsive window classes (compact/medium/expanded/large) in `constants/layout.ts`, a
4pt spacing grid, an expanded type scale with `DesignSystem.text()`, modern radii and
elevation tokens, semantic contrast-checked status colors, an `onPrimary` token and
refreshed light/dark surfaces. Documented in `docs/design-system.md`.
- `ScreenWrapper` now owns the horizontal gutter and centered content width for every
screen, so layouts stay consistent from compact phones to tablets and split view.
Home, vault, notes, settings, generator, health, legal and onboarding screens were
migrated off ad-hoc `Math.min(width - padding, N)` widths and literal sizes.
- Responsive behavior improved for all window classes: two- and three-column vault grids,
short-landscape spacing, split-view/foldable widths, tablet dialog/bottom-sheet widths
(420–680), adaptive PIN keypad sizing, and a 44/48pt touch-target baseline. Home/search/
notification/dialog/sheet controls, list rows and password cards now use the shared
tokens; the notification header action and sheet close controls reach 48pt.
- Typography and contrast fixes: readable minimum sizes for labels and metadata, WCAG AA
contrast for secondary/tertiary text and status colors in both themes, and
`onPrimary` text on primary-filled buttons (the previous white-on-light-blue pair
failed contrast in dark mode).
- Added design-system regression tests for token scales, contrast ratios, window-class
resolution and legacy helper compatibility.
- UI review follow-up from browser testing at compact, split-view and tablet widths:
dialog headers now stack the icon above a wrapped, centered title/description with a
48pt close pinned to the corner (all alerts, confirmations and export/import loaders);
Settings row separators use the `divider` token instead of React Native's default black
border (same audit applied to the other screens); the decorative vault-health progress
bar was removed because it showed a fixed percentage with no underlying analysis; vault
cards now fill their 2/3-column grid slot; text/form screens cap at the 720pt readable
width on tablets; the unlock screen groups identity and keypad with even spacing; and
the generator uses the shared switch wrapper so the on-state thumb matches the theme on
web too.
- Development-session fixes: the web target no longer attempts to load the native KDF
(no misleading Argon2 console error), the toast uses `style.pointerEvents` instead of the
deprecated prop, and Jest keeps its cache under `tmp/jest-cache` so tests still run
while Metro is open and in shells without user-temp write access.

## [3.3.1] - 2026-08-09

### Release
Expand Down
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ authors:
- family-names: Gasperini
given-names: Michael
url: 'https://github.com/TheStreamCode/keysoft'
version: '3.3.1'
date-released: "2026-08-09"
version: '3.3.2'
date-released: "2026-10-23"
license: 'Apache-2.0'
2 changes: 1 addition & 1 deletion THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Third-Party Notices

Keysoft includes open-source dependencies. The inventory below records the direct runtime dependencies resolved for Keysoft 3.3.1. Transitive packages and their license files remain available in the package distribution and lockfile.
Keysoft includes open-source dependencies. The inventory below records the direct runtime dependencies resolved for Keysoft 3.3.2. Transitive packages and their license files remain available in the package distribution and lockfile.

Unless noted otherwise, these direct dependencies are licensed under the MIT License:

Expand Down
4 changes: 2 additions & 2 deletions app.config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module.exports = {
name: 'Keysoft',
slug: 'keysoft',
version: '3.3.1',
version: '3.3.2',
scheme: 'keysoft',
orientation: 'default', // Supports both portrait and landscape
userInterfaceStyle: 'automatic',
Expand Down Expand Up @@ -55,7 +55,7 @@ module.exports = {
backgroundColor: '#FFFFFF',
},
package: 'it.mikesoft.keysoft',
versionCode: 130,
versionCode: 131,
permissions: [
'INTERNET',
'USE_BIOMETRIC',
Expand Down
4 changes: 2 additions & 2 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 13 additions & 2 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ Keysoft is an offline-first React Native application built with Expo. The archit

```text
src/
components/ Shared UI and reusable controls
components/ Shared UI, screens primitives, and app chrome
ui/ Design-system primitives (dialog, sheet, toast, list, keypad)
constants/ Design tokens, layout metrics, theme, domain constants
contexts/ Auth, language, theme, and alert state
hooks/ Complex screen behavior and orchestration
settings/ Settings workflows split out of the screen component
Expand All @@ -37,7 +39,16 @@ src/

Screens own presentation state and user interactions. They should not implement cryptography, persistence rules, or business validation directly. Complex screen workflows should move into hooks or services.

The presentation layer follows the Nocturne system: semantic light/dark theme tokens, compact outlined controls, bounded responsive content, a flat five-slot tab bar, and copy-first read views separated from edit forms. Shared dialog, bottom-sheet, toast, motion, and PIN-keypad primitives live under `src/components/ui`; motion honors the operating-system reduced-motion preference and is limited to opacity and transform effects.
The presentation layer follows the Nocturne design system, documented in
[design-system.md](design-system.md): semantic light/dark color tokens, a 4pt spacing
grid, a shared type scale, compact outlined controls, bounded responsive content,
a flat five-slot tab bar, and copy-first read views separated from edit forms.
`src/constants/layout.ts` defines the compact/medium/expanded/large window classes
and `useResponsiveLayout` resolves columns, gutters, content widths and landscape
states from them. `ScreenWrapper` owns the horizontal gutter and centered content
width. Shared dialog, bottom-sheet, toast, motion, and PIN-keypad primitives live
under `src/components/ui`; motion honors the operating-system reduced-motion
preference and is limited to opacity and transform effects.

`ProfileAvatar` owns photo rendering and the initial-based fallback across unlock, vault, and settings surfaces. `KeysoftMark` renders the canonical shield-and-eye asset in onboarding, matching the launcher, adaptive, splash, and web artwork configured in `app.config.js`.

Expand Down
Loading
Loading