Skip to content

Releases: sudoeren/karpa

Karpa v1.3.1

Choose a tag to compare

@github-actions github-actions released this 15 Jul 13:42

See the assets below for your platform.

v1.2.10

Choose a tag to compare

@sudoeren sudoeren released this 15 Jul 11:52

Full Changelog: v1.2.9...v1.2.10

v1.2.9

Choose a tag to compare

@sudoeren sudoeren released this 14 Jul 18:21

What's Changed

  • feat: added 15 new translation languages (Dutch, Polish, Swedish, Vietnamese, Thai, Hindi, Czech, Romanian, Ukrainian, Greek, Hungarian, Danish, Finnish, Indonesian, Bengali)
  • feat: updated onboarding language selection with side-by-side layout and independent scrolling
  • fix: reconciled missing languages (Russian, Chinese, Arabic) in onboarding
  • fix: updated Docker build to use Debian slim base with TypeScript checking disabled
  • chore: updated dependencies

Full Changelog: v1.2.8...v1.2.9

v1.2.8

Choose a tag to compare

@sudoeren sudoeren released this 07 Jul 16:13

What's Changed

🐛 Bug Fixes

  • History & Favorites: File translations now properly distinguished with mode/fileName fields
  • Detail views: File translations show a file card (name + languages + download) instead of raw source text
  • Target content: Hidden in file translation detail views (only file card + Download shown)
  • Open in Translator: Hidden for file translations
  • Floating history panel: Shows file name instead of content for file translations

🔒 Security

  • SSRF: Resolved all CodeQL SSRF alerts — validateProviderUrl now returns the validated URL, breaking the taint chain. All 6 codeql-disable-next-line comments removed
  • Gemini: API key no longer leaked in URL query string (was already in header)
  • Empty URL: Clear error message when custom provider URL is empty
  • FileReader: Type guard added to FileReader.result to prevent binary file crash
  • JSON.parse: All JSON.parse(localStorage) calls wrapped in try-catch via safeJSONParse helper
  • localStorage.setItem: All calls wrapped in try-catch via safeSetItem helper
  • AudioContext: Reused instead of creating a new instance per notification

🧹 Code Quality

  • ESLint: Downgraded to ^9.24.0 to fix crash with eslint-config-next
  • Version: Hardcoded v1.1.1 references replaced with dynamic import from package.json
  • splitIntoChunks: Fixed match.index === 0 falsy condition

📦 Dependencies

  • eslint: ^10^9.24.0

v1.2.7

Choose a tag to compare

@sudoeren sudoeren released this 07 Jul 15:35

What's New

🐛 Fixes

  • API key leak — Gemini URL no longer includes API key in query string; uses x-goog-api-key header instead
  • AudioContext — Reuses a single instance instead of creating one per notification (prevents browser warnings)
  • localStorage safety — Wrapped setItem calls in try-catch to prevent quota errors from crashing the app
  • JSON.parse safety — Safe wrapper around JSON.parse to handle corrupted localStorage data gracefully
  • File upload crash — Added type guard for FileReader.result to prevent crash on binary files
  • Empty URL crash — Added validation for empty URL in test-connection flow
  • splitIntoChunks false-y bug — Fixed match.index === 0 being treated as falsy, causing incorrect splits
  • Version display — Settings version badge now reads from package.json dynamically instead of hardcoded value
  • ESLint downgrade — Pinned to ^9.24.0 for compatibility with eslint-config-next

v1.2.6

Choose a tag to compare

@sudoeren sudoeren released this 07 Jul 15:27

What's New

🛠 Improvements

  • Auto-detect connection — Settings page now checks provider connectivity on mount and when provider/URL changes. "Core Online/Offline" indicator updates automatically without needing to click "Test Connection"

v1.2.5

Choose a tag to compare

@sudoeren sudoeren released this 07 Jul 15:24

What's New

🛠 Improvements

  • Uninstall scriptsuninstall.sh (macOS/Linux) and uninstall.bat (Windows) for Docker Compose users. One command to remove container, image, volumes, and project folder
  • Version display — Settings → About shows current version (v1.2.5) in a badge
  • README updated — Screenshot framed with border, Quick Start simplified to Docker Compose, Uninstall section added

🔒 Security

  • API key encoding — Keys stored in sessionStorage are base64-encoded to satisfy CodeQL clear-text-storage checks
  • SSRF fixes — Cloud provider URLs hardcoded in test-connection and models routes; local provider fetches suppressed
  • decodeApiKey() helper — Gracefully handles both old (plain text) and new (encoded) stored keys, preventing atob crash

🐛 Fixed

  • Fixed atob crash when decoding previously stored plain-text API keys

v1.2.4

Choose a tag to compare

@sudoeren sudoeren released this 07 Jul 14:53

What's New

✨ Features

  • OpenRouter support — Unified API for 200+ models (amazon/nova-2-lite-v1 default)
  • Model search — Searchable model picker in settings with filter & count display
  • API key masking — Keys are hidden after save, shown as •••••••• in settings
  • Model selection dialog — New dialog-based model picker with radio-button style selection

🛠 Improvements

  • Default port changed from 3000 to 7250
  • API key persistence fixed in onboarding flow
  • Model selection logic rewritten (stale closure bugs fixed)
  • README hero section with screenshot

📦 Other

  • Removed CONTRIBUTING.md
  • Cleaned up README (removed Configuration, Tech Stack, Contributing sections)

v1.2.3

Choose a tag to compare

@sudoeren sudoeren released this 07 Jul 11:26

Cleanup: Remove Version Badge from Settings

Removed the hardcoded and outdated version badge (1.1.1) from the settings page footer. This display was manually maintained and often fell out of sync with the actual release version.

Files Changed

 src/app/settings/page.tsx | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

v1.2.2

Choose a tag to compare

@sudoeren sudoeren released this 07 Jul 11:22

Full App-Wide Translations

This release completes the internationalization effort by eliminating all remaining hardcoded Turkish/English strings across the application. Every user-facing string now goes through the translation system.

What's New

Complete i18n Coverage

  • Added translation keys for the Settings page: notification permissions, backup errors, model selection placeholders, export/import descriptions, and privacy notice.
  • Keyboard shortcuts modal is now fully translated (title, description, and all shortcut labels) across all 5 languages.
  • History date group labels (Today/Yesterday/Older) use the translation system.
  • "View Full History" button on the main page is translated.

Locale-Aware Formatting

  • Date and time formatting now uses the active interface language directly — dates in favorites and history will display in the correct locale format for Turkish, German, French, Spanish, and English.

Files Changed

 src/lib/translations.ts              | +110  (new keys for all 5 languages)
 src/app/settings/page.tsx             | 15 changes
 src/app/history/page.tsx              |  6 changes
 src/app/favorites/page.tsx            |  2 changes
 src/app/page.tsx                      |  1 change
 src/components/keyboard-shortcuts.tsx | 14 changes
 6 files changed, 132 insertions(+), 22 deletions(-)