FiOTP is an offline TOTP and HOTP authenticator for macOS. It stores accounts in a local vault encrypted with AES-256-GCM and generates verification codes on-device.
TypeScript
0
13 commits
updated Sep 24, 2026
FiOTP is an offline TOTP and HOTP authenticator for macOS, iOS, Linux, Windows, and Android. It stores accounts in a local vault encrypted with AES-256-GCM and generates verification codes on-device.
The application is built with GeaStack using TypeScript and TSX. GeaStack compiles the interface from src/index.tsx. Platform host bridges provide native file, cryptography, clipboard, and camera integration where supported. The project also includes a separate native Android application under android/, implemented in Kotlin and Jetpack Compose. It shares this repository and the FiOTP vault format; it does not use the GeaStack Android WebView target. The web target remains an interface preview.
xcode-select --install) for Apple buildsclang-cl and lld-link for Windows buildsFrom the project directory, install the dependencies:
npm install
The install lifecycle applies the version-controlled macOS password-field patch in patches/. The patch enables native secure text entry while preserving GeaStack input events. If an upstream dependency change makes the patch incompatible, installation stops with an error so the change can be reviewed.
npm run dev # Start the web interface preview
npm run check # Run the TypeScript check
npm test # Run OTP and native vault tests
npx gea inspect --json
npm run build:macos # Build the macOS application
npm run build:windows # Build the Windows application
npm run run:windows # Build and launch the Windows application
npm run build:android # Build the Android debug APK
npm run test:android # Run Kotlin unit tests
The macOS application is generated at dist/macos/fiotp-gea/FiOTP.app and can be launched with:
open dist/macos/fiotp-gea/FiOTP.app
The Android APK is generated at android/app/build/outputs/apk/debug/app-debug.apk and uses the package id com.fiskindal.fiotp. Android supports API 23 and newer. Its first build is debug-signed. The Android UI, OTP engine, vault cryptography, file selection, and QR camera flow are implemented in Kotlin; the Apple and web targets continue to use the existing TypeScript/GeaStack application.
The Windows target uses GeaStack's native Win32 desktop renderer. Build it on Windows with npm run build:windows; run it with npm run run:windows. The executable is generated at dist/windows/fiotp-gea/FiOTP.exe. The Windows host stores its default encrypted vault under %APPDATA%\FiOTP\kasa.json, uses native Windows file dialogs and the system clipboard, and reads and writes the same encrypted vault format as the Apple and Linux targets. Camera QR scanning is not available in the initial Windows target; add accounts with an otpauth:// URI or enter them manually.
The web target is intended for interface development and preview. It does not open or persist production vaults. Camera access and production vault workflows are available in the macOS and iOS applications.
npm run build:macos adds the camera usage description to the application bundle and applies an ad-hoc signature for local testing. Public distribution requires signing with a Developer ID certificate and notarization by Apple.
otpauth:// URI, or scan a QR code with the camera. Google Authenticator migration QR codes are also supported.On macOS the default vault is ~/Library/Application Support/FiOTP Gea/kasa.json; on Windows it is %APPDATA%\FiOTP\kasa.json. Linux uses $XDG_DATA_HOME/fiotp/kasa.json (or ~/.local/share/fiotp/kasa.json). Another location can be selected in the application. The vault key is derived with PBKDF2-HMAC-SHA256. Writes are atomic, and the previous valid version is retained as a .bak recovery file. The vault cannot be opened without its master password, so keep the password and backups in a secure location. FiOTP locks the vault after five minutes of inactivity.
| Path | Responsibility |
|---|---|
src/App.tsx, src/stores/ | Interface and application state |
src/crypto/, src/services/ | OTP generation and encrypted vault operations |
native/ | Apple, Linux, and Windows host integrations |
windows.json | Windows native window configuration |
android/app/src/main/java/ | Native Android Compose UI, OTP, vault encryption, SAF and camera integration |
patches/ | GeaStack macOS secure password field patch |
tests/, native/fiotp_host_test.mm | OTP and native vault tests |
The source code is distributed under the MIT License. The FiOTP name, logo, icon, and product identity are reserved under the trademark policy; forks must use distinct product branding. Please follow SECURITY.md when reporting vulnerabilities. Do not include real vault files, OTP secrets, or passwords in issues or pull requests.
13 commits
TypeScript
29.9%
Kotlin
23.0%
C++
18.7%
Objective-C++
12.5%
CSS
8.4%
JavaScript
6.4%
FiOTP is an offline TOTP and HOTP authenticator for macOS. It stores accounts in a local vault encrypted with AES-256-GCM and generates verification codes on-device.
TypeScript
0
13 commits
updated Sep 24, 2026
FiOTP is an offline TOTP and HOTP authenticator for macOS, iOS, Linux, Windows, and Android. It stores accounts in a local vault encrypted with AES-256-GCM and generates verification codes on-device.
The application is built with GeaStack using TypeScript and TSX. GeaStack compiles the interface from src/index.tsx. Platform host bridges provide native file, cryptography, clipboard, and camera integration where supported. The project also includes a separate native Android application under android/, implemented in Kotlin and Jetpack Compose. It shares this repository and the FiOTP vault format; it does not use the GeaStack Android WebView target. The web target remains an interface preview.
xcode-select --install) for Apple buildsclang-cl and lld-link for Windows buildsFrom the project directory, install the dependencies:
npm install
The install lifecycle applies the version-controlled macOS password-field patch in patches/. The patch enables native secure text entry while preserving GeaStack input events. If an upstream dependency change makes the patch incompatible, installation stops with an error so the change can be reviewed.
npm run dev # Start the web interface preview
npm run check # Run the TypeScript check
npm test # Run OTP and native vault tests
npx gea inspect --json
npm run build:macos # Build the macOS application
npm run build:windows # Build the Windows application
npm run run:windows # Build and launch the Windows application
npm run build:android # Build the Android debug APK
npm run test:android # Run Kotlin unit tests
The macOS application is generated at dist/macos/fiotp-gea/FiOTP.app and can be launched with:
open dist/macos/fiotp-gea/FiOTP.app
The Android APK is generated at android/app/build/outputs/apk/debug/app-debug.apk and uses the package id com.fiskindal.fiotp. Android supports API 23 and newer. Its first build is debug-signed. The Android UI, OTP engine, vault cryptography, file selection, and QR camera flow are implemented in Kotlin; the Apple and web targets continue to use the existing TypeScript/GeaStack application.
The Windows target uses GeaStack's native Win32 desktop renderer. Build it on Windows with npm run build:windows; run it with npm run run:windows. The executable is generated at dist/windows/fiotp-gea/FiOTP.exe. The Windows host stores its default encrypted vault under %APPDATA%\FiOTP\kasa.json, uses native Windows file dialogs and the system clipboard, and reads and writes the same encrypted vault format as the Apple and Linux targets. Camera QR scanning is not available in the initial Windows target; add accounts with an otpauth:// URI or enter them manually.
The web target is intended for interface development and preview. It does not open or persist production vaults. Camera access and production vault workflows are available in the macOS and iOS applications.
npm run build:macos adds the camera usage description to the application bundle and applies an ad-hoc signature for local testing. Public distribution requires signing with a Developer ID certificate and notarization by Apple.
otpauth:// URI, or scan a QR code with the camera. Google Authenticator migration QR codes are also supported.On macOS the default vault is ~/Library/Application Support/FiOTP Gea/kasa.json; on Windows it is %APPDATA%\FiOTP\kasa.json. Linux uses $XDG_DATA_HOME/fiotp/kasa.json (or ~/.local/share/fiotp/kasa.json). Another location can be selected in the application. The vault key is derived with PBKDF2-HMAC-SHA256. Writes are atomic, and the previous valid version is retained as a .bak recovery file. The vault cannot be opened without its master password, so keep the password and backups in a secure location. FiOTP locks the vault after five minutes of inactivity.
| Path | Responsibility |
|---|---|
src/App.tsx, src/stores/ | Interface and application state |
src/crypto/, src/services/ | OTP generation and encrypted vault operations |
native/ | Apple, Linux, and Windows host integrations |
windows.json | Windows native window configuration |
android/app/src/main/java/ | Native Android Compose UI, OTP, vault encryption, SAF and camera integration |
patches/ | GeaStack macOS secure password field patch |
tests/, native/fiotp_host_test.mm | OTP and native vault tests |
The source code is distributed under the MIT License. The FiOTP name, logo, icon, and product identity are reserved under the trademark policy; forks must use distinct product branding. Please follow SECURITY.md when reporting vulnerabilities. Do not include real vault files, OTP secrets, or passwords in issues or pull requests.
13 commits
TypeScript
29.9%
Kotlin
23.0%
C++
18.7%
Objective-C++
12.5%
CSS
8.4%
JavaScript
6.4%