Releases: sudoeren/karpa
Releases · sudoeren/karpa
Release list
Karpa v1.3.1
See the assets below for your platform.
v1.2.10
v1.2.9
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
What's Changed
🐛 Bug Fixes
- History & Favorites: File translations now properly distinguished with
mode/fileNamefields - 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 —
validateProviderUrlnow returns the validated URL, breaking the taint chain. All 6codeql-disable-next-linecomments 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.resultto prevent binary file crash - JSON.parse: All
JSON.parse(localStorage)calls wrapped in try-catch viasafeJSONParsehelper - localStorage.setItem: All calls wrapped in try-catch via
safeSetItemhelper - 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.1references replaced with dynamic import frompackage.json - splitIntoChunks: Fixed
match.index === 0falsy condition
📦 Dependencies
- eslint:
^10→^9.24.0
v1.2.7
What's New
🐛 Fixes
- API key leak — Gemini URL no longer includes API key in query string; uses
x-goog-api-keyheader instead - AudioContext — Reuses a single instance instead of creating one per notification (prevents browser warnings)
- localStorage safety — Wrapped
setItemcalls 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.resultto prevent crash on binary files - Empty URL crash — Added validation for empty URL in test-connection flow
- splitIntoChunks false-y bug — Fixed
match.index === 0being treated as falsy, causing incorrect splits - Version display — Settings version badge now reads from
package.jsondynamically instead of hardcoded value - ESLint downgrade — Pinned to
^9.24.0for compatibility with eslint-config-next
v1.2.6
v1.2.5
What's New
🛠 Improvements
- Uninstall scripts —
uninstall.sh(macOS/Linux) anduninstall.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, preventingatobcrash
🐛 Fixed
- Fixed
atobcrash when decoding previously stored plain-text API keys
v1.2.4
What's New
✨ Features
- OpenRouter support — Unified API for 200+ models (
amazon/nova-2-lite-v1default) - 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
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
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(-)