Files
Termix/src/locales/translated/el_GR.json
T
Luke Gustafson 0ff03110c9 v1.11.2 (#613)
* feat: add robust OSC 52 clipboard support for tmux/SSH clipboard sync (#587)

Upgrade @xterm/addon-clipboard to v0.2.0 and add a custom
RobustClipboardProvider that handles browser Clipboard API focus
restrictions by deferring writes until the window regains focus.
Uses Electron native clipboard when available for reliable access
without browser API limitations.

Changes:
- Create src/lib/clipboard-provider.ts with write-only provider
- Update all terminal components (desktop, mobile, docker console)
- Add electronClipboard bridge in Electron preload
- Add clipboard permission handler in Electron main process

* chore: remove translations

* feat: add 5-panel and 6-panel split screen layouts (#584)

* Temporary merge for 1.11.1 syncing (#543)

* fix: remote translations

* feat: support OIDC configuration via environment variables (#531)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal directly (#156) (#503)

* fix: resolve merge conflict artifacts in dev-1.10.1

- Fix missing closing tags in AppView.tsx NetworkGraphView
- Fix incomplete catch blocks in server-stats.ts and db/index.ts
- Fix missing closing brace in en.json ports section
- Fix HostManagerApp.tsx import path
- Fix stats-widgets.ts type definition
- Fix schema.ts networkTopology table definition
- Add type annotations in user-data-import.ts

* feat: support URL routes to open terminal directly (#156)

- Add /terminal/{hostNameOrId} route for new format
- Keep /hosts/{id}/terminal for backward compatibility
- Smart detection: numeric IDs for ID lookup, otherwise name lookup
- Clean URL after opening to prevent duplicate on refresh
- Show toast error when host not found

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501)

Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal.
This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>.

- Ctrl+Alt+W → Ctrl+W (nano search, delete word)
- Ctrl+Alt+T → Ctrl+T (transpose chars)
- Ctrl+Alt+N → Ctrl+N (next line)
- Ctrl+Alt+Q → Ctrl+Q (XON flow control)

Fixes Termix-SSH/Support#407

* feat: remove locales

* New Crowdin updates (#504)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* feat: add option to disable update checker (#502)

* feat: add option to disable update checker

Add a new setting in User Profile > Settings to disable automatic
update checking on startup and dashboard.

- Adds 'Disable Update Check' toggle in profile settings
- Skips GitHub API calls when disabled (reduces network requests)
- Works for both web app and Electron client

Fixes Termix-SSH/Support#410

* feat: remove locales

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* New Crowdin updates (#505)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* feat: add crowdin i18n

* feat: remove locales

* New Crowdin updates (#506)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Bengali)

* New translations en.json (Thai)

* feat: update readme

* feat: update readme

* feat: update credential editor to use submitting system and add health monitor

* feat: added toggle for command pallete

* feat: added close button on tab dropdown

* feat: added sidebar management and improved some host manager UI/UX

* feat: re-added missing users.ts route from merge

* feat: add toggle for password reset feature in admin settings (#508)

* feat: add sudo support for file manager operations (#509)

* fix: add sudo support for listFiles and improve permission error handling (#512)

* feat: add sudo support for file manager operations

* fix: add sudo support for listFiles and improve permission error handling

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated

* feat: add copy password button and fixed new line carriage issues and backend crash for auth key

* feat: added quick connection system (ad-hoc)

* Enter Key for Quick Login (#513)

* feat: added -r and -l support for tunnels

* feat: begin dashboard overhaul by splitting into cards and adding customization

* feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc.

* feat: add auth.tsx suppot for fullscreen

* feat: greatly improve network graph ui/ux and migrated to use translations and theme system

* feat: update to use blacksmith

* feat: improve ui for customized tabs and hide add/edit host/credential when submiting

* feat: add warpgate support with a dialog (terminal only)

* feat: expand warpgate to docker/file manager

* fix: docker not working wtih warpgate and none auth failing for terminal

* fix: prevent owner permission loss when sharing host to own role (#514)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* fix: prevent owner permission loss when sharing host to own role

Fixes #391

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: SSH key passphrase not passed for Docker and Tunnel (#521)

* perf: optimize Host Manager for large host lists

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

* fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel

Database field is `key_password` but code used `keyPassword`.
Added fallback to check both field names.

Affected:
- docker.ts: Docker SSH connections with encrypted keys
- tunnel.ts: Tunnel connections with encrypted keys

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* perf: optimize Host Manager for large host lists (#520)

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: add missing mimeTypes definition for image preview (#518)

Fixes Termix-SSH/Support#408

* fix: prevent session reset when updating host properties (#517)

Move WebSocket cleanup logic to a separate unmount-only effect to
prevent SSH sessions from being closed when host properties are updated.

Closes Termix-SSH/Support#401

* fix: backend type error

* feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385)

* feat: improved conneciton log ui/logic

* feat: improved conneciton log ui/logic

* feat: expanded connection log to work across all components (readying for release)

* feat: update readme

* feat: update readme

* fix: build error

* fix: build error

* fix: changed ver

* chore: clean up

* chore: continue clean up

* fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies

* fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field

* fix: update readme and run cleaner

* fix: update readme

* fix: update readme

* fix: update readme

* feat: update chinese readme

* feat: support OIDC configuration via environment variables

Add support for configuring OIDC authentication through environment
variables, enabling containerized deployments without database access:

- OIDC_CLIENT_ID
- OIDC_CLIENT_SECRET
- OIDC_ISSUER_URL
- OIDC_AUTHORIZATION_URL
- OIDC_TOKEN_URL
- OIDC_USERINFO_URL (optional)
- OIDC_IDENTIFIER_PATH (optional, default: "sub")
- OIDC_NAME_PATH (optional, default: "name")
- OIDC_SCOPES (optional, default: "openid email profile")

Environment variables take priority over database configuration.

Closes Termix-SSH/Support#16

---------

Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>

* feat: add modern DH group KEX algorithms for better compatibility (#530)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal directly (#156) (#503)

* fix: resolve merge conflict artifacts in dev-1.10.1

- Fix missing closing tags in AppView.tsx NetworkGraphView
- Fix incomplete catch blocks in server-stats.ts and db/index.ts
- Fix missing closing brace in en.json ports section
- Fix HostManagerApp.tsx import path
- Fix stats-widgets.ts type definition
- Fix schema.ts networkTopology table definition
- Add type annotations in user-data-import.ts

* feat: support URL routes to open terminal directly (#156)

- Add /terminal/{hostNameOrId} route for new format
- Keep /hosts/{id}/terminal for backward compatibility
- Smart detection: numeric IDs for ID lookup, otherwise name lookup
- Clean URL after opening to prevent duplicate on refresh
- Show toast error when host not found

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501)

Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal.
This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>.

- Ctrl+Alt+W → Ctrl+W (nano search, delete word)
- Ctrl+Alt+T → Ctrl+T (transpose chars)
- Ctrl+Alt+N → Ctrl+N (next line)
- Ctrl+Alt+Q → Ctrl+Q (XON flow control)

Fixes Termix-SSH/Support#407

* feat: remove locales

* New Crowdin updates (#504)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* feat: add option to disable update checker (#502)

* feat: add option to disable update checker

Add a new setting in User Profile > Settings to disable automatic
update checking on startup and dashboard.

- Adds 'Disable Update Check' toggle in profile settings
- Skips GitHub API calls when disabled (reduces network requests)
- Works for both web app and Electron client

Fixes Termix-SSH/Support#410

* feat: remove locales

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* New Crowdin updates (#505)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* feat: add crowdin i18n

* feat: remove locales

* New Crowdin updates (#506)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Bengali)

* New translations en.json (Thai)

* feat: update readme

* feat: update readme

* feat: update credential editor to use submitting system and add health monitor

* feat: added toggle for command pallete

* feat: added close button on tab dropdown

* feat: added sidebar management and improved some host manager UI/UX

* feat: re-added missing users.ts route from merge

* feat: add toggle for password reset feature in admin settings (#508)

* feat: add sudo support for file manager operations (#509)

* fix: add sudo support for listFiles and improve permission error handling (#512)

* feat: add sudo support for file manager operations

* fix: add sudo support for listFiles and improve permission error handling

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated

* feat: add copy password button and fixed new line carriage issues and backend crash for auth key

* feat: added quick connection system (ad-hoc)

* Enter Key for Quick Login (#513)

* feat: added -r and -l support for tunnels

* feat: begin dashboard overhaul by splitting into cards and adding customization

* feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc.

* feat: add auth.tsx suppot for fullscreen

* feat: greatly improve network graph ui/ux and migrated to use translations and theme system

* feat: update to use blacksmith

* feat: improve ui for customized tabs and hide add/edit host/credential when submiting

* feat: add warpgate support with a dialog (terminal only)

* feat: expand warpgate to docker/file manager

* fix: docker not working wtih warpgate and none auth failing for terminal

* fix: prevent owner permission loss when sharing host to own role (#514)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* fix: prevent owner permission loss when sharing host to own role

Fixes #391

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: SSH key passphrase not passed for Docker and Tunnel (#521)

* perf: optimize Host Manager for large host lists

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

* fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel

Database field is `key_password` but code used `keyPassword`.
Added fallback to check both field names.

Affected:
- docker.ts: Docker SSH connections with encrypted keys
- tunnel.ts: Tunnel connections with encrypted keys

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* perf: optimize Host Manager for large host lists (#520)

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: add missing mimeTypes definition for image preview (#518)

Fixes Termix-SSH/Support#408

* fix: prevent session reset when updating host properties (#517)

Move WebSocket cleanup logic to a separate unmount-only effect to
prevent SSH sessions from being closed when host properties are updated.

Closes Termix-SSH/Support#401

* fix: backend type error

* feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385)

* feat: improved conneciton log ui/logic

* feat: improved conneciton log ui/logic

* feat: expanded connection log to work across all components (readying for release)

* feat: update readme

* feat: update readme

* fix: build error

* fix: build error

* fix: changed ver

* chore: clean up

* chore: continue clean up

* fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies

* fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field

* fix: update readme and run cleaner

* fix: update readme

* fix: update readme

* fix: update readme

* feat: update chinese readme

* feat: add modern DH group KEX algorithms for better compatibility

Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms
which are supported by ssh2 library but were not configured in Termix.

These algorithms provide:
- Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.)
- Stronger security with larger DH groups
- RFC 8268 compliance

Related to Termix-SSH/Support#205

---------

Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>

* feat: clarify that hostname/FQDN is supported in IP address field (#529)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open…

* feat: show terminal title in tab name (#579)

* Temporary merge for 1.11.1 syncing (#543)

* fix: remote translations

* feat: support OIDC configuration via environment variables (#531)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal directly (#156) (#503)

* fix: resolve merge conflict artifacts in dev-1.10.1

- Fix missing closing tags in AppView.tsx NetworkGraphView
- Fix incomplete catch blocks in server-stats.ts and db/index.ts
- Fix missing closing brace in en.json ports section
- Fix HostManagerApp.tsx import path
- Fix stats-widgets.ts type definition
- Fix schema.ts networkTopology table definition
- Add type annotations in user-data-import.ts

* feat: support URL routes to open terminal directly (#156)

- Add /terminal/{hostNameOrId} route for new format
- Keep /hosts/{id}/terminal for backward compatibility
- Smart detection: numeric IDs for ID lookup, otherwise name lookup
- Clean URL after opening to prevent duplicate on refresh
- Show toast error when host not found

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501)

Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal.
This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>.

- Ctrl+Alt+W → Ctrl+W (nano search, delete word)
- Ctrl+Alt+T → Ctrl+T (transpose chars)
- Ctrl+Alt+N → Ctrl+N (next line)
- Ctrl+Alt+Q → Ctrl+Q (XON flow control)

Fixes Termix-SSH/Support#407

* feat: remove locales

* New Crowdin updates (#504)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* feat: add option to disable update checker (#502)

* feat: add option to disable update checker

Add a new setting in User Profile > Settings to disable automatic
update checking on startup and dashboard.

- Adds 'Disable Update Check' toggle in profile settings
- Skips GitHub API calls when disabled (reduces network requests)
- Works for both web app and Electron client

Fixes Termix-SSH/Support#410

* feat: remove locales

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* New Crowdin updates (#505)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* feat: add crowdin i18n

* feat: remove locales

* New Crowdin updates (#506)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Bengali)

* New translations en.json (Thai)

* feat: update readme

* feat: update readme

* feat: update credential editor to use submitting system and add health monitor

* feat: added toggle for command pallete

* feat: added close button on tab dropdown

* feat: added sidebar management and improved some host manager UI/UX

* feat: re-added missing users.ts route from merge

* feat: add toggle for password reset feature in admin settings (#508)

* feat: add sudo support for file manager operations (#509)

* fix: add sudo support for listFiles and improve permission error handling (#512)

* feat: add sudo support for file manager operations

* fix: add sudo support for listFiles and improve permission error handling

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated

* feat: add copy password button and fixed new line carriage issues and backend crash for auth key

* feat: added quick connection system (ad-hoc)

* Enter Key for Quick Login (#513)

* feat: added -r and -l support for tunnels

* feat: begin dashboard overhaul by splitting into cards and adding customization

* feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc.

* feat: add auth.tsx suppot for fullscreen

* feat: greatly improve network graph ui/ux and migrated to use translations and theme system

* feat: update to use blacksmith

* feat: improve ui for customized tabs and hide add/edit host/credential when submiting

* feat: add warpgate support with a dialog (terminal only)

* feat: expand warpgate to docker/file manager

* fix: docker not working wtih warpgate and none auth failing for terminal

* fix: prevent owner permission loss when sharing host to own role (#514)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* fix: prevent owner permission loss when sharing host to own role

Fixes #391

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: SSH key passphrase not passed for Docker and Tunnel (#521)

* perf: optimize Host Manager for large host lists

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

* fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel

Database field is `key_password` but code used `keyPassword`.
Added fallback to check both field names.

Affected:
- docker.ts: Docker SSH connections with encrypted keys
- tunnel.ts: Tunnel connections with encrypted keys

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* perf: optimize Host Manager for large host lists (#520)

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: add missing mimeTypes definition for image preview (#518)

Fixes Termix-SSH/Support#408

* fix: prevent session reset when updating host properties (#517)

Move WebSocket cleanup logic to a separate unmount-only effect to
prevent SSH sessions from being closed when host properties are updated.

Closes Termix-SSH/Support#401

* fix: backend type error

* feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385)

* feat: improved conneciton log ui/logic

* feat: improved conneciton log ui/logic

* feat: expanded connection log to work across all components (readying for release)

* feat: update readme

* feat: update readme

* fix: build error

* fix: build error

* fix: changed ver

* chore: clean up

* chore: continue clean up

* fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies

* fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field

* fix: update readme and run cleaner

* fix: update readme

* fix: update readme

* fix: update readme

* feat: update chinese readme

* feat: support OIDC configuration via environment variables

Add support for configuring OIDC authentication through environment
variables, enabling containerized deployments without database access:

- OIDC_CLIENT_ID
- OIDC_CLIENT_SECRET
- OIDC_ISSUER_URL
- OIDC_AUTHORIZATION_URL
- OIDC_TOKEN_URL
- OIDC_USERINFO_URL (optional)
- OIDC_IDENTIFIER_PATH (optional, default: "sub")
- OIDC_NAME_PATH (optional, default: "name")
- OIDC_SCOPES (optional, default: "openid email profile")

Environment variables take priority over database configuration.

Closes Termix-SSH/Support#16

---------

Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>

* feat: add modern DH group KEX algorithms for better compatibility (#530)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal directly (#156) (#503)

* fix: resolve merge conflict artifacts in dev-1.10.1

- Fix missing closing tags in AppView.tsx NetworkGraphView
- Fix incomplete catch blocks in server-stats.ts and db/index.ts
- Fix missing closing brace in en.json ports section
- Fix HostManagerApp.tsx import path
- Fix stats-widgets.ts type definition
- Fix schema.ts networkTopology table definition
- Add type annotations in user-data-import.ts

* feat: support URL routes to open terminal directly (#156)

- Add /terminal/{hostNameOrId} route for new format
- Keep /hosts/{id}/terminal for backward compatibility
- Smart detection: numeric IDs for ID lookup, otherwise name lookup
- Clean URL after opening to prevent duplicate on refresh
- Show toast error when host not found

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501)

Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal.
This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>.

- Ctrl+Alt+W → Ctrl+W (nano search, delete word)
- Ctrl+Alt+T → Ctrl+T (transpose chars)
- Ctrl+Alt+N → Ctrl+N (next line)
- Ctrl+Alt+Q → Ctrl+Q (XON flow control)

Fixes Termix-SSH/Support#407

* feat: remove locales

* New Crowdin updates (#504)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* feat: add option to disable update checker (#502)

* feat: add option to disable update checker

Add a new setting in User Profile > Settings to disable automatic
update checking on startup and dashboard.

- Adds 'Disable Update Check' toggle in profile settings
- Skips GitHub API calls when disabled (reduces network requests)
- Works for both web app and Electron client

Fixes Termix-SSH/Support#410

* feat: remove locales

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* New Crowdin updates (#505)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* feat: add crowdin i18n

* feat: remove locales

* New Crowdin updates (#506)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Bengali)

* New translations en.json (Thai)

* feat: update readme

* feat: update readme

* feat: update credential editor to use submitting system and add health monitor

* feat: added toggle for command pallete

* feat: added close button on tab dropdown

* feat: added sidebar management and improved some host manager UI/UX

* feat: re-added missing users.ts route from merge

* feat: add toggle for password reset feature in admin settings (#508)

* feat: add sudo support for file manager operations (#509)

* fix: add sudo support for listFiles and improve permission error handling (#512)

* feat: add sudo support for file manager operations

* fix: add sudo support for listFiles and improve permission error handling

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated

* feat: add copy password button and fixed new line carriage issues and backend crash for auth key

* feat: added quick connection system (ad-hoc)

* Enter Key for Quick Login (#513)

* feat: added -r and -l support for tunnels

* feat: begin dashboard overhaul by splitting into cards and adding customization

* feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc.

* feat: add auth.tsx suppot for fullscreen

* feat: greatly improve network graph ui/ux and migrated to use translations and theme system

* feat: update to use blacksmith

* feat: improve ui for customized tabs and hide add/edit host/credential when submiting

* feat: add warpgate support with a dialog (terminal only)

* feat: expand warpgate to docker/file manager

* fix: docker not working wtih warpgate and none auth failing for terminal

* fix: prevent owner permission loss when sharing host to own role (#514)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* fix: prevent owner permission loss when sharing host to own role

Fixes #391

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: SSH key passphrase not passed for Docker and Tunnel (#521)

* perf: optimize Host Manager for large host lists

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

* fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel

Database field is `key_password` but code used `keyPassword`.
Added fallback to check both field names.

Affected:
- docker.ts: Docker SSH connections with encrypted keys
- tunnel.ts: Tunnel connections with encrypted keys

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* perf: optimize Host Manager for large host lists (#520)

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: add missing mimeTypes definition for image preview (#518)

Fixes Termix-SSH/Support#408

* fix: prevent session reset when updating host properties (#517)

Move WebSocket cleanup logic to a separate unmount-only effect to
prevent SSH sessions from being closed when host properties are updated.

Closes Termix-SSH/Support#401

* fix: backend type error

* feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385)

* feat: improved conneciton log ui/logic

* feat: improved conneciton log ui/logic

* feat: expanded connection log to work across all components (readying for release)

* feat: update readme

* feat: update readme

* fix: build error

* fix: build error

* fix: changed ver

* chore: clean up

* chore: continue clean up

* fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies

* fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field

* fix: update readme and run cleaner

* fix: update readme

* fix: update readme

* fix: update readme

* feat: update chinese readme

* feat: add modern DH group KEX algorithms for better compatibility

Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms
which are supported by ssh2 library but were not configured in Termix.

These algorithms provide:
- Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.)
- Stronger security with larger DH groups
- RFC 8268 compliance

Related to Termix-SSH/Support#205

---------

Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>

* feat: clarify that hostname/FQDN is supported in IP address field (#529)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal dir…

* fix: allow OIDC JIT user creation when registration is disabled (#578)

* Temporary merge for 1.11.1 syncing (#543)

* fix: remote translations

* feat: support OIDC configuration via environment variables (#531)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal directly (#156) (#503)

* fix: resolve merge conflict artifacts in dev-1.10.1

- Fix missing closing tags in AppView.tsx NetworkGraphView
- Fix incomplete catch blocks in server-stats.ts and db/index.ts
- Fix missing closing brace in en.json ports section
- Fix HostManagerApp.tsx import path
- Fix stats-widgets.ts type definition
- Fix schema.ts networkTopology table definition
- Add type annotations in user-data-import.ts

* feat: support URL routes to open terminal directly (#156)

- Add /terminal/{hostNameOrId} route for new format
- Keep /hosts/{id}/terminal for backward compatibility
- Smart detection: numeric IDs for ID lookup, otherwise name lookup
- Clean URL after opening to prevent duplicate on refresh
- Show toast error when host not found

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501)

Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal.
This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>.

- Ctrl+Alt+W → Ctrl+W (nano search, delete word)
- Ctrl+Alt+T → Ctrl+T (transpose chars)
- Ctrl+Alt+N → Ctrl+N (next line)
- Ctrl+Alt+Q → Ctrl+Q (XON flow control)

Fixes Termix-SSH/Support#407

* feat: remove locales

* New Crowdin updates (#504)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* feat: add option to disable update checker (#502)

* feat: add option to disable update checker

Add a new setting in User Profile > Settings to disable automatic
update checking on startup and dashboard.

- Adds 'Disable Update Check' toggle in profile settings
- Skips GitHub API calls when disabled (reduces network requests)
- Works for both web app and Electron client

Fixes Termix-SSH/Support#410

* feat: remove locales

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* New Crowdin updates (#505)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* feat: add crowdin i18n

* feat: remove locales

* New Crowdin updates (#506)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Bengali)

* New translations en.json (Thai)

* feat: update readme

* feat: update readme

* feat: update credential editor to use submitting system and add health monitor

* feat: added toggle for command pallete

* feat: added close button on tab dropdown

* feat: added sidebar management and improved some host manager UI/UX

* feat: re-added missing users.ts route from merge

* feat: add toggle for password reset feature in admin settings (#508)

* feat: add sudo support for file manager operations (#509)

* fix: add sudo support for listFiles and improve permission error handling (#512)

* feat: add sudo support for file manager operations

* fix: add sudo support for listFiles and improve permission error handling

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated

* feat: add copy password button and fixed new line carriage issues and backend crash for auth key

* feat: added quick connection system (ad-hoc)

* Enter Key for Quick Login (#513)

* feat: added -r and -l support for tunnels

* feat: begin dashboard overhaul by splitting into cards and adding customization

* feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc.

* feat: add auth.tsx suppot for fullscreen

* feat: greatly improve network graph ui/ux and migrated to use translations and theme system

* feat: update to use blacksmith

* feat: improve ui for customized tabs and hide add/edit host/credential when submiting

* feat: add warpgate support with a dialog (terminal only)

* feat: expand warpgate to docker/file manager

* fix: docker not working wtih warpgate and none auth failing for terminal

* fix: prevent owner permission loss when sharing host to own role (#514)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* fix: prevent owner permission loss when sharing host to own role

Fixes #391

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: SSH key passphrase not passed for Docker and Tunnel (#521)

* perf: optimize Host Manager for large host lists

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

* fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel

Database field is `key_password` but code used `keyPassword`.
Added fallback to check both field names.

Affected:
- docker.ts: Docker SSH connections with encrypted keys
- tunnel.ts: Tunnel connections with encrypted keys

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* perf: optimize Host Manager for large host lists (#520)

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: add missing mimeTypes definition for image preview (#518)

Fixes Termix-SSH/Support#408

* fix: prevent session reset when updating host properties (#517)

Move WebSocket cleanup logic to a separate unmount-only effect to
prevent SSH sessions from being closed when host properties are updated.

Closes Termix-SSH/Support#401

* fix: backend type error

* feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385)

* feat: improved conneciton log ui/logic

* feat: improved conneciton log ui/logic

* feat: expanded connection log to work across all components (readying for release)

* feat: update readme

* feat: update readme

* fix: build error

* fix: build error

* fix: changed ver

* chore: clean up

* chore: continue clean up

* fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies

* fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field

* fix: update readme and run cleaner

* fix: update readme

* fix: update readme

* fix: update readme

* feat: update chinese readme

* feat: support OIDC configuration via environment variables

Add support for configuring OIDC authentication through environment
variables, enabling containerized deployments without database access:

- OIDC_CLIENT_ID
- OIDC_CLIENT_SECRET
- OIDC_ISSUER_URL
- OIDC_AUTHORIZATION_URL
- OIDC_TOKEN_URL
- OIDC_USERINFO_URL (optional)
- OIDC_IDENTIFIER_PATH (optional, default: "sub")
- OIDC_NAME_PATH (optional, default: "name")
- OIDC_SCOPES (optional, default: "openid email profile")

Environment variables take priority over database configuration.

Closes Termix-SSH/Support#16

---------

Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>

* feat: add modern DH group KEX algorithms for better compatibility (#530)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal directly (#156) (#503)

* fix: resolve merge conflict artifacts in dev-1.10.1

- Fix missing closing tags in AppView.tsx NetworkGraphView
- Fix incomplete catch blocks in server-stats.ts and db/index.ts
- Fix missing closing brace in en.json ports section
- Fix HostManagerApp.tsx import path
- Fix stats-widgets.ts type definition
- Fix schema.ts networkTopology table definition
- Add type annotations in user-data-import.ts

* feat: support URL routes to open terminal directly (#156)

- Add /terminal/{hostNameOrId} route for new format
- Keep /hosts/{id}/terminal for backward compatibility
- Smart detection: numeric IDs for ID lookup, otherwise name lookup
- Clean URL after opening to prevent duplicate on refresh
- Show toast error when host not found

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501)

Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal.
This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>.

- Ctrl+Alt+W → Ctrl+W (nano search, delete word)
- Ctrl+Alt+T → Ctrl+T (transpose chars)
- Ctrl+Alt+N → Ctrl+N (next line)
- Ctrl+Alt+Q → Ctrl+Q (XON flow control)

Fixes Termix-SSH/Support#407

* feat: remove locales

* New Crowdin updates (#504)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* feat: add option to disable update checker (#502)

* feat: add option to disable update checker

Add a new setting in User Profile > Settings to disable automatic
update checking on startup and dashboard.

- Adds 'Disable Update Check' toggle in profile settings
- Skips GitHub API calls when disabled (reduces network requests)
- Works for both web app and Electron client

Fixes Termix-SSH/Support#410

* feat: remove locales

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* New Crowdin updates (#505)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* feat: add crowdin i18n

* feat: remove locales

* New Crowdin updates (#506)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Bengali)

* New translations en.json (Thai)

* feat: update readme

* feat: update readme

* feat: update credential editor to use submitting system and add health monitor

* feat: added toggle for command pallete

* feat: added close button on tab dropdown

* feat: added sidebar management and improved some host manager UI/UX

* feat: re-added missing users.ts route from merge

* feat: add toggle for password reset feature in admin settings (#508)

* feat: add sudo support for file manager operations (#509)

* fix: add sudo support for listFiles and improve permission error handling (#512)

* feat: add sudo support for file manager operations

* fix: add sudo support for listFiles and improve permission error handling

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated

* feat: add copy password button and fixed new line carriage issues and backend crash for auth key

* feat: added quick connection system (ad-hoc)

* Enter Key for Quick Login (#513)

* feat: added -r and -l support for tunnels

* feat: begin dashboard overhaul by splitting into cards and adding customization

* feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc.

* feat: add auth.tsx suppot for fullscreen

* feat: greatly improve network graph ui/ux and migrated to use translations and theme system

* feat: update to use blacksmith

* feat: improve ui for customized tabs and hide add/edit host/credential when submiting

* feat: add warpgate support with a dialog (terminal only)

* feat: expand warpgate to docker/file manager

* fix: docker not working wtih warpgate and none auth failing for terminal

* fix: prevent owner permission loss when sharing host to own role (#514)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* fix: prevent owner permission loss when sharing host to own role

Fixes #391

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: SSH key passphrase not passed for Docker and Tunnel (#521)

* perf: optimize Host Manager for large host lists

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

* fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel

Database field is `key_password` but code used `keyPassword`.
Added fallback to check both field names.

Affected:
- docker.ts: Docker SSH connections with encrypted keys
- tunnel.ts: Tunnel connections with encrypted keys

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* perf: optimize Host Manager for large host lists (#520)

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: add missing mimeTypes definition for image preview (#518)

Fixes Termix-SSH/Support#408

* fix: prevent session reset when updating host properties (#517)

Move WebSocket cleanup logic to a separate unmount-only effect to
prevent SSH sessions from being closed when host properties are updated.

Closes Termix-SSH/Support#401

* fix: backend type error

* feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385)

* feat: improved conneciton log ui/logic

* feat: improved conneciton log ui/logic

* feat: expanded connection log to work across all components (readying for release)

* feat: update readme

* feat: update readme

* fix: build error

* fix: build error

* fix: changed ver

* chore: clean up

* chore: continue clean up

* fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies

* fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field

* fix: update readme and run cleaner

* fix: update readme

* fix: update readme

* fix: update readme

* feat: update chinese readme

* feat: add modern DH group KEX algorithms for better compatibility

Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms
which are supported by ssh2 library but were not configured in Termix.

These algorithms provide:
- Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.)
- Stronger security with larger DH groups
- RFC 8268 compliance

Related to Termix-SSH/Support#205

---------

Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>

* feat: clarify that hostname/FQDN is supported in IP address field (#529)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL r…

* feat: add file manager sorting by name, date, and size (#582)

* Temporary merge for 1.11.1 syncing (#543)

* fix: remote translations

* feat: support OIDC configuration via environment variables (#531)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal directly (#156) (#503)

* fix: resolve merge conflict artifacts in dev-1.10.1

- Fix missing closing tags in AppView.tsx NetworkGraphView
- Fix incomplete catch blocks in server-stats.ts and db/index.ts
- Fix missing closing brace in en.json ports section
- Fix HostManagerApp.tsx import path
- Fix stats-widgets.ts type definition
- Fix schema.ts networkTopology table definition
- Add type annotations in user-data-import.ts

* feat: support URL routes to open terminal directly (#156)

- Add /terminal/{hostNameOrId} route for new format
- Keep /hosts/{id}/terminal for backward compatibility
- Smart detection: numeric IDs for ID lookup, otherwise name lookup
- Clean URL after opening to prevent duplicate on refresh
- Show toast error when host not found

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501)

Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal.
This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>.

- Ctrl+Alt+W → Ctrl+W (nano search, delete word)
- Ctrl+Alt+T → Ctrl+T (transpose chars)
- Ctrl+Alt+N → Ctrl+N (next line)
- Ctrl+Alt+Q → Ctrl+Q (XON flow control)

Fixes Termix-SSH/Support#407

* feat: remove locales

* New Crowdin updates (#504)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* feat: add option to disable update checker (#502)

* feat: add option to disable update checker

Add a new setting in User Profile > Settings to disable automatic
update checking on startup and dashboard.

- Adds 'Disable Update Check' toggle in profile settings
- Skips GitHub API calls when disabled (reduces network requests)
- Works for both web app and Electron client

Fixes Termix-SSH/Support#410

* feat: remove locales

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* New Crowdin updates (#505)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* feat: add crowdin i18n

* feat: remove locales

* New Crowdin updates (#506)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Bengali)

* New translations en.json (Thai)

* feat: update readme

* feat: update readme

* feat: update credential editor to use submitting system and add health monitor

* feat: added toggle for command pallete

* feat: added close button on tab dropdown

* feat: added sidebar management and improved some host manager UI/UX

* feat: re-added missing users.ts route from merge

* feat: add toggle for password reset feature in admin settings (#508)

* feat: add sudo support for file manager operations (#509)

* fix: add sudo support for listFiles and improve permission error handling (#512)

* feat: add sudo support for file manager operations

* fix: add sudo support for listFiles and improve permission error handling

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated

* feat: add copy password button and fixed new line carriage issues and backend crash for auth key

* feat: added quick connection system (ad-hoc)

* Enter Key for Quick Login (#513)

* feat: added -r and -l support for tunnels

* feat: begin dashboard overhaul by splitting into cards and adding customization

* feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc.

* feat: add auth.tsx suppot for fullscreen

* feat: greatly improve network graph ui/ux and migrated to use translations and theme system

* feat: update to use blacksmith

* feat: improve ui for customized tabs and hide add/edit host/credential when submiting

* feat: add warpgate support with a dialog (terminal only)

* feat: expand warpgate to docker/file manager

* fix: docker not working wtih warpgate and none auth failing for terminal

* fix: prevent owner permission loss when sharing host to own role (#514)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* fix: prevent owner permission loss when sharing host to own role

Fixes #391

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: SSH key passphrase not passed for Docker and Tunnel (#521)

* perf: optimize Host Manager for large host lists

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

* fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel

Database field is `key_password` but code used `keyPassword`.
Added fallback to check both field names.

Affected:
- docker.ts: Docker SSH connections with encrypted keys
- tunnel.ts: Tunnel connections with encrypted keys

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* perf: optimize Host Manager for large host lists (#520)

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: add missing mimeTypes definition for image preview (#518)

Fixes Termix-SSH/Support#408

* fix: prevent session reset when updating host properties (#517)

Move WebSocket cleanup logic to a separate unmount-only effect to
prevent SSH sessions from being closed when host properties are updated.

Closes Termix-SSH/Support#401

* fix: backend type error

* feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385)

* feat: improved conneciton log ui/logic

* feat: improved conneciton log ui/logic

* feat: expanded connection log to work across all components (readying for release)

* feat: update readme

* feat: update readme

* fix: build error

* fix: build error

* fix: changed ver

* chore: clean up

* chore: continue clean up

* fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies

* fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field

* fix: update readme and run cleaner

* fix: update readme

* fix: update readme

* fix: update readme

* feat: update chinese readme

* feat: support OIDC configuration via environment variables

Add support for configuring OIDC authentication through environment
variables, enabling containerized deployments without database access:

- OIDC_CLIENT_ID
- OIDC_CLIENT_SECRET
- OIDC_ISSUER_URL
- OIDC_AUTHORIZATION_URL
- OIDC_TOKEN_URL
- OIDC_USERINFO_URL (optional)
- OIDC_IDENTIFIER_PATH (optional, default: "sub")
- OIDC_NAME_PATH (optional, default: "name")
- OIDC_SCOPES (optional, default: "openid email profile")

Environment variables take priority over database configuration.

Closes Termix-SSH/Support#16

---------

Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>

* feat: add modern DH group KEX algorithms for better compatibility (#530)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to open terminal directly (#156) (#503)

* fix: resolve merge conflict artifacts in dev-1.10.1

- Fix missing closing tags in AppView.tsx NetworkGraphView
- Fix incomplete catch blocks in server-stats.ts and db/index.ts
- Fix missing closing brace in en.json ports section
- Fix HostManagerApp.tsx import path
- Fix stats-widgets.ts type definition
- Fix schema.ts networkTopology table definition
- Add type annotations in user-data-import.ts

* feat: support URL routes to open terminal directly (#156)

- Add /terminal/{hostNameOrId} route for new format
- Keep /hosts/{id}/terminal for backward compatibility
- Smart detection: numeric IDs for ID lookup, otherwise name lookup
- Clean URL after opening to prevent duplicate on refresh
- Show toast error when host not found

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501)

Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal.
This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>.

- Ctrl+Alt+W → Ctrl+W (nano search, delete word)
- Ctrl+Alt+T → Ctrl+T (transpose chars)
- Ctrl+Alt+N → Ctrl+N (next line)
- Ctrl+Alt+Q → Ctrl+Q (XON flow control)

Fixes Termix-SSH/Support#407

* feat: remove locales

* New Crowdin updates (#504)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* feat: add option to disable update checker (#502)

* feat: add option to disable update checker

Add a new setting in User Profile > Settings to disable automatic
update checking on startup and dashboard.

- Adds 'Disable Update Check' toggle in profile settings
- Skips GitHub API calls when disabled (reduces network requests)
- Works for both web app and Electron client

Fixes Termix-SSH/Support#410

* feat: remove locales

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* New Crowdin updates (#505)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* feat: add crowdin i18n

* feat: remove locales

* New Crowdin updates (#506)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Arabic)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Finnish)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Bulgarian)

* New translations en.json (Indonesian)

* New translations en.json (Hindi)

* New translations en.json (Bengali)

* New translations en.json (Thai)

* feat: update readme

* feat: update readme

* feat: update credential editor to use submitting system and add health monitor

* feat: added toggle for command pallete

* feat: added close button on tab dropdown

* feat: added sidebar management and improved some host manager UI/UX

* feat: re-added missing users.ts route from merge

* feat: add toggle for password reset feature in admin settings (#508)

* feat: add sudo support for file manager operations (#509)

* fix: add sudo support for listFiles and improve permission error handling (#512)

* feat: add sudo support for file manager operations

* fix: add sudo support for listFiles and improve permission error handling

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated

* feat: add copy password button and fixed new line carriage issues and backend crash for auth key

* feat: added quick connection system (ad-hoc)

* Enter Key for Quick Login (#513)

* feat: added -r and -l support for tunnels

* feat: begin dashboard overhaul by splitting into cards and adding customization

* feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc.

* feat: add auth.tsx suppot for fullscreen

* feat: greatly improve network graph ui/ux and migrated to use translations and theme system

* feat: update to use blacksmith

* feat: improve ui for customized tabs and hide add/edit host/credential when submiting

* feat: add warpgate support with a dialog (terminal only)

* feat: expand warpgate to docker/file manager

* fix: docker not working wtih warpgate and none auth failing for terminal

* fix: prevent owner permission loss when sharing host to own role (#514)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* fix: prevent owner permission loss when sharing host to own role

Fixes #391

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: SSH key passphrase not passed for Docker and Tunnel (#521)

* perf: optimize Host Manager for large host lists

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

* fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel

Database field is `key_password` but code used `keyPassword`.
Added fallback to check both field names.

Affected:
- docker.ts: Docker SSH connections with encrypted keys
- tunnel.ts: Tunnel connections with encrypted keys

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* perf: optimize Host Manager for large host lists (#520)

- Add ServerStatusContext for shared status polling (reduces API calls from N to 1)
- Move TooltipProvider to component root (eliminates N context instances)
- Add pagination with "Show More" button (limits initial DOM nodes per folder)

Fixes performance issues when managing ~1000 hosts with status monitoring enabled.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: add missing mimeTypes definition for image preview (#518)

Fixes Termix-SSH/Support#408

* fix: prevent session reset when updating host properties (#517)

Move WebSocket cleanup logic to a separate unmount-only effect to
prevent SSH sessions from being closed when host properties are updated.

Closes Termix-SSH/Support#401

* fix: backend type error

* feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385)

* feat: improved conneciton log ui/logic

* feat: improved conneciton log ui/logic

* feat: expanded connection log to work across all components (readying for release)

* feat: update readme

* feat: update readme

* fix: build error

* fix: build error

* fix: changed ver

* chore: clean up

* chore: continue clean up

* fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies

* fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field

* fix: update readme and run cleaner

* fix: update readme

* fix: update readme

* fix: update readme

* feat: update chinese readme

* feat: add modern DH group KEX algorithms for better compatibility

Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms
which are supported by ssh2 library but were not configured in Termix.

These algorithms provide:
- Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.)
- Stronger security with larger DH groups
- RFC 8268 compliance

Related to Termix-SSH/Support#205

---------

Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>

* feat: clarify that hostname/FQDN is supported in IP address field (#529)

* Feature request network graph

* Fixing PR442:

- Fixed:
    - UI design elemets
    - UI and button colors
    - JSON export
    - recent activity is default again
- Removed:
    - Online/Offline UI labels
    - left-click menu on hosts
- Added:
    - small pulsing dot inside the hosts to indicate online status like in the left bar

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

* Handle enter button (#481)

* Update Crowdin configuration file

* Update Crowdin configuration file

* Update Linux Portable section with AUR link (#474)

* fix: file manager incorrectly decoding/encoding when editing files (#476)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: build error on docker (#477)

* fix: electron build errors and skip macos job

* fix: testflight submit failure

* fix: made submit job match build type

* fix: resolve Vite build warnings for mixed static/dynamic imports (#473)

* Update Crowdin configuration file

* Update Crowdin configuration file

* fix: resolve Vite build warnings for mixed static/dynamic imports

- Convert all dynamic imports of main-axios.ts to static imports (10 files)
- Convert all dynamic imports of sonner to static imports (4 files)
- Add manual chunking configuration to vite.config.ts for better bundle splitting
  - react-vendor: React and React DOM
  - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge
  - monaco: Monaco Editor
  - codemirror: CodeMirror and related packages
- Increase chunkSizeWarningLimit to 1000kB

This resolves Vite warnings about mixed import strategies preventing
proper code-splitting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent)

* fix: build error on docker

---------

Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>

* Increase max old space size for npm builds

* Increase Node.js memory limit in Dockerfile

* Remove NODE_OPTIONS from build commands in Dockerfile

* Change runner to blacksmith-4vcpu-ubuntu-2404

* fix: build error on docker

* Add handle on enter button;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove top tech

* fix: update readme

* fix: prevent long container names from overflowing card (#496)

Added min-w-0 to CardTitle to allow text truncation in flexbox.
Without this, flex items have min-width: auto which prevents
the truncate class from working properly.

Fixes #411

* fix: use SFTP readdir for file listing to support non-Linux systems (#495)

The file manager now uses SFTP readdir as the primary method for
listing files, with ls -la as a fallback. This enables compatibility
with MikroTik RouterOS and other non-Linux systems that don't have
standard shell commands.

Fixes #317

* fix: restore SSH connection timeout to 120s for 2FA authentication (#494)

The timeout was reduced from 120s to 30s in v1.10, causing 2FA login
failures. Users with keyboard-interactive authentication (TOTP/2FA)
need sufficient time to enter their verification codes before the
SSH connection times out.

Fixes #404

* feat: add Docker container healthcheck (#493)

* fix: owner should not be marked as shared when host is shared to their role (#492)

* fix: use correct MIME types for image preview (#491)

* fix: prevent session reset when updating host properties (#490)

* fix: add shell creation timeout and improve error handling (#489)

* fix: set default lineHeight to 1.0 for TUI apps compatibility (#488)

* fix: delete all related data when removing user (#487)

* fix: nginx permission denied on restricted kernels (#486)

* fix: skip existing hosts and credentials during JSON import (#485)

Added duplicate detection for SSH hosts (by ip+port+username) and
credentials (by name) during import. Existing items are now skipped
by default, or updated if replaceExisting option is enabled.

This matches the existing behavior of importDismissedAlerts.

Fixes #389

* feat: add firewall status widget for server stats (#484)

* Feature: PWA (#479)

* feat: add PWA support with offline capabilities

- Add web app manifest with icons and theme configuration
- Add service worker with cache-first strategy for static assets
- Add useServiceWorker hook for SW registration
- Add PWA meta tags and Apple-specific tags to index.html
- Update vite.config.ts for optimal asset caching

* Update package-lock.json

* New Crowdin updates (#472)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Afrikaans)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Japanese)

* New translations en.json (Korean)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Simplified)

* New translations en.json (English)

* New translations en.json (Vietnamese)

* New translations en.json (German)

* feat: add listening ports widget for server stats (#483)

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: fix network stats merge and add openapi jsdocs comments

* feat: add workflow/config to auto generate openapi json

* feat: remove locales

* feat: support URL routes to …

* fix: unable to delete OIDC user due to missing table cleanup (#576)

deleteUserAndRelatedData was missing cleanup for networkTopology,
dashboardPreferences, and opksshTokens tables. When deleting an OIDC
user who had records in these tables, the final DELETE on users hit
SQLITE_CONSTRAINT_FOREIGNKEY. Add explicit deletes for all three
tables before the user row deletion.

* fix: use lightweight wget for Docker healthcheck (#558)

- Replace node -e healthcheck with wget (avoid spawning full Node.js process)
- Increase start-period from 30s to 60s for slower machines

* feat: add "Remember Me" option to login (#585)

When checked, browser sessions get 30-day expiry (same as desktop)
instead of the default 7-day. The flag is passed through the full
login chain including TOTP verification flow.

* feat: expand environment variables in file manager path bar (#583)

Resolve $VAR and ~ paths via SSH echo before navigating.
Add /ssh/resolvePath backend endpoint, resolveSSHPath API function,
and intercept in loadDirectory. Fix confirmEditingPath not to
prefix ~ or $ paths with /.

* fix: add Ctrl+Shift+C keyboard shortcut for terminal copy (#581)

Ctrl+Shift+C was not handled in the custom key event handler,
so users had no keyboard shortcut to copy selected text from
the terminal. Adds the shortcut alongside existing Cmd+C (macOS)
support, copying the current selection to clipboard.

* feat: add OIDC user allowlist for registration control (#580)

Add allowed_users field to OIDC config supporting comma-separated
patterns: exact emails (user@example.com), domain suffixes
(@example.com), or empty for unrestricted access. Only new user
registrations are checked; existing users and first-user setup
are unaffected.

* fix: OIDC redirect_uri incorrectly resolves to localhost (#577)

The OIDC authorize endpoint used the client Origin header to build
the redirect_uri. Desktop/mobile apps connecting to a remote server
send their local origin (e.g. http://localhost:5173), which got
force-rewritten to http://localhost:30001. This broke OIDC for all
non-browser clients.

Use req.protocol + req.get("Host") instead, which correctly resolves
to the server's own address. trust proxy is already enabled so this
works behind reverse proxies too.

* fix: keep terminal tab open on connection failure (#574)

When SSH connection fails before being established, the terminal tab
auto-closes immediately, leaving no error message visible to the user.
Added wasConnectedRef to track whether the connection was ever
established. Now only auto-closes tab on disconnect if it was previously
connected. If never connected, shows error message instead.

* fix: prevent restart loop when PUID/PGID is set to 0 (#571)

When PUID=0, usermod sets the node user's UID to 0 (root), then
gosu re-executes the script as node — but since node is now UID 0,
the id check passes again, causing an infinite loop.

Skip the gosu step when PUID=0 since the process is already root.

* feat: add README translations for 12 additional languages (#569)

Add translated README files for: Japanese, Korean, French, German,
Spanish, Portuguese (BR), Russian, Arabic, Hindi, Turkish,
Vietnamese, and Italian. Update language navigation bar in all
README files including existing English and Chinese versions.

* fix: allow OIDC users to export database without password (#575)

OIDC users have no password, but the export endpoint unconditionally
required password authentication. This reuses the same OIDC branch
pattern already implemented in the import endpoint: skip password
validation for OIDC users and authenticate via authenticateOIDCUser
instead. Frontend now also skips the password input for OIDC users.

* fix: SSH session leak — SFTP channel reuse + shared connection pool (#556)

- Cache SFTP channel per session in file-manager, reuse across all operations
- Remove all sftp.end() calls, channel lifecycle follows session
- Auto-rebuild SFTP channel on error/close events
- Extract SSHConnectionPool from server-stats into shared module
- Factory-based pool API: getConnection(key, factory) / withConnection()
- Migrate server-stats and tunnel killRemoteTunnelByMarker to shared pool
- Refactor tunnel kill from callback hell to async/await

Fixes: Termix-SSH/Support#485

* fix: handle DEC private mode sequences in syntax highlighter (#562)

Extend CSI parameter byte matching to include ?, >, =, ! per ECMA-48.
Previously sequences like \x1b[?1h and \x1b[?25l were not recognized
as ANSI segments and fell through to plain text processing.

* fix: catch disconnected client error in listFiles fallback (#564)

When SFTP times out and the fallback calls client.exec() on an
already-disconnected SSH client, the synchronous throw was not
caught, crashing the backend process.

* fix: forward Shift+Tab as backtab escape sequence (#563)

Explicitly handle Shift+Tab in the custom key event handler by sending
\x1b[Z (CSI Z) directly, with preventDefault to stop browser/WebView
focus navigation from consuming the keystroke.

* fix: disable font ligatures in terminal by default (#561)

Nerd Fonts ligatures cause != to render as ≠, <= as ≤, etc.
This is confusing for terminal use and breaks cursor positioning.

* fix: bypass ls alias in file manager fallback (#560)

- Add --color=never to command ls in SFTP fallback path
- Use /bin/ls absolute path in sudo fallback to avoid alias/wrapper

* feat: add overwrite option for JSON host import (#559)

- Add overwrite mode to bulk-import endpoint, matching by ip:port:username
- Import button now shows dropdown with "skip existing" and "overwrite existing" options
- Response includes created/updated/skipped/failed counts

* fix: status check tcpPing causing kex_exchange_identification flood in sshd logs (#557)

- Complete SSH identification exchange before closing socket in tcpPing
- Read server banner, send client identification string, then close gracefully
- Prevents sshd from logging kex_exchange_identification errors on every ping
- Increase default statusCheckInterval from 30s to 60s

* fix: add WebSocket protocol-level ping to prevent proxy timeouts (#572)

The existing application-level ping (JSON message via setInterval)
stops working when the browser tab is backgrounded due to timer
throttling. Reverse proxies like Cloudflare (100s) and Nginx Proxy
Manager (60s) then drop the idle WebSocket connection.

Add server-side ws.ping() every 30s for both terminal and docker
console WebSocket servers. Protocol-level pings are handled by
the browser's WebSocket implementation, unaffected by tab throttling.

* feat: embed backend server in Electron desktop app (#539)

* feat: embed backend server in Electron desktop app

- Fork backend process on app startup (production mode only)
- Store data in userData/server-data for desktop users
- Unpack dist/ and native modules (better-sqlite3, ssh2) from asar
- Resolve asar vs asar.unpacked paths for forked process
- Serve frontend static files from Express for iframe auth flow
- Add SPA fallback for non-API routes
- Graceful shutdown with SIGTERM + 5s force kill
- Add get-embedded-server-status IPC handler

* fix: improve electron embedded server reliability

- Extract duplicate fetch polyfill to shared httpFetch function
- Wait for backend ready before creating window (15s timeout)
- Use IPC message for graceful shutdown (SIGTERM doesn't work on Windows)
- Simplify SPA fallback to use Accept header instead of route blacklist
- Add IPC shutdown handler in backend starter

* feat: system tray minimize and runtime server switching

* fix: resolve all 274 ESLint errors in backend source files (#591)

- Remove unused imports and variables (110 no-unused-vars)
- Replace explicit any with proper types (80 no-explicit-any)
- Add comments to intentionally empty catch blocks (66 no-empty)
- Fix no-extra-boolean-cast, prefer-const, no-async-promise-executor
- No logic changes, lint-only cleanup

* fix: add missing clipboard shortcuts for terminal and docker console (#589)

Terminal and Docker Console were missing Ctrl+Shift+C (copy selection),
Ctrl+Insert (copy), and Shift+Insert (paste) shortcuts. Docker Console
also lacked Ctrl+V paste entirely. Added consistent clipboard key
handlers to both components.

* fix: resolve all ESLint errors and increase CI heap size (#588)

* fix: resolve all ESLint errors blocking CI

- Downgrade mass legacy violations to warnings (no-unused-vars,
  no-explicit-any, no-empty, no-unused-expressions)
- Turn off no-control-regex (terminal app uses control chars)
- Ignore dist/release/Mobile dirs from linting
- Auto-fix prefer-const, no-extra-boolean-cast
- Fix real bugs: async promise executor, rules-of-hooks,
  dupe-else-if, constant-binary-expression, case-declarations
- Run prettier --write on all files

* fix: increase Node.js heap size for CI build step

vite build OOMs on 2vCPU runner with default heap limit.
Set NODE_OPTIONS=--max-old-space-size=4096 to prevent it.

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: reduce excessive disk writes from unconditional database persistence (#590)

The in-memory database was serialized, encrypted, and written to disk
every 15 seconds regardless of whether any data had changed. Combined
with the 2-second debounced save trigger on every modification, this
caused ~1GB/hour of disk writes even when idle.

Add a dirty flag so the periodic save only writes when data has actually
changed, and increase the safety-net interval from 15 seconds to 5
minutes. Triggered saves (on actual data modifications) continue to
fire after the existing 2-second debounce.

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: opkssh 404 and browser issues

* fix: resolve backend TypeScript strict compilation errors (#592)

Fix 56 type errors under tsconfig.node.json caused by overly broad
unknown/Record<string, unknown> types from the ESLint cleanup.

- Add JumpHostConfig interface for jump host chain resolution
- Use proper types for resolvedCredentials, ConnectConfig, ProxyNode
- Fix setWindow call to pass all 4 required arguments
- Remove duplicate responseTimeout declarations in same scope
- Add missing ClientChannel import

* fix: clear Electron partition cookies on auth failure and logout (#599)

When the Docker container is recreated, a new JWT secret is generated and
all existing tokens become invalid. The 401 interceptor clears localStorage
and document.cookie, but the Electron persistent partition cookies
(partition: "persist:termix") are managed by Chromium and not accessible
via document.cookie. This leaves the stale token in place, causing an
infinite 401 retry loop and UI flickering.

Add a clear-session-cookies IPC handler in the main process that uses
session.cookies API to remove all partition cookies. Invoke it from the
401 interceptor and logoutUser function in the renderer.

* refactor: unify Drizzle schema property names to camelCase (#598)

* feat: add bulk host settings editing with multi-select UI

Add PATCH /ssh/bulk-update endpoint for partial updates on multiple hosts.
Frontend adds selection mode with checkboxes, folder-level select-all,
and a floating action bar for monitoring, features, folder, and pin operations.

* fix: correct Drizzle schema field name access for SSH credentials

The sshCredentials schema uses mixed naming: private_key and
key_password (snake_case) but authType and keyType (camelCase).
Multiple files accessed these fields with wrong names, causing
undefined values at runtime.

Fixed direct bugs:
- docker.ts: host.keyPassword -> host.key_password
- docker-console.ts: jumpHost.keyPassword -> jumpHost.key_password
- auth-manager.ts: cred.privateKey -> cred.private_key
- auth-manager.ts: cred.passphrase -> cred.key_password

Cleaned up redundant fallback patterns (e.g. credential.auth_type ||
credential.authType) across 8 files to use the correct property name
directly.

* refactor: unify Drizzle schema property names to camelCase

Rename 18 snake_case Drizzle schema properties to camelCase across
users, sshData, and sshCredentials tables. SQL column names unchanged,
no database migration needed.

This fixes the root cause of field name mismatch bugs where code
accessed Drizzle results using camelCase but schema used snake_case.

Updated all references across 21 files: routes, SSH modules, crypto
utilities, type definitions, and field encryption mappings.

* feat: add bulk host settings editing with multi-select UI (#596)

Add PATCH /ssh/bulk-update endpoint for partial updates on multiple hosts.
Frontend adds selection mode with checkboxes, folder-level select-all,
and a floating action bar for monitoring, features, folder, and pin operations.

* feat: add global default for status check and metrics intervals (#595)

Add global monitoring interval settings that apply to all hosts by default,
with per-host override capability. Hosts use the global default unless
explicitly configured with a custom interval.

* fix: shared credentials fail for OIDC users due to missing re-encryption (#593)

When an admin shares a host with an OIDC user who hasn't logged in yet,
a pending shared credential is created with needsReEncryption=true.
The OIDC callback login path was missing the call to
reEncryptPendingCredentialsForUser(), so the credential stayed pending
forever. Additionally, server-stats.ts accessed the shared credential
without a null check, causing a crash.

- Add reEncryptPendingCredentialsForUser() call to OIDC callback login
- Add null guard for getSharedCredentialForUser() in server-stats.ts

* feat: SSH session persistence across browser refresh (#594)

* feat: decouple SSH session lifecycle from WebSocket connections

SSH sessions now persist independently of browser tab state. When a
WebSocket disconnects (tab close/refresh), the SSH connection is
detached rather than destroyed, allowing reattachment within a
configurable idle timeout (default 30 min).

- Add TerminalSessionManager singleton with output buffering, idle
  timeout, health checks, and per-user session limits
- Refactor terminal.ts to route SSH state through session manager
- Frontend tracks session IDs in localStorage for reconnection
- Tabs persist to localStorage and restore on page reload
- Add GET/POST /terminal/session_settings API endpoints
- Clear session storage on logout

* fix: resolve session persistence bugs found during code review

- Fix detachWs timeout leak on double-detach (clear existing timeout first)
- Fix healthCheck mutating Map during iteration (collect IDs first)
- Capture sessionId at stream bind time to prevent cross-session data leakage
- Add session destruction in OPKSSH/auth error paths that previously leaked
- Add session destruction in shell init early-return paths
- Reset isConnecting flag in attachSession handler
- Use current terminal dimensions in sessionExpired handler (not stale closure)
- Fix nextTabId race condition with synchronous initialization from restored tabs
- Validate restored currentTab against actual restored tabs
- Add clearTermixSessionStorage to logout error path

* fix: correct raw SQL field name mismatches in crypto and credential routes (#601)

Fix camelCase/snake_case mismatches left after #598 schema refactor:

- credentials.ts: 5 remaining snake_case fields in Drizzle insert/update
- data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records
  with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns
  snake_case columns, causing undefined values and silent data loss
- lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data
  fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword),
  migrateRecordSensitiveFields() now uses propertyToColumn() to resolve
  snake_case keys from raw SQL results

* feat: add per-host SSH keepalive configuration (#603)

* fix: correct raw SQL field name mismatches in crypto and credential routes

Fix camelCase/snake_case mismatches left after #598 schema refactor:

- credentials.ts: 5 remaining snake_case fields in Drizzle insert/update
- data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records
  with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns
  snake_case columns, causing undefined values and silent data loss
- lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data
  fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword),
  migrateRecordSensitiveFields() now uses propertyToColumn() to resolve
  snake_case keys from raw SQL results

* feat: add per-host SSH keepalive configuration

MikroTik and similar devices ignore SSH-level keepalive requests,
causing ssh2 to disconnect after keepaliveCountMax unanswered pings
(default: 30s × 4 = 120s).

Add keepaliveInterval and keepaliveCountMax to terminalConfig,
allowing per-host override. Users can set keepaliveInterval to 0
to disable SSH keepalives and rely on TCP keepalive instead.

Backend reads the values from hostConfig.terminalConfig sent via
WebSocket. Frontend exposes the settings in the Advanced section
of the terminal configuration tab.

* fix: enable Electron desktop app to run standalone with embedded backend (#609)

* fix: enable Electron desktop app to run standalone with embedded backend

The Electron app already starts an embedded backend server via fork(),
but the frontend had no awareness of it. On first launch, users were
always prompted to enter a remote server URL even though a local backend
was already running on localhost.

- Add getEmbeddedServerStatus() to query the embedded backend via IPC
- Add embeddedMode flag in main-axios.ts, detected at initialization
- In embedded mode without a configured remote URL, getApiUrl() now
  routes each service to its own localhost port (30001, 30003, etc.)
  matching the dev-mode multi-port strategy
- Auth.tsx checkServerConfig() detects embedded backend and skips the
  server configuration form, falling through to the standard login UI

* fix: add explicit "Use Local Server" button and improve embedded detection

The silent auto-detection of the embedded backend can fail due to IPC
timing issues or backend startup failures. Add a visible "Use Local
Server" button on the Server Configuration page that:

- Probes http://localhost:30001/health to verify the backend is running
- Sets embeddedMode and reinitializes API instances with per-port routing
- Falls through to the standard login form (no iframe needed)

Also adds setEmbeddedMode() export so the UI can explicitly activate
embedded mode, and adds i18n keys for the new UI elements.

* fix: disable asar for embedded backend, improve tray and health probe

The forked backend process uses ESM imports and cannot resolve modules
from inside an asar archive (NODE_PATH is CJS-only). Disabling asar
ensures node_modules are plain files accessible to the backend.

- Disable asar packaging so forked backend can resolve ESM imports
- Remove node_modules exclusion from files config
- Fix system tray: use nativeImage with template on macOS, add error
  handling, only minimize-to-tray when tray exists
- Add retry mechanism for backend health probe (10 retries over ~30s)
  to handle slow backend startup
- Always show "Use Local Server" button in Electron mode regardless
  of backend running status
- Add file logging to userData for debugging GUI-launched app

* feat: unified proxy + jump host pipeline with HTTP CONNECT support (#608)

* fix: unify proxy and jump host connection paths

SOCKS5 proxy and jump host logic were mutually exclusive — the SOCKS5
branch returned early, so jump hosts were never reached when both were
configured. This affected terminal, file-manager, docker, and
server-stats modules.

Refactored all four modules to a unified pipeline:
- createJumpHostChain() accepts optional socks5Config parameter
- When both proxy and jump hosts are configured, the proxy socket is
  created to the first jump host internally, then used as transport
- Three-branch flow: jumpHosts (with optional proxy) → proxy-only → direct
- Enhanced error logging with hopIndex, totalHops, previousHop fields

* feat: add HTTP CONNECT proxy support with mixed chain

Extend ProxyNode.type to support 'http' alongside SOCKS4/5.

New proxy-helper.ts provides:
- createHttpConnectConnection(): HTTP CONNECT tunnel with Basic auth
  and optional existingSocket for chaining
- createMixedProxyChainConnection(): routes each hop to SOCKS or HTTP
  CONNECT based on node type; pure-SOCKS chains still use the optimized
  SocksClient.createConnectionChain path
- createProxyConnection(): unified entry point (backward-compatible alias
  for createSocks5Connection)
- testProxyConnectivity(): connect through proxy to test target, measure
  latency

socks5-helper.ts becomes a re-export shim — all existing import sites
continue to work unchanged.

* feat: add proxy connectivity test endpoint

New POST /ssh/db/proxy/test API accepts singleProxy, proxyChain, and
optional testTarget. Calls testProxyConnectivity() and returns
success/latencyMs or error.

Frontend testProxyConnection() function added to main-axios.ts.

* feat: add connection path visualization and HTTP CONNECT UI

- Proxy chain type selector now includes HTTP CONNECT option
- Test Connection button calls /ssh/db/proxy/test with loading state
- Connection path visualization shows the full route when proxy and/or
  jump hosts are configured: [You] → [Proxy] → [Jump Host] → [Target]
- New i18n keys: httpConnect, testProxy, testingProxy, proxyTestSuccess,
  proxyTestFailed, connectionPath

* fix: add Cache-Control no-store header to all API responses (#607)

Backend API responses had no Cache-Control headers, making them
vulnerable to caching by intermediate reverse proxies. This could
cause stale data in the UI when Termix is deployed behind certain
proxy configurations (e.g., SWAG, Pangolin).

Add Cache-Control: no-store middleware to all 6 Express apps to
prevent any proxy or browser from caching API responses.

* fix: preserve external reverse proxy X-Forwarded headers in internal Nginx (#606)

The internal Nginx proxy was overwriting X-Forwarded-Proto, X-Forwarded-Host,
and X-Forwarded-Port with local values ($scheme, $http_host, $server_port),
discarding headers set by the external reverse proxy. This caused
getRequestOrigin() to always return http:// with the internal port for
OpkSSH authentication URLs.

Add map directives to preserve original X-Forwarded-* headers from the
external proxy, falling back to local values when no external proxy is
present. Also remove duplicate header directives in the WebSocket location.

* fix: host update fails silently due to statsConfig double-serialization (#605)

- Fix statsConfig double JSON.stringify in both frontend (createSSHHost,
  updateSSHHost) and backend (POST/PUT handlers). Frontend was pre-
  stringifying statsConfig before sending, then backend stringified again,
  corrupting the data after multiple edits and eventually causing Zod
  validation failures on the edit form.
- Add missing sudoPassword field to createSSHHost and updateSSHHost submit
  data, which was being set in onSubmit but dropped during API call
  construction.
- Add toast notification in handleFormError so users get visible feedback
  when form validation fails instead of silent no-op.

* fix: Ctrl+C copies selection and clipboard error feedback (#604)

* fix: correct raw SQL field name mismatches in crypto and credential routes

Fix camelCase/snake_case mismatches left after #598 schema refactor:

- credentials.ts: 5 remaining snake_case fields in Drizzle insert/update
- data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records
  with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns
  snake_case columns, causing undefined values and silent data loss
- lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data
  fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword),
  migrateRecordSensitiveFields() now uses propertyToColumn() to resolve
  snake_case keys from raw SQL results

* fix: Ctrl+C copies selection instead of sending SIGINT when text is selected

When terminal has an active text selection, Ctrl+C now copies the
selected text to clipboard and clears the selection. When nothing
is selected, Ctrl+C sends SIGINT as before. Ctrl+Shift+C continues
to work as a dedicated copy shortcut.

Also adds toast notifications when clipboard operations fail instead
of silently swallowing errors. Applied to both the main terminal
and Docker console terminal.

* fix: improve IPv6 connection handling with bracket stripping and ENETUNREACH hint (#602)

Strip square brackets from IPv6 addresses at all SSH connection entry
points (terminal, docker, docker-console, file-manager, server-stats,
tunnel) to handle addresses entered as [::1] format.

Add ENETUNREACH error hint in terminal.ts that detects IPv6 addresses
and suggests checking Docker IPv6 network configuration.

Also fix remaining snake_case field names in credentials.ts (same as #601).

* fix: backend catch error

* feat: improve selection UI

* fix: remove tab naming

* fix: squished ssh toolbar split ui buttons

* feat: improve persistent tabs, data not saving for users, various ui inconsistencies

* fix: tab context creating random context errors

* fix: improve terminal session logic (not perfect)s

* fix: terminal session logic creating errors and electron app not having UI to do local mode

* fix: desktop build error

* feat: update readme

* feat: update readme

* feat: update readme

* Update README.md (#612)

* fix: macos build failure and updated rest of the langs for readme

* feat: update readmes to fix spelling error

* feat: update readmes to fix spelling error

* fix: oidc failures, opkssh not wokring, added some qol to selecting

* fix: buyild erorr

* fix: buyild erorr

* fix: macos build error

* fix: opkssh, macos copy/paste, admin settings global default backend crashes, oidc redirect issues, updated translations

* chore: clean up files

* fix: oidc http/https redirect issue

* fix: build error

* feat: update json import with all new fields

---------

Co-authored-by: skyam25 <simonkyam@gmail.com>
Co-authored-by: ZacharyZcR <PayasoNorahC@protonmail.com>
Co-authored-by: Steven Josefs <s.josefs@gmx.de>
Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com>
Co-authored-by: Termix CI <ci@termix.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Gaylord Julien <g.j@mailbox.org>
Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com>
Co-authored-by: Deepansh Khurana <deepanshkhurana@outlook.com>
Co-authored-by: Dylan Ysmal <Xenthys@users.noreply.github.com>
Co-authored-by: TomyJan <TomyJan6@gmail.com>
Co-authored-by: ywaf <52742690+ywaf@users.noreply.github.com>
2026-03-08 18:02:14 -05:00

2666 lines
213 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"credentials": {
"credentialsViewer": "Προβολέας Πιστοποιητικών",
"manageYourSSHCredentials": "Διαχειριστείτε τα SSH διαπιστευτήρια σας με ασφάλεια",
"addCredential": "Προσθήκη Διαπιστευτηρίου",
"createCredential": "Δημιουργία διαπιστευτηρίου",
"editCredential": "Επεξεργασία Διαπιστευτηρίων",
"viewCredential": "Προβολή Διαπιστευτηρίων",
"duplicateCredential": "Διπλότυπο Διαπιστευτηρίου",
"deleteCredential": "Διαγραφή Διαπιστευτηρίου",
"updateCredential": "Ενημέρωση Διαπιστευτηρίων",
"credentialName": "Όνομα Διαπιστευτηρίου",
"credentialDescription": "Περιγραφή",
"username": "Όνομα Χρήστη",
"searchCredentials": "Αναζήτηση διαπιστευτηρίων...",
"selectFolder": "Επιλογή Φακέλου",
"selectAuthType": "Επιλογή Τύπου Πιστοποίησης",
"allFolders": "Όλοι Οι Φάκελοι",
"allAuthTypes": "Όλοι Οι Τύποι Πιστοποίησης",
"uncategorized": "Αταξινόμητο",
"totalCredentials": "Σύνολο",
"keyBased": "Βασισμένο",
"passwordBased": "Βασισμένο στον Κωδικό",
"folders": "Φάκελοι",
"noCredentialsMatchFilters": "Δεν υπάρχουν διαπιστευτήρια που να ταιριάζουν στα φίλτρα σας",
"noCredentialsYet": "Δεν έχουν δημιουργηθεί ακόμη διαπιστευτήρια",
"createFirstCredential": "Δημιουργήστε τα πρώτα σας διαπιστευτήρια",
"failedToFetchCredentials": "Αποτυχία ανάκτησης διαπιστευτηρίων",
"credentialDeletedSuccessfully": "Το διαπιστευτήριο διαγράφηκε επιτυχώς",
"failedToDeleteCredential": "Αποτυχία διαγραφής διαπιστευτηρίων",
"confirmDeleteCredential": "Είστε βέβαιοι ότι θέλετε να διαγράψετε τα διαπιστευτήρια \"{{name}}\"?",
"credentialCreatedSuccessfully": "Επιτυχής δημιουργία διαπιστευτηρίων",
"credentialUpdatedSuccessfully": "Το διαπιστευτήριο ενημερώθηκε επιτυχώς",
"failedToSaveCredential": "Αποτυχία αποθήκευσης διαπιστευτηρίων",
"failedToFetchCredentialDetails": "Αποτυχία λήψης στοιχείων διαπιστευτηρίων",
"failedToFetchHostsUsing": "Αποτυχία λήψης hosts με χρήση αυτού του διαπιστευτηρίου",
"loadingCredentials": "Φόρτωση διαπιστευτηρίων...",
"retry": "Επανάληψη",
"noCredentials": "Χωρίς Πιστοποιητικά",
"noCredentialsMessage": "Δεν έχετε προσθέσει ακόμα κανένα πιστοποιητικό. Κάντε κλικ στο κουμπί \"Προσθήκη πιστοποίησης\" για να ξεκινήσετε.",
"sshCredentials": "Πιστοποιητικά SSH",
"credentialsCount": "{{count}} διαπιστευτήρια",
"refresh": "Ανανέωση",
"passwordRequired": "Απαιτείται κωδικός πρόσβασης",
"sshKeyRequired": "Απαιτείται SSH κλειδί",
"credentialAddedSuccessfully": "Επιτυχής προσθήκη διαπιστευτηρίων \"{{name}}\"",
"savingCredential": "Αποθήκευση διαπιστευτηρίου...",
"updatingCredential": "Ενημέρωση διαπιστευτηρίου...",
"general": "Γενικά",
"description": "Περιγραφή",
"folder": "Φάκελος",
"tags": "Ετικέτες",
"addTagsSpaceToAdd": "Προσθήκη ετικετών (πατήστε κενό για να προσθέσετε)",
"password": "Κωδικός",
"key": "Κλειδί",
"sshPrivateKey": "Ιδιωτικό Κλειδί SSH",
"upload": "Ανέβασμα",
"updateKey": "Ενημέρωση Κλειδιού",
"keyPassword": "Κωδικός Πρόσβασης Κλειδιού",
"keyType": "Τύπος Κλειδιού",
"keyTypeRSA": "RSA",
"keyTypeECDSA": "ECDSA",
"keyTypeEd25519": "Ed25519",
"basicInfo": "Βασικές Πληροφορίες",
"authentication": "Ταυτοποίηση",
"organization": "Οργανισμός",
"basicInformation": "Βασικές Πληροφορίες",
"basicInformationDescription": "Εισάγετε τις βασικές πληροφορίες για αυτό το διαπιστευτήριο",
"authenticationMethod": "Μέθοδος Ταυτοποίησης",
"authenticationMethodDescription": "Επιλέξτε πώς θέλετε να πιστοποιήσετε με τους διακομιστές SSH",
"organizationDescription": "Οργανώστε τα διαπιστευτήριά σας με φακέλους και ετικέτες",
"enterCredentialName": "Εισάγετε όνομα διαπιστευτηρίου",
"enterCredentialDescription": "Εισάγετε περιγραφή (προαιρετικό)",
"enterUsername": "Εισάγετε όνομα χρήστη",
"nameIsRequired": "Απαιτείται όνομα διαπιστευτηρίου",
"usernameIsRequired": "Απαιτείται όνομα χρήστη",
"authenticationType": "Τύπος Ταυτοποίησης",
"passwordAuthDescription": "Χρήση ταυτοποίησης κωδικού",
"sshKeyAuthDescription": "Χρήση ταυτοποίησης κλειδιού SSH",
"passwordIsRequired": "Απαιτείται κωδικός πρόσβασης",
"sshKeyIsRequired": "Απαιτείται SSH κλειδί",
"sshKeyType": "Τύπος Κλειδιού SSH",
"privateKey": "Ιδιωτικό Κλειδί",
"enterPassword": "Εισάγετε κωδικό πρόσβασης",
"enterPrivateKey": "Εισάγετε ιδιωτικό κλειδί",
"keyPassphrase": "Συνθηματική Φράση Κλειδιού",
"enterKeyPassphrase": "Εισαγωγή φράσης πρόσβασης κλειδιού (προαιρετικό)",
"keyPassphraseOptional": "Προαιρετικό: αφήστε κενό εάν το κλειδί σας δεν έχει φράση πρόσβασης",
"leaveEmptyToKeepCurrent": "Αφήστε κενό για να διατηρήσετε την τρέχουσα τιμή",
"uploadKeyFile": "Μεταφόρτωση Αρχείου Κλειδιού",
"generateKeyPairButton": "Δημιουργία Ζεύγους Κλειδιών",
"generateKeyPair": "Δημιουργία Ζεύγους Κλειδιών",
"generateKeyPairDescription": "Δημιουργήστε ένα νέο ζεύγος κλειδιών SSH. Αν θέλετε να προστατέψετε το κλειδί με μια φράση πρόσβασης, πληκτρολογήστε το στο πεδίο Κλειδί Κωδικός Πρόσβασης πρώτα παρακάτω.",
"deploySSHKey": "Ανάπτυξη Κλειδιού SSH",
"deploySSHKeyDescription": "Ανάπτυξη δημόσιου κλειδιού στο διακομιστή προορισμού",
"sourceCredential": "Διαπιστευτήρια Πηγής",
"targetHost": "Διακομιστής Στόχου",
"deploymentProcess": "Διαδικασία Ανάπτυξης",
"deploymentProcessDescription": "Αυτό θα προσθέσει με ασφάλεια το δημόσιο κλειδί στο αρχείο ~/.ssh/authorized_keys του κεντρικού υπολογιστή του στόχου χωρίς να αντικαταστήσει τα υπάρχοντα κλειδιά. Η λειτουργία είναι αναστρέψιμη.",
"chooseHostToDeploy": "Επιλέξτε έναν κεντρικό υπολογιστή για ανάπτυξη...",
"deploying": "Εφαρμογή...",
"name": "Όνομα",
"noHostsAvailable": "Δεν υπάρχουν διαθέσιμοι υπολογιστές",
"noHostsMatchSearch": "Κανένας υπολογιστής δεν ταιριάζει με την αναζήτησή σας",
"sshKeyGenerationNotImplemented": "Το χαρακτηριστικό δημιουργίας κλειδιού SSH έρχεται σύντομα",
"connectionTestingNotImplemented": "Λειτουργία δοκιμής σύνδεσης που έρχεται σύντομα",
"testConnection": "Δοκιμή Σύνδεσης",
"selectOrCreateFolder": "Επιλέξτε ή δημιουργήστε φάκελο",
"noFolder": "Δεν υπάρχει φάκελος",
"orCreateNewFolder": "Ή δημιουργήστε νέο φάκελο",
"addTag": "Προσθήκη ετικέτας",
"saving": "Αποθηκεύεται...",
"credentialId": "Αναγνωριστικό διαπιστευτηρίου",
"overview": "Επισκόπηση",
"security": "Ασφάλεια",
"usage": "Χρήση",
"securityDetails": "Λεπτομέρειες Ασφαλείας",
"securityDetailsDescription": "Προβολή κρυπτογραφημένων πληροφοριών διαπιστευτηρίων",
"credentialSecured": "Πιστοποιητικά Ασφαλισμένα",
"credentialSecuredDescription": "Όλα τα ευαίσθητα δεδομένα είναι κρυπτογραφημένα με AES-256",
"passwordAuthentication": "Πιστοποίηση Κωδικού Πρόσβασης",
"keyAuthentication": "Ταυτοποίηση Κλειδιού",
"securityReminder": "Υπενθύμιση Ασφαλείας",
"securityReminderText": "Ποτέ μην κοινοποιείτε τα διαπιστευτήριά σας. Όλα τα δεδομένα είναι κρυπτογραφημένα κατά την ανάπαυση.",
"hostsUsingCredential": "Υπολογιστές Που Χρησιμοποιούν Αυτό Το Διαπιστευτήριο",
"noHostsUsingCredential": "Κανένας υπολογιστής δεν χρησιμοποιεί αυτή τη στιγμή αυτό το διαπιστευτήριο",
"timesUsed": "Φορές Που Χρησιμοποιούνται",
"lastUsed": "Τελευταία Χρήση",
"connectedHosts": "Συνδεδεμένοι Υπολογιστές",
"created": "Δημιουργήθηκε",
"lastModified": "Τελευταία Τροποποίηση",
"usageStatistics": "Στατιστικά Χρήσης",
"copiedToClipboard": "{{field}} αντιγράφηκε στο πρόχειρο",
"failedToCopy": "Αποτυχία αντιγραφής στο πρόχειρο",
"sshKey": "SSH Κλειδί",
"createCredentialDescription": "Δημιουργήστε ένα νέο SSH διαπιστευτήριο για ασφαλή πρόσβαση",
"editCredentialDescription": "Ενημέρωση πληροφοριών διαπιστευτηρίων",
"listView": "Λίστα",
"folderView": "Φάκελοι",
"unknownCredential": "Άγνωστο",
"confirmRemoveFromFolder": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το \"{{name}}\" από το φάκελο \"{{folder}}\"? Τα διαπιστευτήρια θα μετακινηθούν στο \"Uncategorized\".",
"removedFromFolder": "Το διαπιστευτήριο \"{{name}}\" διαγράφηκε επιτυχώς από το φάκελο",
"failedToRemoveFromFolder": "Αποτυχία κατάργησης διαπιστευτηρίων από το φάκελο",
"folderRenamed": "Φάκελος \"{{oldName}}\" μετονομάστηκε σε \"{{newName}}\" επιτυχώς",
"failedToRenameFolder": "Αποτυχία μετονομασίας φακέλου",
"movedToFolder": "Τα διαπιστευτήρια \"{{name}}\" μετακινήθηκαν με επιτυχία στο \"{{folder}}\"",
"failedToMoveToFolder": "Αποτυχία μετακίνησης διαπιστευτηρίων στο φάκελο",
"sshPublicKey": "Δημόσιο Κλειδί SSH",
"publicKeyNote": "Το δημόσιο κλειδί είναι προαιρετικό, αλλά συνιστάται για επικύρωση κλειδιού",
"publicKeyUploaded": "Το Δημόσιο Κλειδί Ανέβηκε",
"uploadPublicKey": "Μεταφόρτωση Δημόσιου Κλειδιού",
"uploadPrivateKeyFile": "Ανεβάστε Αρχείο Ιδιωτικού Κλειδιού",
"uploadPublicKeyFile": "Μεταφόρτωση Αρχείου Δημόσιου Κλειδιού",
"privateKeyRequiredForGeneration": "Απαιτείται ιδιωτικό κλειδί για τη δημιουργία δημόσιου κλειδιού",
"failedToGeneratePublicKey": "Αποτυχία δημιουργίας δημόσιου κλειδιού",
"generatePublicKey": "Δημιουργία από Ιδιωτικό Κλειδί",
"publicKeyGeneratedSuccessfully": "Το δημόσιο κλειδί δημιουργήθηκε με επιτυχία",
"detectedKeyType": "Εντοπίστηκε τύπος κλειδιού",
"detectingKeyType": "ανίχνευση...",
"optional": "Προαιρετικό",
"generateKeyPairNew": "Δημιουργία Νέου Ζεύγους Κλειδιών",
"generateEd25519": "Δημιουργία Ed25519",
"generateECDSA": "Δημιουργία ECDSA",
"generateRSA": "Δημιουργία RSA",
"keyTypeEcdsaP256": "ECDSA P-256 (SSH)",
"keyTypeEcdsaP384": "ECDSA P-384 (SSH)",
"keyTypeEcdsaP521": "ECDSA P-521 (SSH)",
"keyTypeDsa": "DSA (SSH)",
"keyTypeRsaSha256": "RSA-SHA2-256",
"keyTypeRsaSha512": "RSA-SHA2-512",
"keyPairGeneratedSuccessfully": "Το ζεύγος κλειδιών {{keyType}} δημιουργήθηκε με επιτυχία",
"failedToGenerateKeyPair": "Αποτυχία δημιουργίας ζεύγους κλειδιών",
"generateKeyPairNote": "Δημιουργήστε ένα νέο ζεύγος SSH άμεσα. Αυτό θα αντικαταστήσει όλα τα υπάρχοντα κλειδιά στη φόρμα.",
"invalidKey": "Μη Έγκυρο Κλειδί",
"detectionError": "Σφάλμα Ανίχνευσης",
"removing": "Κατάργηση:",
"clickToEditCredential": "Κάντε κλικ για επεξεργασία διαπιστευτηρίων",
"dragToMoveBetweenFolders": "Σύρετε για μετακίνηση μεταξύ φακέλων",
"keyBasedOnlyForDeployment": "Μπορούν να αναπτυχθούν μόνο διαπιστευτήρια SSH με βάση τα κλειδιά",
"publicKeyRequiredForDeployment": "Απαιτείται δημόσιο κλειδί για την ανάπτυξη",
"selectTargetHost": "Παρακαλώ επιλέξτε έναν διακομιστή προορισμού",
"keyDeployedSuccessfully": "Το SSH κλειδί αναπτύχθηκε με επιτυχία",
"deploymentFailed": "Αποτυχία ανάπτυξης",
"failedToDeployKey": "Αποτυχία ανάπτυξης του SSH κλειδιού",
"clickToRenameFolder": "Κλικ για μετονομασία φακέλου",
"renameFolder": "Μετονομασία φακέλου",
"idLabel": "ID:"
},
"quickConnect": {
"title": "Γρήγορη Σύνδεση",
"description": "Σύνδεση απευθείας σε μια συνεδρία τερματικού ή διαχειριστή αρχείων χωρίς αποθήκευση παραμέτρων κεντρικού υπολογιστή",
"ipAddress": "Διεύθυνση IP ή όνομα κεντρικού υπολογιστή",
"port": "Θύρα",
"username": "Όνομα Χρήστη",
"password": "Κωδικός",
"key": "Ιδιωτικό Κλειδί SSH",
"keyPassword": "Κωδικός Κλειδιού (Προαιρετικό)",
"keyType": "Τύπος Κλειδιού",
"uploadFile": "Μεταφόρτωση Αρχείου",
"pasteKey": "Πλήκτρο Επικόλλησης",
"credential": "Διαπιστευτήριο",
"overrideUsername": "Παράκαμψη Ονόματος Διαπιστευτηρίου Χρήστη",
"overrideUsernameDesc": "Χρησιμοποιήστε ένα διαφορετικό όνομα χρήστη από αυτό που είναι αποθηκευμένο στα διαπιστευτήρια",
"connectTerminal": "Σύνδεση στο Τερματικό",
"connectFileManager": "Σύνδεση στον Διαχειριστή Αρχείων",
"cancel": "Ακύρωση",
"passwordRequired": "Απαιτείται κωδικός πρόσβασης",
"keyRequired": "Απαιτείται SSH κλειδί",
"credentialRequired": "Απαιτείται επιλογή διαπιστευτηρίων",
"connectionEstablished": "Η σύνδεση ολοκληρώθηκε με επιτυχία",
"connectionFailed": "Αποτυχία δημιουργίας σύνδεσης",
"autoDetect": "Αυτόματη Ανίχνευση",
"authentication": "Ταυτοποίηση"
},
"dragIndicator": {
"error": "Σφάλμα: {{error}}",
"dragging": "Σύρσιμο {{fileName}}",
"preparing": "Προετοιμασία {{fileName}}",
"readySingle": "Έτοιμο για λήψη {{fileName}}",
"readyMultiple": "Έτοιμο για λήψη {{count}} αρχείων",
"batchDrag": "Σύρετε {{count}} αρχεία στην επιφάνεια εργασίας",
"dragToDesktop": "Σύρετε στην επιφάνεια εργασίας",
"canDragAnywhere": "Μπορείτε να σύρετε αρχεία οπουδήποτε στην επιφάνεια εργασίας σας"
},
"sshTools": {
"title": "Εργαλεία SSH",
"closeTools": "Κλείσιμο Εργαλείων SSH",
"keyRecording": "Εγγραφή Πλήκτρων",
"startKeyRecording": "Έναρξη Εγγραφής Κλειδιού",
"stopKeyRecording": "Διακοπή Εγγραφής Κλειδιών",
"selectTerminals": "Επιλογή τερματικών:",
"typeCommands": "Πληκτρολογήστε εντολές (υποστηρίζονται όλα τα πλήκτρα):",
"commandsWillBeSent": "Οι εντολές θα σταλούν στο {{count}} επιλεγμένο τερματικό(α).",
"settings": "Ρυθμίσεις",
"enableRightClickCopyPaste": "Ενεργοποίηση αντιγραφής/επικόλλησης με δεξί κλικ",
"shareIdeas": "Έχετε ιδέες για το τι θα πρέπει να έρθει επόμενο για ssh tools? Μοιραστείτε τους στο",
"scripts": {
"inputPlaceholder": "π.χ., Εντολές Συστήματος, Σενάρια Docker"
}
},
"snippets": {
"title": "Δείγματα",
"new": "Νέο Δείγμα",
"create": "Δημιουργία Δείγματος",
"edit": "Επεξεργασία Δείγματος",
"run": "Εκτέλεση",
"empty": "Δεν υπάρχουν ακόμη αποσπάσματα",
"emptyHint": "Δημιουργήστε ένα απόσπασμα για να αποθηκεύσετε τις συνήθως χρησιμοποιούμενες εντολές",
"searchSnippets": "Αναζήτηση αποσπασμάτων ...",
"name": "Όνομα",
"description": "Περιγραφή",
"content": "Εντολή",
"namePlaceholder": "π.χ. Επανεκκίνηση Nginx",
"descriptionPlaceholder": "Προαιρετική περιγραφή",
"contentPlaceholder": "π.χ. sudo systemctl restart nginx",
"nameRequired": "Απαιτείται όνομα",
"contentRequired": "Απαιτείται εντολή",
"createDescription": "Δημιουργήστε ένα νέο στέλεχος εντολών για γρήγορη εκτέλεση",
"editDescription": "Επεξεργαστείτε αυτό το απόθεμα εντολής",
"deleteConfirmTitle": "Διαγραφή Δείγματος",
"deleteConfirmDescription": "Είστε βέβαιοι ότι θέλετε να διαγράψετε \"{{name}}\"?",
"createSuccess": "Δείγμα δημιουργήθηκε με επιτυχία",
"updateSuccess": "Δείγμα ενημερώθηκε με επιτυχία",
"deleteSuccess": "Δείγμα διαγράφηκε με επιτυχία",
"createFailed": "Αποτυχία δημιουργίας αποσπάσματος",
"updateFailed": "Αποτυχία ενημέρωσης αποσπάσματος",
"deleteFailed": "Αποτυχία διαγραφής αποσπάσματος",
"failedToFetch": "Αποτυχία λήψης αποσπασμάτων",
"executeSuccess": "Εκτέλεση: {{name}}",
"copySuccess": "Αντιγράφηκε το \"{{name}}\" στο πρόχειρο",
"runTooltip": "Εκτέλεση αυτού του αποσπάσματος στο τερματικό",
"copyTooltip": "Αντιγραφή αποσπάσματος στο πρόχειρο",
"editTooltip": "Επεξεργαστείτε αυτό το απόσπασμα",
"deleteTooltip": "Διαγραφή αυτού του αποσπάσματος",
"newFolder": "Νέος Φάκελος",
"reorderSameFolder": "Μπορεί μόνο να αναδιατάξει τα αποσπάσματα εντός του ίδιου φακέλου",
"reorderSuccess": "Δείγματα αναπαραγγέλθηκαν με επιτυχία",
"reorderFailed": "Αποτυχία αναδιάταξης αποσπασμάτων",
"deleteFolderConfirm": "Διαγραφή του φακέλου \"{{name}}\"? Όλα τα αποσπάσματα θα μετακινηθούν σε Uncategorized.",
"deleteFolderSuccess": "Ο φάκελος διαγράφηκε επιτυχώς",
"deleteFolderFailed": "Αποτυχία διαγραφής φακέλου",
"updateFolderSuccess": "Ο φάκελος ενημερώθηκε επιτυχώς",
"createFolderSuccess": "Ο φάκελος δημιουργήθηκε με επιτυχία",
"updateFolderFailed": "Αποτυχία ενημέρωσης φακέλου",
"createFolderFailed": "Αποτυχία δημιουργίας φακέλου",
"selectTerminals": "Επιλέξτε Τερματικά (Προαιρετικό)",
"executeOnSelected": "Εκτέλεση στο {{count}} επιλεγμένο τερματικό(ά)",
"executeOnCurrent": "Εκτέλεση στο τρέχον τερματικό (κάντε κλικ για να επιλέξετε πολλαπλά)",
"folder": "Φάκελος",
"selectFolder": "Επιλέξτε ένα φάκελο ή αφήστε κενό",
"noFolder": "Χωρίς φάκελο (Μη κατηγοριοποιημένο)",
"folderName": "Όνομα Φακέλου",
"folderNameRequired": "Απαιτείται όνομα φακέλου",
"folderColor": "Χρώμα Φακέλου",
"folderIcon": "Εικονίδιο Φακέλου",
"preview": "Προεπισκόπηση",
"updateFolder": "Ενημέρωση Φακέλου",
"createFolder": "Δημιουργία Φακέλου",
"editFolder": "Επεξεργασία Φακέλου",
"editFolderDescription": "Προσαρμόστε το φάκελο αποκοπής",
"createFolderDescription": "Οργανώστε τα αποσπάσματα σας σε φακέλους"
},
"commandHistory": {
"title": "Ιστορικό",
"searchPlaceholder": "Αναζήτηση εντολών...",
"noTerminal": "Δεν υπάρχει ενεργό τερματικό",
"noTerminalHint": "Ανοίξτε ένα τερματικό για να δείτε το ιστορικό εντολών.",
"empty": "Δεν υπάρχει ιστορικό εντολών ακόμα",
"emptyHint": "Εκτέλεση εντολών στο ενεργό τερματικό για την κατασκευή του ιστορικού του.",
"noResults": "Δεν βρέθηκαν εντολές",
"noResultsHint": "Δεν υπάρχουν εντολές που να ταιριάζουν \"{{query}}\"",
"deleteSuccess": "Η εντολή διαγράφηκε από το ιστορικό",
"deleteFailed": "Αποτυχία διαγραφής εντολής.",
"deleteTooltip": "Διαγραφή εντολής",
"tabHint": "Χρήση καρτέλας στο τερματικό για την αυτόματη συμπλήρωση από το ιστορικό εντολών, εάν είναι ενεργοποιημένη στο Προφίλ Χρήστη",
"authRequiredRefresh": "Απαιτείται έλεγχος ταυτότητας. Παρακαλώ ανανεώστε τη σελίδα.",
"dataAccessLockedReauth": "Η πρόσβαση στα δεδομένα κλειδώθηκε. Παρακαλώ επαναλάβετε τον έλεγχο ταυτότητας.",
"loading": "Φόρτωση ιστορικού εντολών...",
"error": "Σφάλμα Φόρτωσης Ιστορικού"
},
"splitScreen": {
"title": "Διαίρεση Οθόνης",
"none": "Κανένα",
"twoSplit": "2-Τρόπος",
"threeSplit": "3-Τρόπος",
"fourSplit": "4-Τρόπος",
"availableTabs": "Διαθέσιμες Καρτέλες",
"dragTabsHint": "Σύρετε τις καρτέλες στα παρακάτω κελιά διάταξης για να τις αντιστοιχίσετε",
"layout": "Διαίρεση Διάταξης Οθόνης",
"dropHere": "Απόθεση καρτέλας εδώ",
"apply": "Εφαρμογή Διαχωρισμού",
"clear": "Καθαρισμός Διαχωρισμού",
"selectMode": "Επιλέξτε μια λειτουργία διαχωρισμού οθόνης",
"helpText": "Επιλέξτε πόσες καρτέλες θέλετε να δείτε ταυτόχρονα",
"success": "Ο διαχωρισμός οθόνης εφαρμόστηκε επιτυχώς",
"cleared": "Ο διαχωρισμός οθόνης εκκαθαρίστηκε",
"error": {
"noAssignments": "Παρακαλώ αντιστοιχίστε τουλάχιστον μία καρτέλα στη διάταξη",
"fillAllSlots": "Παρακαλώ συμπληρώστε όλα τα {{count}} slots πριν την εφαρμογή"
}
},
"homepage": {
"loggedInTitle": "Συνδεθήκατε!",
"loggedInMessage": "Είστε συνδεδεμένοι! Χρησιμοποιήστε την πλαϊνή μπάρα για να αποκτήσετε πρόσβαση σε όλα τα διαθέσιμα εργαλεία. Για να ξεκινήσετε, δημιουργήστε έναν υπολογιστή SSH στην καρτέλα SSH Manager. Μόλις δημιουργηθεί, μπορείτε να συνδεθείτε σε αυτόν τον κεντρικό υπολογιστή χρησιμοποιώντας τις άλλες εφαρμογές στην πλαϊνή μπάρα.",
"failedToLoadAlerts": "Αποτυχία φόρτωσης ειδοποιήσεων",
"failedToDismissAlert": "Αποτυχία απόρριψης ειδοποίησης"
},
"serverConfig": {
"title": "Ρύθμιση Παραμέτρων Διακομιστή",
"description": "Ρυθμίστε τη διεύθυνση URL του διακομιστή Termix για να συνδεθείτε με τις υπηρεσίες του συστήματος υποστήριξης",
"serverUrl": "Url Διακομιστή",
"enterServerUrl": "Παρακαλώ εισάγετε μια διεύθυνση URL διακομιστή",
"testConnectionFirst": "Παρακαλώ ελέγξτε πρώτα τη σύνδεση",
"connectionSuccess": "Επιτυχής σύνδεση!",
"connectionFailed": "Αποτυχία σύνδεσης",
"connectionError": "Παρουσιάστηκε σφάλμα σύνδεσης",
"connected": "Συνδεδεμένο",
"disconnected": "Αποσυνδέθηκε",
"configSaved": "Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς",
"saveFailed": "Αποτυχία αποθήκευσης των ρυθμίσεων",
"saveError": "Σφάλμα αποθήκευσης ρυθμίσεων",
"saving": "Αποθηκεύεται...",
"saveConfig": "Αποθήκευση Ρυθμίσεων",
"helpText": "Εισάγετε τη διεύθυνση URL όπου εκτελείται ο διακομιστής Termix (π.χ., http://localhost:30001 ή https://your-server.com)",
"warning": "Προειδοποίηση",
"notValidatedWarning": "Το URL δεν επικυρώθηκε - βεβαιωθείτε ότι είναι σωστό",
"changeServer": "Αλλαγή Διακομιστή",
"mustIncludeProtocol": "Η διεύθυνση URL του διακομιστή πρέπει να ξεκινά με http:// ή http://"
},
"versionCheck": {
"error": "Σφάλμα Ελέγχου Έκδοσης",
"checkFailed": "Αποτυχία ελέγχου για ενημερώσεις",
"upToDate": "Η εφαρμογή είναι μέχρι την ημερομηνία",
"currentVersion": "Εκτελείτε την έκδοση {{version}}",
"updateAvailable": "Διαθέσιμη Ενημέρωση",
"newVersionAvailable": "Μια νέα έκδοση είναι διαθέσιμη! Εκτελείτε {{current}}αλλά το {{latest}} είναι διαθέσιμο.",
"releasedOn": "Κυκλοφόρησε στο {{date}}",
"downloadUpdate": "Λήψη Ενημέρωσης",
"dismiss": "Απόρριψη",
"checking": "Έλεγχος για ενημερώσεις...",
"checkUpdates": "Έλεγχος για ενημερώσεις",
"checkingUpdates": "Έλεγχος για ενημερώσεις...",
"refresh": "Ανανέωση",
"updateRequired": "Απαιτείται Ενημέρωση",
"updateDismissed": "Η ενημέρωση απορρίφθηκε",
"noUpdatesFound": "Δεν βρέθηκαν ενημερώσεις"
},
"common": {
"close": "Κλείσιμο",
"minimize": "Minimize",
"online": "Συνδεδεμένος",
"offline": "Αποσυνδεδεμένος",
"continue": "Συνέχεια",
"maintenance": "Συντήρηση",
"degraded": "Μειώθηκε",
"discord": "Discord",
"error": "Σφάλμα",
"warning": "Προειδοποίηση",
"info": "Πληροφορίες",
"success": "Επιτυχία",
"loading": "Φόρτωση...",
"required": "Απαιτείται",
"optional": "Προαιρετικό",
"connect": "Σύνδεση",
"connecting": "Σύνδεση...",
"creating": "Δημιουργία...",
"clear": "Εκκαθάριση",
"toggleSidebar": "Εναλλαγή Πλευρικής Μπάρας",
"sidebar": "Sidebar",
"home": "Αρχική",
"expired": "Έληξε",
"expiresToday": "Λήγει σήμερα",
"expiresTomorrow": "Λήγει σε {{days}} ημέρες",
"updateAvailable": "Διαθέσιμη Ενημέρωση",
"sshPath": "Διαδρομή SSH",
"localPath": "Τοπική Διαδρομή",
"appName": "Termix",
"openInNewTab": "Άνοιγμα σε νέα καρτέλα",
"resetSidebarWidth": "Reset sidebar width",
"dragToResizeSidebar": "Σύρετε για αλλαγή μεγέθους πλαϊνής μπάρας",
"noAuthCredentials": "Δεν υπάρχουν διαθέσιμα διαπιστευτήρια ταυτοποίησης για αυτόν τον υπολογιστή SSH",
"noReleases": "Καμία Κυκλοφορία",
"updatesAndReleases": "Ενημερώσεις & Εκδόσεις",
"newVersionAvailable": "Μια νέα έκδοση ({{version}}) είναι διαθέσιμη.",
"failedToFetchUpdateInfo": "Αποτυχία λήψης πληροφοριών ενημέρωσης",
"preRelease": "Προ-έκδοση",
"loginFailed": "Αποτυχία σύνδεσης",
"noReleasesFound": "Δεν βρέθηκαν εκδόσεις.",
"yourBackupCodes": "Οι Αντίγραφοι Κωδικοί Σας",
"sendResetCode": "Αποστολή Κωδικού Επαναφοράς",
"verifyCode": "Επαλήθευση Κωδικού",
"resetPassword": "Επαναφορά Κωδικού Πρόσβασης",
"resetCode": "Reset Code",
"newPassword": "Νέος Κωδικός Πρόσβασης",
"folder": "Φάκελος",
"file": "Αρχείο",
"renamedSuccessfully": "μετονομάστηκε με επιτυχία",
"deletedSuccessfully": "διαγράφηκε επιτυχώς",
"noTunnelConnections": "Δεν έχουν ρυθμιστεί συνδέσεις διοχέτευσης",
"sshTools": "Εργαλεία SSH",
"english": "Αγγλικά",
"chinese": "Κινέζικα",
"german": "Γερμανικά",
"cancel": "Ακύρωση",
"username": "Όνομα Χρήστη",
"name": "Όνομα",
"login": "Είσοδος",
"logout": "Αποσύνδεση",
"register": "Εγγραφή",
"password": "Κωδικός",
"version": "Έκδοση",
"confirmPassword": "Επιβεβαίωση Κωδικού Πρόσβασης",
"back": "Πίσω",
"email": "E-mail",
"submit": "Υποβολή",
"change": "Αλλαγή",
"save": "Αποθήκευση",
"saving": "Αποθηκεύεται...",
"delete": "Διαγραφή",
"edit": "Επεξεργασία",
"add": "Προσθήκη",
"search": "Αναζήτηση",
"confirm": "Επιβεβαίωση",
"yes": "Ναι",
"no": "Όχι",
"ok": "Εντάξει",
"enabled": "Ενεργοποιημένο",
"disabled": "Απενεργοποιημένο",
"important": "Σημαντικό",
"notEnabled": "Μη Ενεργοποιημένο",
"settingUp": "Ρύθμιση...",
"next": "Επόμενο",
"previous": "Προηγούμενο",
"refresh": "Ανανέωση",
"settings": "Ρυθμίσεις",
"profile": "Προφίλ",
"help": "Βοήθεια",
"about": "Σχετικά",
"language": "Γλώσσα",
"autoDetect": "Αυτόματη Ανίχνευση",
"changeAccountPassword": "Αλλάξτε τον κωδικό του λογαριασμού σας",
"passwordResetTitle": "Επαναφορά Κωδικού Πρόσβασης",
"passwordResetDescription": "Πρόκειται να επαναφέρετε τον κωδικό πρόσβασής σας. Αυτό θα σας αποσυνδέσει από όλες τις ενεργές συνεδρίες.",
"enterSixDigitCode": "Εισάγετε τον 6ψήφιο κωδικό από τα αρχεία καταγραφής docker container για τον χρήστη:",
"enterNewPassword": "Εισάγετε τον νέο κωδικό πρόσβασης για το χρήστη:",
"passwordsDoNotMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν",
"passwordMinLength": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 6 χαρακτήρες",
"passwordResetSuccess": "Επιτυχής επαναφορά κωδικού πρόσβασης! Τώρα μπορείτε να συνδεθείτε με το νέο κωδικό πρόσβασης.",
"failedToInitiatePasswordReset": "Αποτυχία έναρξης επαναφοράς κωδικού πρόσβασης",
"failedToVerifyResetCode": "Αποτυχία επαλήθευσης κωδικού επαναφοράς",
"failedToCompletePasswordReset": "Αποτυχία ολοκλήρωσης της επαναφοράς κωδικού πρόσβασης",
"documentation": "Τεκμηρίωση",
"retry": "Επανάληψη",
"checking": "Έλεγχος...",
"checkingDatabase": "Έλεγχος σύνδεσης βάσης δεδομένων...",
"checkingAuthentication": "Έλεγχος ταυτοποίησης...",
"actions": "Ενέργειες",
"remove": "Αφαίρεση",
"revoke": "Revoke",
"create": "Δημιουργία",
"update": "Ενημέρωση"
},
"nav": {
"home": "Αρχική",
"hosts": "Υπολογιστές",
"credentials": "Διαπιστευτήρια",
"terminal": "Τερματικό",
"docker": "Προσάρτηση",
"tunnels": "Σηράγγες",
"fileManager": "Διαχειριστής Αρχείων",
"serverStats": "Στατιστικά Διακομιστή",
"admin": "Διαχειριστής",
"userProfile": "Προφίλ Χρήστη",
"tools": "Εργαλεία",
"snippets": "Δείγματα",
"newTab": "New Tab",
"splitScreen": "Διαίρεση Οθόνης",
"closeTab": "Κλείσιμο Καρτέλας",
"sshManager": "Διαχειριστής SSH",
"hostManager": "Διαχειριστής Υπολογιστών",
"cannotSplitTab": "Αδυναμία διαχωρισμού αυτής της καρτέλας",
"tabNavigation": "Tab Navigation",
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
"copyPassword": "Αντιγραφή Κωδικού Πρόσβασης",
"copySudoPassword": "Αντιγραφή Κωδικού Πρόσβασης Sudo",
"passwordCopied": "Ο κωδικός αντιγράφηκε στο πρόχειρο",
"sudoPasswordCopied": "Ο κωδικός Sudo αντιγράφηκε στο πρόχειρο",
"noPasswordAvailable": "Δεν υπάρχει διαθέσιμος κωδικός πρόσβασης"
},
"admin": {
"title": "Ρυθμίσεις Διαχειριστή",
"oidc": "OIDC",
"users": "Χρήστες",
"userManagement": "Διαχείριση Χρηστών",
"makeAdmin": "Δημιουργία Διαχειριστή",
"removeAdmin": "Αφαίρεση Διαχειριστή",
"deleteUser": "Διαγραφή χρήστη {{username}}? Αυτό δεν μπορεί να αναιρεθεί.",
"allowRegistration": "Επιτρέψτε Την Εγγραφή",
"oidcSettings": "Ρυθμίσεις OIDC",
"clientId": "Ταυτότητα Πελάτη",
"clientSecret": "Μυστικό Πελάτη",
"issuerUrl": "Url Εκδότη",
"authorizationUrl": "URL Εξουσιοδότησης",
"tokenUrl": "Token URL",
"updateSettings": "Ενημέρωση Ρυθμίσεων",
"confirmDelete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον χρήστη?",
"confirmMakeAdmin": "Είστε βέβαιοι ότι θέλετε να κάνετε {{username}} ένα διαχειριστή?",
"confirmRemoveAdmin": "Είστε βέβαιοι ότι θέλετε να καταργήσετε την κατάσταση διαχειριστή από το {{username}}?",
"externalAuthentication": "Εξωτερική Ταυτοποίηση (OIDC)",
"configureExternalProvider": "Ρυθμίστε τον πάροχο εξωτερικής ταυτότητας για έλεγχο ταυτότητας OIDC/OAuth2.",
"userIdentifierPath": "Διαδρομή Αναγνωριστικού Χρήστη",
"displayNamePath": "Εμφανιζόμενο Όνομα Διαδρομής",
"scopes": "Εμβέλεια",
"saving": "Αποθηκεύεται...",
"saveConfiguration": "Αποθήκευση Ρυθμίσεων",
"reset": "Reset",
"success": "Επιτυχία",
"loading": "Φόρτωση...",
"refresh": "Ανανέωση",
"loadingUsers": "Φόρτωση χρηστών...",
"username": "Όνομα Χρήστη",
"type": "Τύπος",
"actions": "Ενέργειες",
"external": "Εξωτερικό",
"local": "Τοπικό",
"adminManagement": "Διαχείριση Διαχειριστή",
"makeUserAdmin": "Δημιουργία Διαχειριστή Χρήστη",
"adding": "Προσθήκη...",
"currentAdmins": "Τρέχοντες Διαχειριστές",
"adminBadge": "Διαχειριστής",
"removeAdminButton": "Αφαίρεση Διαχειριστή",
"general": "Γενικά",
"userRegistration": "Εγγραφή Χρήστη",
"allowNewAccountRegistration": "Επιτρέψτε την εγγραφή νέου λογαριασμού",
"allowPasswordLogin": "Επίτρεψε όνομα χρήστη/κωδικό πρόσβασης",
"allowPasswordReset": "Επιτρέψτε την επαναφορά κωδικού πρόσβασης μέσω κωδικού επαναφοράς",
"missingRequiredFields": "Λείπουν υποχρεωτικά πεδία: {{fields}}",
"oidcConfigurationUpdated": "Οι ρυθμίσεις του OIDC ενημερώθηκαν επιτυχώς!",
"failedToFetchOidcConfig": "Αποτυχία ανάκτησης ρυθμίσεων OIDC",
"failedToFetchRegistrationStatus": "Αποτυχία λήψης κατάστασης εγγραφής",
"failedToFetchPasswordLoginStatus": "Αποτυχία ανάκτησης κατάστασης σύνδεσης κωδικού πρόσβασης",
"failedToFetchUsers": "Αποτυχία ανάκτησης χρηστών",
"oidcConfigurationDisabled": "Οι ρυθμίσεις OIDC απενεργοποιήθηκαν επιτυχώς!",
"failedToUpdateOidcConfig": "Αποτυχία ενημέρωσης παραμέτρων OIDC",
"failedToDisableOidcConfig": "Αποτυχία απενεργοποίησης ρύθμισης OIDC",
"enterUsernameToMakeAdmin": "Εισάγετε όνομα χρήστη για δημιουργία διαχειριστή",
"userIsNowAdmin": "Ο χρήστης {{username}} είναι τώρα διαχειριστής",
"failedToMakeUserAdmin": "Αποτυχία δημιουργίας διαχειριστή χρήστη",
"removeAdminStatus": "Κατάργηση κατάστασης διαχειριστή από το {{username}}?",
"adminStatusRemoved": "Η κατάσταση διαχειριστή αφαιρέθηκε από το {{username}}",
"failedToRemoveAdminStatus": "Αποτυχία κατάργησης κατάστασης διαχειριστή",
"userDeletedSuccessfully": "Ο χρήστης {{username}} διαγράφηκε επιτυχώς",
"failedToDeleteUser": "Αποτυχία διαγραφής χρήστη",
"overrideUserInfoUrl": "Παράκαμψη URL Πληροφοριών Χρήστη (δεν απαιτείται)",
"failedToFetchSessions": "Αποτυχία ανάκτησης συνεδριών",
"sessionRevokedSuccessfully": "Η συνεδρία ανακλήθηκε με επιτυχία",
"failedToRevokeSession": "Αποτυχία ανάκλησης συνεδρίας",
"confirmRevokeSession": "Είστε βέβαιοι ότι θέλετε να ανακαλέσετε αυτή τη συνεδρία?",
"confirmRevokeAllSessions": "Είστε βέβαιοι ότι θέλετε να ανακαλέσετε όλες τις συνεδρίες για αυτόν το χρήστη?",
"failedToRevokeSessions": "Αποτυχία ανάκλησης συνεδριών",
"sessionsRevokedSuccessfully": "Οι συνεδρίες ανακλήθηκαν με επιτυχία",
"linkToPasswordAccount": "Σύνδεσμος σε λογαριασμό κωδικού πρόσβασης",
"linkOIDCDialogTitle": "Σύνδεση λογαριασμού OIDC με κωδικό πρόσβασης",
"linkOIDCDialogDescription": "Σύνδεσμος {{username}} (OIDC user) σε υπάρχοντα λογαριασμό κωδικού. Αυτό θα ενεργοποιήσει τον διπλό έλεγχο ταυτότητας για το λογαριασμό κωδικού πρόσβασης.",
"createUser": "Δημιουργία Χρήστη",
"createUserDescription": "Δημιουργία νέου τοπικού χρήστη με όνομα χρήστη και κωδικό πρόσβασης",
"enterUsername": "Εισάγετε όνομα χρήστη",
"enterPassword": "Εισάγετε κωδικό πρόσβασης",
"userCreatedSuccessfully": "Ο χρήστης {{username}} δημιουργήθηκε με επιτυχία",
"failedToCreateUser": "Αποτυχία δημιουργίας χρήστη",
"manageUser": "Διαχείριση Χρήστη",
"manageUserDescription": "Διαχείριση ρυθμίσεων χρήστη, ρόλων και δικαιωμάτων",
"authType": "Τύπος Ταυτοποίησης",
"adminStatus": "Κατάσταση Διαχειριστή",
"userId": "Id Χρήστη",
"regularUser": "Κανονικός Χρήστης",
"adminPrivileges": "Δικαιώματα Διαχειριστή",
"administratorRole": "Ρόλος Διαχειριστή",
"administratorRoleDescription": "Παραχώρηση πλήρους πρόσβασης στο σύστημα και προνόμια διαχείρισης",
"passwordManagement": "Διαχείριση Κωδικών Πρόσβασης",
"passwordResetWarning": "Η επαναφορά του κωδικού πρόσβασης ενός χρήστη θα διαγράψει όλα τα δεδομένα του (SSH hosts, διαπιστευτήρια, ρυθμίσεις). Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"resetUserPassword": "Επαναφορά Κωδικού Πρόσβασης Χρήστη",
"resettingPassword": "Επανεγκατάσταση...",
"passwordResetInitiated": "Η επαναφορά κωδικού πρόσβασης ξεκίνησε για το {{username}}. Η επαναφορά κωδικού στάλθηκε.",
"failedToResetPassword": "Αποτυχία έναρξης επαναφοράς κωδικού πρόσβασης",
"sessionManagement": "Διαχείριση Συνεδρίας",
"revokeAllSessions": "Ανάκληση Όλων Των Συνεδριών",
"revokeAllSessionsDescription": "Εξαναγκασμός αποσύνδεσης από όλες τις συσκευές και συνεδρίες",
"revoking": "Ανάκληση...",
"revoke": "Ανάκληση Όλων",
"dangerZone": "Ζώνη Κίνδυνου",
"deleteUserTitle": "Διαγραφή Λογαριασμού Χρήστη",
"deleteUserWarning": "Μόνιμη διαγραφή αυτού του λογαριασμού χρήστη και όλων των συναφών δεδομένων. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"deleting": "Διαγραφή...",
"cannotDeleteSelf": "Δεν μπορείτε να διαγράψετε τον δικό σας λογαριασμό",
"cannotRemoveLastAdmin": "Αδυναμία αφαίρεσης του τελευταίου διαχειριστή",
"cannotRemoveOwnAdmin": "Δεν μπορείτε να καταργήσετε τα δικά σας δικαιώματα διαχειριστή",
"cannotModifyOwnAdminStatus": "Δεν μπορείτε να τροποποιήσετε τη δική σας κατάσταση διαχειριστή",
"dualAuth": "Διπλή Πιστοποίηση",
"externalOIDC": "Εξωτερικό (OIDC)",
"localPassword": "Τοπικός Κωδικός Πρόσβασης",
"confirmRevokeOwnSessions": "Είστε βέβαιοι ότι θέλετε να ανακαλέσετε όλες τις δικές σας συνεδρίες? Θα αποσυνδεθείτε.",
"linkOIDCWarningTitle": "Προειδοποίηση: Τα Δεδομένα Χρήστη OIDC Θα Διαγραφούν",
"linkOIDCActionDeleteUser": "Διαγραφή του λογαριασμού χρήστη OIDC και όλων των δεδομένων του",
"linkOIDCActionAddCapability": "Προσθήκη ικανότητας σύνδεσης OIDC στο λογαριασμό κωδικού πρόσβασης προορισμού",
"linkOIDCActionDualAuth": "Επιτρέψτε στο λογαριασμό κωδικού πρόσβασης να συνδεθεί και με κωδικό πρόσβασης και με OIDC",
"linkTargetUsernameLabel": "Όνομα Χρήστη Λογαριασμού Κωδικού Προορισμού",
"linkTargetUsernamePlaceholder": "Εισάγετε όνομα χρήστη του λογαριασμού κωδικού πρόσβασης",
"linkAccountsButton": "Σύνδεση Λογαριασμών",
"linkingAccounts": "Σύνδεση...",
"accountsLinkedSuccessfully": "Ο χρήστης OIDC {{oidcUsername}} έχει συνδεθεί με το {{targetUsername}}",
"failedToLinkAccounts": "Αποτυχία σύνδεσης λογαριασμών",
"linkTargetUsernameRequired": "Απαιτείται όνομα χρήστη προορισμού",
"unlinkOIDCTitle": "Αποσύνδεση Πιστοποίησης OIDC",
"unlinkOIDCDescription": "Κατάργηση ελέγχου ταυτότητας OIDC από {{username}}? Ο χρήστης θα είναι σε θέση να συνδεθεί με όνομα χρήστη/κωδικό μετά από αυτό.",
"unlinkOIDCSuccess": "Το OIDC αποσυνδέθηκε από το {{username}}",
"failedToUnlinkOIDC": "Αποτυχία αποσύνδεσης OIDC",
"databaseSecurity": "Ασφάλεια Βάσης Δεδομένων",
"encryptionStatus": "Κατάσταση Κρυπτογράφησης",
"encryptionEnabled": "Ενεργοποίηση Κρυπτογράφησης",
"enabled": "Ενεργοποιημένο",
"disabled": "Απενεργοποιημένο",
"keyId": "Αναγνωριστικό Κλειδιού",
"created": "Δημιουργήθηκε",
"migrationStatus": "Κατάσταση Μετανάστευσης",
"migrationCompleted": "Η μετεγκατάσταση ολοκληρώθηκε",
"migrationRequired": "Απαιτείται μετεγκατάσταση",
"deviceProtectedMasterKey": "Προστατευμένο Από Το Περιβάλλον Κύριο Κλειδί",
"legacyKeyStorage": "Παλαιού Τύπου Κλειδιού Αποθήκευσης",
"masterKeyEncryptedWithDeviceFingerprint": "Κύριο κλειδί κρυπτογραφημένο με περιβαλλοντικό αποτύπωμα (ενεργή προστασία KEK)",
"keyNotProtectedByDeviceBinding": "Κλειδί που δεν προστατεύεται από την περιβαλλοντική σύνδεση (συνιστάται αναβάθμιση)",
"valid": "Valid",
"initializeDatabaseEncryption": "Αρχικοποίηση Κρυπτογράφησης Βάσης Δεδομένων",
"enableAes256EncryptionWithDeviceBinding": "Ενεργοποίηση κρυπτογράφησης AES-256 με προστασία κυρίως του περιβάλλοντος. Αυτό δημιουργεί ασφάλεια για SSH κλειδιά, κωδικούς πρόσβασης και διακριτικά ελέγχου ταυτότητας.",
"featuresEnabled": "Χαρακτηριστικά ενεργοποιημένα:",
"aes256GcmAuthenticatedEncryption": "AES-256-GCM πιστοποιημένη κρυπτογράφηση",
"deviceFingerprintMasterKeyProtection": "Κύρια βασική προστασία δακτυλικών αποτυπωμάτων περιβάλλοντος (KEK)",
"pbkdf2KeyDerivation": "Βασική παραγωγή PBKDF2 με επαναλήψεις 100K",
"automaticKeyManagement": "Αυτόματη διαχείριση και περιστροφή πλήκτρων",
"initializing": "Προετοιμασία...",
"initializeEnterpriseEncryption": "Αρχικοποίηση Κρυπτογράφησης Επιχειρήσεων",
"migrateExistingData": "Μετεγκατάσταση Υφιστάμενων Δεδομένων",
"encryptExistingUnprotectedData": "Κρυπτογράφηση υπαρχόντων μη προστατευμένων δεδομένων στη βάση δεδομένων σας. Αυτή η διαδικασία είναι ασφαλής και δημιουργεί αυτόματα αντίγραφα ασφαλείας.",
"testMigrationDryRun": "Επαλήθευση Συμβατότητας Κρυπτογράφησης",
"migrating": "Μετανάστευση...",
"migrateData": "Μετεγκατάσταση Δεδομένων",
"securityInformation": "Πληροφορίες Ασφαλείας",
"sshPrivateKeysEncryptedWithAes256": "Τα SSH ιδιωτικά κλειδιά και οι κωδικοί πρόσβασης κρυπτογραφούνται με AES-256-GCM",
"userAuthTokensProtected": "Τα διακριτικά ελέγχου ταυτότητας χρήστη και τα μυστικά 2FA προστατεύονται",
"masterKeysProtectedByDeviceFingerprint": "Τα κύρια κλειδιά κρυπτογράφησης προστατεύονται από το δακτυλικό αποτύπωμα της συσκευής (KEK)",
"keysBoundToServerInstance": "Τα κλειδιά είναι συνδεδεμένα με το τρέχον περιβάλλον διακομιστή (μεταναστεύσιμα μέσω μεταβλητών περιβάλλοντος)",
"pbkdf2HkdfKeyDerivation": "PBKDF2 + HKDF βασικό παράγωγο με 100K επαναλήψεις",
"backwardCompatibleMigration": "Όλα τα δεδομένα παραμένουν προς τα πίσω συμβατά κατά τη μετάβαση",
"enterpriseGradeSecurityActive": "Ενεργή Ασφάλεια Επιχείρησης-Βαθμού",
"masterKeysProtectedByDeviceBinding": "Τα κύρια κλειδιά κρυπτογράφησης σας προστατεύονται από αποτυπώματα περιβάλλοντος. Αυτό χρησιμοποιεί όνομα κεντρικού υπολογιστή, διαδρομές και άλλες πληροφορίες περιβάλλοντος για τη δημιουργία κλειδιών προστασίας. Για να μεταφέρετε διακομιστές, ορίστε τη μεταβλητή περιβάλλοντος DB_ENCRYPTION_KEY στο νέο διακομιστή.",
"important": "Σημαντικό",
"keepEncryptionKeysSecure": "Εξασφαλίστε την ασφάλεια δεδομένων: τακτικά αντίγραφα ασφαλείας των αρχείων βάσης δεδομένων και της διαμόρφωσης του διακομιστή. Για να μεταφερθείτε σε ένα νέο διακομιστή, ορίστε τη μεταβλητή περιβάλλοντος DB_ENCRYPTION_KEY για το νέο περιβάλλον, ή διατηρήστε την ίδια δομή hostname και καταλόγου.",
"loadingEncryptionStatus": "Φόρτωση κατάστασης κρυπτογράφησης...",
"testMigrationDescription": "Επιβεβαιώστε ότι τα υπάρχοντα δεδομένα μπορούν να μεταφερθούν με ασφάλεια σε κρυπτογραφημένη μορφή χωρίς να τροποποιήσετε πραγματικά δεδομένα",
"serverMigrationGuide": "Οδηγός Μετανάστευσης Διακομιστή",
"migrationInstructions": "Για να μεταφέρετε κρυπτογραφημένα δεδομένα σε ένα νέο διακομιστή: 1) Αρχεία αντιγράφων ασφαλείας, 2) Ορισμός μεταβλητής περιβάλλοντος DB_ENCRYPTION_KEY=\"your-key\" σε νέο διακομιστή, 3) Επαναφορά αρχείων βάσης δεδομένων",
"environmentProtection": "Προστασία Περιβάλλοντος",
"environmentProtectionDesc": "Προστατεύει τα κλειδιά κρυπτογράφησης που βασίζονται σε πληροφορίες περιβάλλοντος εξυπηρετητή (όνομα κεντρικού υπολογιστή, διαδρομές κ.λπ.), μεταναστεύσιμο μέσω μεταβλητών περιβάλλοντος",
"verificationCompleted": "Η επαλήθευση συμβατότητας ολοκληρώθηκε - δεν άλλαξαν δεδομένα",
"verificationInProgress": "Η επαλήθευση ολοκληρώθηκε",
"dataMigrationCompleted": "Η μετανάστευση δεδομένων ολοκληρώθηκε επιτυχώς!",
"verificationFailed": "Αποτυχία επαλήθευσης συμβατότητας",
"migrationFailed": "Η μετανάστευση απέτυχε",
"runningVerification": "Εκτέλεση επαλήθευσης συμβατότητας...",
"startingMigration": "Έναρξη μετάβασης...",
"hardwareFingerprintSecurity": "Ασφάλεια Δακτυλικών Αποτυπωμάτων",
"hardwareBoundEncryption": "Ενεργή Κρυπτογράφηση Υλικού",
"masterKeysNowProtectedByHardwareFingerprint": "Τα κύρια πλήκτρα προστατεύονται τώρα με πραγματική λήψη δακτυλικών αποτυπωμάτων υλικού αντί για μεταβλητές περιβάλλοντος",
"cpuSerialNumberDetection": "Ανίχνευση σειριακού αριθμού CPU",
"motherboardUuidIdentification": "Μητρική κάρτα UUID αναγνωριστικό",
"diskSerialNumberVerification": "Επαλήθευση σειριακού αριθμού δίσκου",
"biosSerialNumberCheck": "Έλεγχος σειριακού αριθμού BIOS",
"stableMacAddressFiltering": "Φιλτράρισμα σταθερών διευθύνσεων MAC",
"databaseFileEncryption": "Κρυπτογράφηση Αρχείου Βάσης Δεδομένων",
"dualLayerProtection": "Προστασία Διπλής Στρώματος Ενεργή",
"bothFieldAndFileEncryptionActive": "Τόσο το επίπεδο του πεδίου όσο και το επίπεδο των αρχείων είναι τώρα ενεργά για τη μέγιστη ασφάλεια",
"fieldLevelAes256Encryption": "Κρυπτογράφηση AES-256 επιπέδου πεδίου για ευαίσθητα δεδομένα",
"fileLevelDatabaseEncryption": "Κρυπτογράφηση βάσης δεδομένων σε επίπεδο αρχείου με σύνδεση υλικού",
"hardwareBoundFileKeys": "Φυσικά κλειδιά κρυπτογράφησης αρχείων",
"automaticEncryptedBackups": "Αυτόματη κρυπτογραφημένη δημιουργία αντιγράφων ασφαλείας",
"createEncryptedBackup": "Δημιουργία Κρυπτογραφημένου Αντιγράφου Ασφαλείας",
"creatingBackup": "Δημιουργία Αντιγράφου Ασφαλείας...",
"backupCreated": "Δημιουργία Αντιγράφου Ασφαλείας",
"encryptedBackupCreatedSuccessfully": "Το κρυπτογραφημένο αντίγραφο ασφαλείας δημιουργήθηκε επιτυχώς",
"backupCreationFailed": "Αποτυχία δημιουργίας αντιγράφου ασφαλείας",
"databaseMigration": "Μεταφορά Βάσης Δεδομένων",
"exportForMigration": "Εξαγωγή για Μετανάστευση",
"exportDatabaseForHardwareMigration": "Εξαγωγή βάσης δεδομένων ως αρχείο SQLite με αποκρυπτογραφημένα δεδομένα για μετάβαση σε νέο υλικό",
"exportDatabase": "Export SQLite Database",
"exporting": "Εξαγωγή...",
"exportCreated": "SQLite Η Εξαγωγή Δημιουργήθηκε",
"exportContainsDecryptedData": "Η εξαγωγή SQLite περιέχει αποκρυπτογραφημένα δεδομένα - κρατήστε ασφαλής!",
"databaseExportedSuccessfully": "Η βάση δεδομένων SQLite εξήχθη επιτυχώς",
"databaseExportFailed": "Η εξαγωγή βάσης δεδομένων SQLite απέτυχε",
"importFromMigration": "Εισαγωγή από μετεγκατάσταση",
"importDatabaseFromAnotherSystem": "Εισαγωγή βάσης δεδομένων SQLite από άλλο σύστημα ή υλικό",
"importDatabase": "Import SQLite Database",
"importing": "Εισαγωγή...",
"selectedFile": "Επιλεγμένο Αρχείο SQLite",
"importWillReplaceExistingData": "Η εισαγωγή SQLite θα αντικαταστήσει τα υπάρχοντα δεδομένα - συνιστάται η δημιουργία αντιγράφου ασφαλείας!",
"pleaseSelectImportFile": "Παρακαλώ επιλέξτε ένα αρχείο εισαγωγής SQLite",
"databaseImportedSuccessfully": "SQLite βάση δεδομένων εισήχθη με επιτυχία",
"databaseImportFailed": "Η εισαγωγή βάσης δεδομένων SQLite απέτυχε",
"manageEncryptionAndBackups": "Διαχείριση κλειδιών κρυπτογράφησης, ασφάλειας βάσης δεδομένων και λειτουργιών αντιγράφων ασφαλείας",
"activeSecurityFeatures": "Επί του παρόντος ενεργά μέτρα ασφαλείας και προστασίες",
"deviceBindingTechnology": "Προηγμένη τεχνολογία βασισμένη στο υλικό βασική προστασία",
"backupAndRecovery": "Ασφαλείς επιλογές δημιουργίας αντιγράφων ασφαλείας και ανάκτησης βάσης δεδομένων",
"crossSystemDataTransfer": "Εξαγωγή και εισαγωγή βάσεων δεδομένων σε διαφορετικά συστήματα",
"noMigrationNeeded": "Δεν απαιτείται μετεγκατάσταση",
"encryptionKey": "Κλειδί Κρυπτογράφησης",
"keyProtection": "Προστασία Κλειδιού",
"active": "Ενεργό",
"legacy": "Παλαιού τύπου",
"dataStatus": "Κατάσταση Δεδομένων",
"encrypted": "Κρυπτογραφημένο",
"needsMigration": "Χρειάζεται Μετανάστευση",
"ready": "Έτοιμο",
"initializeEncryption": "Αρχικοποίηση Κρυπτογράφησης",
"initialize": "Αρχικοποίηση",
"test": "Δοκιμή",
"migrate": "Μετεγκατάσταση",
"backup": "Αντίγραφα Ασφαλείας",
"createBackup": "Δημιουργία Αντιγράφου Ασφαλείας",
"exportImport": "Εξαγωγή/Εισαγωγή",
"export": "Εξαγωγή",
"import": "Εισαγωγή",
"passwordRequired": "Απαιτείται κωδικός πρόσβασης",
"confirmExport": "Επιβεβαίωση Εξαγωγής",
"exportDescription": "Εξαγωγή SSH hosts και διαπιστευτηρίων ως αρχείο SQLite",
"importDescription": "Εισαγωγή αρχείου SQLite με στοιχειώδη συγχώνευση (παράλειψη διπλότυπων)",
"criticalWarning": "Κρίσιμη Προειδοποίηση",
"cannotDisablePasswordLoginWithoutOIDC": "Δεν μπορείτε να απενεργοποιήσετε τη σύνδεση με κωδικό πρόσβασης χωρίς OIDC ρυθμισμένη! Πρέπει να ρυθμίσετε τον έλεγχο ταυτότητας OIDC πριν απενεργοποιήσετε την σύνδεση κωδικού πρόσβασης, αλλιώς θα χάσετε την πρόσβαση στο Termix.",
"confirmDisablePasswordLogin": "Are you sure you want to disable password login? Βεβαιωθείτε ότι το OIDC έχει ρυθμιστεί σωστά και λειτουργεί πριν προχωρήσετε, αλλιώς θα χάσετε την πρόσβαση στην παρουσία σας στο Termix.",
"passwordLoginDisabled": "Ο κωδικός πρόσβασης απενεργοποιήθηκε επιτυχώς",
"passwordLoginAndRegistrationDisabled": "Κωδικός σύνδεσης και νέα εγγραφή λογαριασμού απενεργοποιήθηκε με επιτυχία",
"requiresPasswordLogin": "Απαιτεί σύνδεση κωδικού πρόσβασης ενεργοποιημένη",
"passwordLoginDisabledWarning": "Ο κωδικός πρόσβασης είναι απενεργοποιημένος. Βεβαιωθείτε ότι το OIDC είναι σωστά ρυθμισμένο, αλλιώς δεν θα μπορείτε να συνδεθείτε στο Termix.",
"oidcRequiredWarning": "CRITICAL: Η σύνδεση με τον κωδικό πρόσβασης είναι απενεργοποιημένη. Αν επαναφέρετε ή ρυθμίσετε εσφαλμένα το OIDC, θα χάσετε όλη την πρόσβαση στο Termix και θα βγάλετε την παρουσία σας. Να προχωρήσετε μόνο αν είστε απολύτως σίγουροι.",
"confirmDisableOIDCWarning": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Πρόκειται να απενεργοποιήσετε το OIDC ενώ ο κωδικός πρόσβασης είναι επίσης απενεργοποιημένος. Αυτό θα τούβλο Termix παράδειγμα σας και θα χάσετε όλη την πρόσβαση. Είστε απολύτως σίγουροι ότι θέλετε να προχωρήσετε?",
"failedToUpdatePasswordLoginStatus": "Αποτυχία ενημέρωσης κατάστασης σύνδεσης κωδικού πρόσβασης",
"loadingSessions": "Φόρτωση συνεδριών...",
"noActiveSessions": "Δεν βρέθηκαν ενεργές συνεδρίες.",
"device": "Συσκευή",
"user": "Χρήστης",
"lastActive": "Τελευταία Ενεργή",
"expires": "Λήγει",
"revoked": "Revoked",
"revokeAllUserSessionsTitle": "Ανάκληση όλων των συνεδριών για αυτόν το χρήστη",
"revokeAll": "Ανάκληση Όλων",
"linkOidcToPasswordAccount": "Σύνδεση λογαριασμού OIDC με κωδικό πρόσβασης",
"linkOidcToPasswordAccountDescription": "Σύνδεσμος {{username}} (OIDC user) σε υπάρχοντα λογαριασμό κωδικού. Αυτό θα ενεργοποιήσει τον διπλό έλεγχο ταυτότητας για το λογαριασμό κωδικού πρόσβασης.",
"linkOidcWarningTitle": "Προειδοποίηση: Τα Δεδομένα Χρήστη OIDC Θα Διαγραφούν",
"linkOidcWarningDescription": "Αυτή η ενέργεια θα:",
"linkOidcActionDeleteUser": "Διαγραφή του λογαριασμού χρήστη OIDC και όλων των δεδομένων του",
"linkOidcActionAddCapability": "Προσθήκη ικανότητας σύνδεσης OIDC στο λογαριασμό κωδικού πρόσβασης προορισμού",
"linkOidcActionDualAuth": "Επιτρέψτε στο λογαριασμό κωδικού πρόσβασης να συνδεθεί και με κωδικό πρόσβασης και με OIDC",
"passwordMinLength": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 6 χαρακτήρες",
"currentRoles": "Τρέχοντες Ρόλοι",
"noRolesAssigned": "Δεν έχουν ανατεθεί ρόλοι",
"assignNewRole": "Εκχώρηση Νέου Ρόλου"
},
"hosts": {
"title": "Διαχειριστής Υπολογιστών",
"sshHosts": "SSH Hosts",
"noHosts": "Δεν Υπάρχουν Υπολογιστές SSH",
"noHostsMessage": "Δεν έχετε προσθέσει ακόμα κανένα SSH hosts. Κάντε κλικ στο κουμπί \"Προσθήκη Host\" για να ξεκινήσετε.",
"loadingHosts": "Φόρτωση κεντρικών υπολογιστών...",
"failedToLoadHosts": "Αποτυχία φόρτωσης υπολογιστών",
"retry": "Επανάληψη",
"refresh": "Ανανέωση",
"optional": "Προαιρετικό",
"hostsCount": "{{count}} κεντρικοί υπολογιστές",
"importJson": "Εισαγωγή JSON",
"importing": "Εισαγωγή...",
"importJsonTitle": "Εισαγωγή SSH Hosts από JSON",
"importJsonDesc": "Ανεβάστε ένα αρχείο JSON για μαζική εισαγωγή πολλαπλών υπολογιστών SSH (max 100).",
"downloadSample": "Λήψη Δείγματος",
"formatGuide": "Οδηγός Μορφής",
"exportCredentialWarning": "Προειδοποίηση: Ο υπολογιστής \"{{name}}\" χρησιμοποιεί έλεγχο ταυτότητας διαπιστευτηρίων. Το εξαγόμενο αρχείο δεν θα περιλαμβάνει τα δεδομένα διαπιστευτηρίων και θα πρέπει να αναδιαμορφωθεί χειροκίνητα μετά την εισαγωγή. Θέλετε να συνεχίσετε?",
"exportSensitiveDataWarning": "Προειδοποίηση: Ο υπολογιστής \"{{name}}\" περιέχει ευαίσθητα δεδομένα ελέγχου ταυτότητας (κωδικός πρόσβασης/SSH κλειδί). Το εξαγόμενο αρχείο θα περιλαμβάνει αυτά τα δεδομένα στο plaintext. Παρακαλώ κρατήστε το αρχείο ασφαλές και διαγράψτε το μετά τη χρήση. Θέλετε να συνεχίσετε?",
"uncategorized": "Αταξινόμητο",
"confirmDelete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε \"{{name}}\" ?",
"failedToDeleteHost": "Αποτυχία διαγραφής κεντρικού υπολογιστή",
"failedToExportHost": "Αποτυχία εξαγωγής κεντρικού υπολογιστή. Παρακαλώ βεβαιωθείτε ότι είστε συνδεδεμένοι και έχετε πρόσβαση στα δεδομένα του κεντρικού υπολογιστή.",
"jsonMustContainHosts": "Η JSON πρέπει να περιέχει μια συστοιχία \"hosts\" ή να είναι μια σειρά από υπολογιστές",
"noHostsInJson": "Δεν βρέθηκαν υπολογιστές στο αρχείο JSON",
"maxHostsAllowed": "Μέγιστο επιτρεπόμενο 100 hosts ανά εισαγωγή",
"importCompleted": "Η εισαγωγή ολοκληρώθηκε: {{success}} επιτυχής, {{failed}} απέτυχε",
"importFailed": "Η εισαγωγή απέτυχε",
"importError": "Σφάλμα εισαγωγής",
"failedToImportJson": "Αποτυχία εισαγωγής αρχείου JSON",
"connectionDetails": "Λεπτομέρειες Σύνδεσης",
"organization": "Οργανισμός",
"ipAddress": "Διεύθυνση IP",
"port": "Θύρα",
"name": "Όνομα",
"username": "Όνομα Χρήστη",
"folder": "Φάκελος",
"tags": "Ετικέτες",
"pin": "Καρφίτσα",
"notes": "Σημειώσεις",
"expirationDate": "Ημερομηνία Λήξης",
"passwordRequired": "Απαιτείται κωδικός πρόσβασης κατά τη χρήση ταυτοποίησης κωδικού",
"sshKeyRequired": "Το Ιδιωτικό Κλειδί SSH απαιτείται όταν χρησιμοποιείται έλεγχος ταυτότητας κλειδιού",
"keyTypeRequired": "Ο τύπος κλειδιού απαιτείται όταν χρησιμοποιείτε έλεγχο ταυτότητας κλειδιού",
"mustSelectValidSshConfig": "Πρέπει να επιλέξετε μια έγκυρη διαμόρφωση SSH από τη λίστα",
"addHost": "Προσθήκη Διακομιστή",
"editHost": "Επεξεργασία Υπολογιστή",
"cloneHost": "Κλωνοποίηση Υπολογιστή",
"updateHost": "Διακομιστής Ενημέρωσης",
"hostUpdatedSuccessfully": "Ο οικοδεσπότης \"{{name}}\" ενημερώθηκε επιτυχώς!",
"hostAddedSuccessfully": "Host \"{{name}}\" προστέθηκε με επιτυχία!",
"hostDeletedSuccessfully": "Host \"{{name}}\" διαγράφηκε με επιτυχία!",
"failedToSaveHost": "Απέτυχε η αποθήκευση του κεντρικού υπολογιστή. Παρακαλώ προσπαθήστε ξανά.",
"savingHost": "Αποθήκευση κεντρικού υπολογιστή...",
"updatingHost": "Ενημέρωση κεντρικού υπολογιστή...",
"cloningHost": "Κλωνοποίηση κεντρικού υπολογιστή...",
"enableTerminal": "Ενεργοποίηση Τερματικού",
"enableTerminalDesc": "Ενεργοποίηση/απενεργοποίηση ορατότητας κεντρικού υπολογιστή στην καρτέλα Τερματικό",
"enableTunnel": "Ενεργοποίηση Tunnel",
"enableTunnelDesc": "Ενεργοποίηση/απενεργοποίηση ορατότητας κεντρικού υπολογιστή στην καρτέλα Tunnel",
"enableFileManager": "Ενεργοποίηση Διαχειριστή Αρχείων",
"enableFileManagerDesc": "Ενεργοποίηση/απενεργοποίηση ορατότητας κεντρικού υπολογιστή στην καρτέλα Διαχειριστής αρχείων",
"enableDockerDesc": "Ενεργοποίηση/απενεργοποίηση ορατότητας κεντρικού υπολογιστή στην καρτέλα Docker",
"enableDocker": "Ενεργοποίηση Docker",
"defaultPath": "Προεπιλεγμένη Διαδρομή",
"defaultPathDesc": "Προεπιλεγμένος κατάλογος κατά το άνοιγμα του διαχειριστή αρχείων για αυτόν τον κεντρικό υπολογιστή",
"tunnelConnections": "Συνδέσεις Tunnel",
"connection": "Σύνδεση",
"remove": "Αφαίρεση",
"sourcePort": "Θύρα Πηγής",
"sourcePortDesc": " (Η πηγή αναφέρεται στις τρέχουσες λεπτομέρειες σύνδεσης στην καρτέλα Γενικά)",
"endpointPort": "Θύρα Τελικού Σημείου",
"endpointSshConfig": "Ρύθμιση Τελικού Σημείου SSH",
"tunnelForwardDescription": "Αυτή η σήραγγα θα προωθήσει την κυκλοφορία από το λιμάνι {{sourcePort}} στο πηγαίο μηχάνημα (τρέχουσες λεπτομέρειες σύνδεσης γενικά στην καρτέλα) στη θύρα {{endpointPort}} στη μηχανή τελικού σημείου.",
"maxRetries": "Μέγιστες Επαναλήψεις",
"maxRetriesDescription": "Μέγιστος αριθμός προσπαθειών επανάληψης για σύνδεση με σήραγγα.",
"retryInterval": "Διάστημα Επανάληψη (δευτερόλεπτα)",
"retryIntervalDescription": "Χρόνος αναμονής μεταξύ προσπαθειών επανάληψης.",
"autoStartContainer": "Αυτόματη εκκίνηση στο Container",
"autoStartDesc": "Αυτόματη εκκίνηση αυτής της σήραγγας όταν εκκινήσει ο περιέκτης",
"addConnection": "Προσθήκη Σύνδεσης Tunnel",
"tunnelType": "Τύπος Tunnel",
"tunnelTypeLocal": "Τοπικό (-L)",
"tunnelTypeRemote": "Απομακρυσμένο (-R)",
"tunnelTypeLocalDesc": "Προώθηση τοπικής θύρας για απομακρυσμένο τελικό σημείο",
"tunnelTypeRemoteDesc": "Προώθηση απομακρυσμένης θύρας στον τοπικό υπολογιστή",
"tunnelForwardDescriptionLocal": "Αυτή η σήραγγα θα προωθήσει την κυκλοφορία από το τοπικό λιμάνι {{sourcePort}} στο λιμάνι {{endpointPort}} στο μηχάνημα τελικού σημείου.",
"tunnelForwardDescriptionRemote": "Αυτή η σήραγγα θα προωθήσει την κυκλοφορία από το λιμάνι {{sourcePort}} στο πηγαίο μηχάνημα (τρέχουσες λεπτομέρειες σύνδεσης γενικά στην καρτέλα) στη θύρα {{endpointPort}} στη μηχανή τελικού σημείου.",
"sshpassRequired": "Απαιτείται Sshpass Για Πιστοποίηση Κωδικού Πρόσβασης",
"sshpassRequiredDesc": "Για τον έλεγχο ταυτότητας κωδικού πρόσβασης σε σήραγγες, το sshpass πρέπει να εγκατασταθεί στο σύστημα.",
"otherInstallMethods": "Άλλες μέθοδοι εγκατάστασης:",
"debianUbuntuEquivalent": "(Debian/Ubuntu) ή το ισοδύναμο για το λειτουργικό σας σύστημα.",
"or": "ή",
"centosRhelFedora": "CentOS/RHEL/Fedora",
"macos": "macOS",
"windows": "Παράθυρα (WSL, χωρίς επίσημο δυαδικό)",
"sshServerConfigRequired": "Απαιτείται Ρύθμιση Του Ssh Server",
"sshServerConfigDesc": "Για συνδέσεις με σήραγγα, ο διακομιστής SSH πρέπει να ρυθμιστεί ώστε να επιτρέπει την προώθηση θύρας:",
"gatewayPortsYes": "σύνδεση απομακρυσμένων θυρών σε όλες τις διεπαφές",
"allowTcpForwardingYes": "για να ενεργοποιήσετε την προώθηση θυρών",
"permitRootLoginYes": "αν χρησιμοποιείτε χρήστη root για tunneling",
"editSshConfig": "Επεξεργασία του αρχείου ρυθμίσεων SSH:",
"sshConfigPath": "/etc/ssh/sshd_config",
"restartSshService": "Στη συνέχεια, επανεκκινήστε την υπηρεσία SSH:",
"restartSshCommand": "sudo systemctl επανεκκίνηση sshd",
"upload": "Ανέβασμα",
"authentication": "Ταυτοποίηση",
"password": "Κωδικός",
"key": "Κλειδί",
"credential": "Διαπιστευτήριο",
"none": "Κανένα",
"selectCredential": "Επιλέξτε Διαπιστευτήρια",
"selectCredentialPlaceholder": "Επιλέξτε ένα πιστοποιητικό...",
"credentialRequired": "Απαιτείται διαπιστευτήριο όταν χρησιμοποιείται έλεγχος ταυτότητας διαπιστευτηρίων",
"credentialDescription": "Επιλέγοντας ένα διαπιστευτήριο θα αντικαταστήσει το τρέχον όνομα χρήστη και θα χρησιμοποιήσει τα στοιχεία ελέγχου ταυτότητας του διαπιστευτηρίου.",
"cannotChangeAuthAsSharedUser": "Αδυναμία αλλαγής ταυτοποίησης ως κοινόχρηστος χρήστης",
"sshPrivateKey": "Ιδιωτικό Κλειδί SSH",
"keyPassword": "Κωδικός Πρόσβασης Κλειδιού",
"keyType": "Τύπος Κλειδιού",
"autoDetect": "Αυτόματη Ανίχνευση",
"rsa": "RSA",
"ed25519": "ED25519",
"ecdsaNistP256": "ECDSA NIST P-256",
"ecdsaNistP384": "ECDSA NIST P- 384",
"ecdsaNistP521": "ECDSA NIST P-521",
"dsa": "DSA",
"rsaSha2256": "RSA SHA2-256",
"rsaSha2512": "RSA SHA2-512",
"uploadFile": "Μεταφόρτωση Αρχείου",
"pasteKey": "Πλήκτρο Επικόλλησης",
"updateKey": "Ενημέρωση Κλειδιού",
"existingKey": "Υπάρχον κλειδί (κλικ για αλλαγή)",
"existingCredential": "Υπάρχοντα διαπιστευτήρια (κλικ για αλλαγή)",
"addTagsSpaceToAdd": "προσθήκη ετικετών (χώρος για προσθήκη)",
"terminalBadge": "Τερματικό",
"tunnelBadge": "Σήραγγα",
"fileManagerBadge": "Διαχειριστής Αρχείων",
"general": "Γενικά",
"terminal": "Τερματικό",
"tunnel": "Σήραγγα",
"fileManager": "Διαχειριστής Αρχείων",
"serverStats": "Στατιστικά Διακομιστή",
"hostViewer": "Προβολέας Υπολογιστή",
"enableServerStats": "Ενεργοποίηση Στατιστικών Διακομιστή",
"enableServerStatsDesc": "Ενεργοποίηση/απενεργοποίηση συλλογής στατιστικών του διακομιστή για αυτόν τον υπολογιστή",
"displayItems": "Εμφάνιση Αντικειμένων",
"displayItemsDesc": "Επιλέξτε ποιες μετρήσεις θα εμφανίζονται στη σελίδα στατιστικών του διακομιστή",
"enableCpu": "Χρήση CPU",
"enableMemory": "Χρήση Μνήμης",
"enableDisk": "Χρήση Δίσκου",
"enableNetwork": "Στατιστικά Δικτύου (Σύντομα)",
"enableProcesses": "Αριθμός Διεργασιών (Σύντομα)",
"enableUptime": "Χρόνος Λειτουργίας (Σύντομα)",
"enableHostname": "Όνομα Υπολογιστή (Σύντομα)",
"enableOs": "Λειτουργικό Σύστημα (Σύντομα)",
"customCommands": "Προσαρμοσμένες Εντολές (Σύντομα)",
"customCommandsDesc": "Ορίστε προσαρμοσμένες εντολές τερματισμού λειτουργίας και επανεκκίνησης για αυτόν τον διακομιστή",
"shutdownCommand": "Εντολή Τερματισμού",
"rebootCommand": "Επανεκκίνηση Εντολής",
"confirmRemoveFromFolder": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το \"{{name}}\" από το φάκελο \"{{folder}}\"? Ο κεντρικός υπολογιστής θα μετακινηθεί σε \"Χωρίς Φάκελο\".",
"removedFromFolder": "Host \"{{name}}\" αφαιρέθηκε επιτυχώς από το φάκελο",
"failedToRemoveFromFolder": "Αποτυχία κατάργησης κεντρικού υπολογιστή από το φάκελο",
"folderRenamed": "Φάκελος \"{{oldName}}\" μετονομάστηκε σε \"{{newName}}\" επιτυχώς",
"failedToRenameFolder": "Αποτυχία μετονομασίας φακέλου",
"editFolderAppearance": "Επεξεργασία Εμφάνισης Φακέλου",
"editFolderAppearanceDesc": "Προσαρμόστε το χρώμα και το εικονίδιο για το φάκελο",
"folderColor": "Χρώμα Φακέλου",
"folderIcon": "Εικονίδιο Φακέλου",
"preview": "Προεπισκόπηση",
"folderAppearanceUpdated": "Η εμφάνιση του φακέλου ενημερώθηκε με επιτυχία",
"failedToUpdateFolderAppearance": "Αποτυχία ενημέρωσης του φακέλου εμφάνισης",
"deleteAllHostsInFolder": "Διαγραφή όλων των κεντρικών υπολογιστών στο φάκελο",
"confirmDeleteAllHostsInFolder": "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα {{count}} hosts στο φάκελο \"{{folder}}\"? Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"allHostsInFolderDeleted": "Διαγράφηκαν με επιτυχία οι {{count}} hosts από τον φάκελο \"{{folder}}\"",
"failedToDeleteHostsInFolder": "Αποτυχία διαγραφής υπολογιστών στο φάκελο",
"movedToFolder": "Host \"{{name}}\" μετακινήθηκε στο \"{{folder}}\" με επιτυχία",
"failedToMoveToFolder": "Αποτυχία μετακίνησης κεντρικού υπολογιστή στο φάκελο",
"clickToRenameFolder": "Κλικ για μετονομασία φακέλου",
"renameFolder": "Μετονομασία φακέλου",
"removeFromFolder": "Αφαίρεση από τον φάκελο \"{{folder}}\"",
"editHostTooltip": "Επεξεργασία κεντρικού υπολογιστή",
"deleteHostTooltip": "Διαγραφή κεντρικού υπολογιστή",
"exportHostTooltip": "Εξαγωγή κεντρικού υπολογιστή",
"cloneHostTooltip": "Κλωνοποίηση κεντρικού υπολογιστή",
"clickToEditHost": "Κλικ για επεξεργασία κεντρικού υπολογιστή",
"dragToMoveBetweenFolders": "Σύρετε για μετακίνηση μεταξύ φακέλων",
"exportedHostConfig": "Εξαγόμενη διαμόρφωση κεντρικού υπολογιστή για το {{name}}",
"openTerminal": "Άνοιγμα Τερματικού",
"openFileManager": "Άνοιγμα Διαχειριστή Αρχείων",
"openTunnels": "Άνοιγμα Σηράγγων",
"openServerDetails": "Άνοιγμα Λεπτομερειών Διακομιστή",
"statistics": "Στατιστικά",
"enabledWidgets": "Ενεργοποιημένα Widgets",
"openServerStats": "Άνοιγμα Στατιστικών Διακομιστή",
"enabledWidgetsDesc": "Επιλέξτε ποια γραφικά στοιχεία θα εμφανίζονται για αυτόν τον υπολογιστή",
"monitoringConfiguration": "Παραμετροποίηση Παραμέτρων",
"monitoringConfigurationDesc": "Ρυθμίστε πόσο συχνά ελέγχονται τα στατιστικά στοιχεία και η κατάσταση του διακομιστή",
"statusCheckEnabled": "Ενεργοποίηση Παρακολούθησης Κατάστασης",
"statusCheckEnabledDesc": "Ελέγξτε αν ο διακομιστής είναι συνδεδεμένος ή εκτός σύνδεσης",
"statusCheckInterval": "Διάστημα Ελέγχου Κατάστασης",
"statusCheckIntervalDesc": "Πόσο συχνά πρέπει να ελέγξετε αν ο οικοδεσπότης είναι σε απευθείας σύνδεση (5s - 1h)",
"metricsEnabled": "Ενεργοποίηση Παρακολούθησης Μετρήσεων",
"metricsEnabledDesc": "Συλλογή CPU, RAM, δίσκου και άλλων στατιστικών συστημάτων",
"metricsInterval": "Διάστημα Συλλογής Μετρήσεων",
"metricsIntervalDesc": "Πόσο συχνά συλλέγουν στατιστικά στοιχεία διακομιστή (5s - 1h)",
"intervalSeconds": "δευτερόλεπτα",
"intervalMinutes": "λεπτά",
"intervalValidation": "Τα διαστήματα παρακολούθησης πρέπει να είναι μεταξύ 5 και 1 ώρα (3600 δευτερόλεπτα)",
"monitoringDisabled": "Η παρακολούθηση του διακομιστή είναι απενεργοποιημένη για αυτόν τον υπολογιστή",
"enableMonitoring": "Ενεργοποίηση παρακολούθησης στο Host Manager → Στατιστική καρτέλα",
"monitoringDisabledBadge": "Παρακολούθηση Ανενεργή",
"statusMonitoring": "Κατάσταση",
"metricsMonitoring": "Μετρικές",
"terminalCustomization": "Προσαρμογή Τερματικού",
"appearance": "Εμφάνιση",
"behavior": "Συμπεριφορά",
"advanced": "Προχωρημένα",
"themePreview": "Προεπισκόπηση Θέματος",
"theme": "Θέμα",
"selectTheme": "Επιλογή θέματος",
"chooseColorTheme": "Επιλέξτε ένα χρωματικό θέμα για το τερματικό",
"fontFamily": "Οικογένεια Γραμματοσειρών",
"selectFont": "Select font",
"selectFontDesc": "Επιλέξτε τη γραμματοσειρά που θα χρησιμοποιηθεί στο τερματικό",
"fontSize": "Font Size",
"fontSizeValue": "Μέγεθος γραμματοσειράς: {{value}}px",
"adjustFontSize": "Προσαρμογή μεγέθους γραμματοσειράς τερματικού",
"letterSpacing": "Διάστημα Γραμμάτων",
"letterSpacingValue": "Απόσταση γραμμάτων: {{value}}px",
"adjustLetterSpacing": "Προσαρμογή διαστήματος μεταξύ χαρακτήρων",
"lineHeight": "Ύψος Γραμμής",
"lineHeightValue": "Ύψος Γραμμής: {{value}}",
"adjustLineHeight": "Προσαρμογή διαστήματος μεταξύ γραμμών",
"cursorStyle": "Στυλ Δρομέα",
"selectCursorStyle": "Επιλέξτε στυλ δρομέα",
"cursorStyleBlock": "Αποκλεισμός",
"cursorStyleUnderline": "Υπογράμμιση",
"cursorStyleBar": "Μπάρα",
"chooseCursorAppearance": "Επιλέξτε την εμφάνιση του δρομέα",
"cursorBlink": "Αναβόσβημα Δρομέα",
"enableCursorBlink": "Ενεργοποίηση εφέ αναβοσβήσματος δρομέα",
"scrollbackBuffer": "Προσωρινή Μνήμη Κύλισης",
"scrollbackBufferValue": "Ενδιάμεσο buffer κύλισης προς τα πίσω: {{value}} γραμμές",
"scrollbackBufferDesc": "Αριθμός γραμμών προς διατήρηση στο ιστορικό κύλισης",
"bellStyle": "Στυλ Κουδουνιού",
"selectBellStyle": "Επιλέξτε στυλ κουδουνιού",
"bellStyleNone": "Κανένα",
"bellStyleSound": "Ήχος",
"bellStyleVisual": "Οπτική",
"bellStyleBoth": "Αμφότερα",
"bellStyleDesc": "Πώς να χειριστείτε το κουδούνι τερματικού (χαρακτήρας BEL, \\x07). Τα προγράμματα ενεργοποιούν αυτό κατά την ολοκλήρωση εργασιών, την αντιμετώπιση σφαλμάτων, ή για ειδοποιήσεις. \"Ήχος\" παίζει ένα ηχητικό μπιπ, \"Visual\" αναβοσβήνει την οθόνη εν συντομία, \"Both\" κάνει και τα δύο, \"Κανένα\" απενεργοποιεί ειδοποιήσεις καμπάνα.",
"rightClickSelectsWord": "Δεξί Κλικ Επιλέγει Λέξη",
"rightClickSelectsWordDesc": "Κάνοντας δεξί κλικ επιλέγεται η λέξη κάτω από το δρομέα",
"fastScrollModifier": "Τροποποιητής Γρήγορης Κύλισης",
"selectModifier": "Επιλογή τροποποιητή",
"modifierAlt": "Alt",
"modifierCtrl": "Ctrl",
"modifierShift": "Shift",
"fastScrollModifierDesc": "Πλήκτρο τροποποιητή για γρήγορη κύλιση",
"fastScrollSensitivity": "Ευαισθησία Γρήγορης Κύλισης",
"fastScrollSensitivityValue": "Ευαισθησία γρήγορης κύλισης: {{value}}",
"fastScrollSensitivityDesc": "Πολλαπλασιαστής ταχύτητας κύλισης όταν κρατιέται ο τροποποιητής",
"minimumContrastRatio": "Ελάχιστη Αναλογία Αντίθεσης",
"minimumContrastRatioValue": "Ελάχιστος λόγος αντίθεσης: {{value}}",
"minimumContrastRatioDesc": "Αυτόματη ρύθμιση χρωμάτων για καλύτερη αναγνωσιμότητα",
"sshAgentForwarding": "Προώθηση SSH Πράκτορα",
"sshAgentForwardingDesc": "Προώθηση SSH πράκτορα ελέγχου ταυτότητας σε απομακρυσμένο διακομιστή",
"backspaceMode": "Λειτουργία Backspace",
"selectBackspaceMode": "Επιλέξτε λειτουργία backspace",
"backspaceModeNormal": "Κανονική (DEL)",
"backspaceModeControlH": "Έλεγχος-H (^H)",
"backspaceModeDesc": "Συμπεριφορά πλήκτρου Backspace για συμβατότητα",
"startupSnippet": "Δείγμα Εκκίνησης",
"selectSnippet": "Επιλογή αποσπάσματος",
"searchSnippets": "Αναζήτηση αποσπασμάτων ...",
"snippetNone": "Κανένα",
"noneAuthTitle": "Πληκτρολόγιο-Διαδραστική Ταυτοποίηση",
"noneAuthDescription": "Αυτή η μέθοδος ταυτοποίησης θα χρησιμοποιεί τον διαδραστικό έλεγχο ταυτότητας πληκτρολογίου κατά τη σύνδεση με τον διακομιστή SSH.",
"noneAuthDetails": "Ο διαδραστικός έλεγχος ταυτότητας πληκτρολογίου επιτρέπει στο διακομιστή να σας ζητά διαπιστευτήρια κατά τη διάρκεια της σύνδεσης. Αυτό είναι χρήσιμο για διακομιστές που απαιτούν έλεγχο ταυτότητας πολλαπλών παραγόντων ή αν δεν θέλετε να αποθηκεύσετε τα διαπιστευτήρια τοπικά.",
"forceKeyboardInteractive": "Εξαναγκασμός Keyboard-Interactive",
"forceKeyboardInteractiveDesc": "Δυνάμει της χρήσης διαδραστικού ελέγχου ταυτότητας πληκτρολογίου. Αυτό μερικές φορές απαιτείται για διακομιστές που χρησιμοποιούν έλεγχο ταυτότητας δύο παραγόντων (TOTP/2FA).",
"overrideCredentialUsername": "Παράκαμψη Ονόματος Διαπιστευτηρίου Χρήστη",
"overrideCredentialUsernameDesc": "Χρησιμοποιήστε ένα διαφορετικό όνομα χρήστη από αυτό που είναι αποθηκευμένο στα διαπιστευτήρια. Αυτό σας επιτρέπει να χρησιμοποιήσετε τα ίδια διαπιστευτήρια με διαφορετικά ονόματα χρηστών.",
"jumpHosts": "Μετάβαση Υπολογιστές",
"jumpHostsDescription": "Jump hosts (επίσης γνωστή ως προμαχώνας hosts) σας επιτρέπουν να συνδεθείτε σε ένα διακομιστή στόχου μέσω ενός ή περισσότερων ενδιάμεσων διακομιστών. Αυτό είναι χρήσιμο για την πρόσβαση σε διακομιστές πίσω από τείχη προστασίας ή σε ιδιωτικά δίκτυα.",
"jumpHostChain": "Αλυσίδα Άλματος",
"addJumpHost": "Προσθήκη Διακομιστή Άλματος",
"selectServer": "Επιλογή Διακομιστή",
"searchServers": "Αναζήτηση διακομιστών...",
"noServerFound": "Δεν βρέθηκε διακομιστής",
"jumpHostsOrder": "Συνδέσεις θα γίνουν με τη σειρά: Άλμα οικοδεσπότη 1 → Μετάβαση Host 2 → → Στόχος διακομιστή",
"socks5Proxy": "Διακομιστής Μεσολάβησης SOCKS5",
"socks5Description": "Ρύθμιση διαμεσολαβητή SOCKS5 για τη σύνδεση SSH. Όλη η κίνηση θα δρομολογηθεί μέσω του καθορισμένου διακομιστή μεσολάβησης.",
"enableSocks5": "Ενεργοποίηση Διακομιστή Μεσολάβησης SOCKS5",
"enableSocks5Description": "Χρήση του διακομιστή μεσολάβησης SOCKS5 για αυτήν τη σύνδεση SSH",
"socks5Host": "Διακομιστής Μεσολάβησης",
"socks5Port": "Θύρα Διαμεσολαβητή",
"socks5Username": "Όνομα Χρήστη Διακομιστή Μεσολάβησης",
"socks5Password": "Κωδικός Διακομιστή Μεσολάβησης",
"socks5UsernameOptional": "Προαιρετικό: αφήστε κενό αν ο διαμεσολαβητής δεν απαιτεί έλεγχο ταυτότητας",
"socks5PasswordOptional": "Προαιρετικό: αφήστε κενό αν ο διαμεσολαβητής δεν απαιτεί έλεγχο ταυτότητας",
"socks5ProxyChain": "Αλυσίδα Διαμεσολαβητή",
"socks5ProxyChainDescription": "Ρυθμίστε μια αλυσίδα των διαμεσολαβητών SOCKS. Κάθε διαμεσολαβητής στην αλυσίδα θα συνδεθεί μέσω του προηγούμενου.",
"socks5ProxyMode": "Λειτουργία Διαμεσολαβητή",
"socks5UseSingleProxy": "Χρήση Ενιαίου Διακομιστή Μεσολάβησης",
"socks5UseProxyChain": "Χρήση Αλυσίδας Διαμεσολαβητή",
"socks5UsePreset": "Χρήση Αποθηκευμένης Προεπιλογής",
"socks5SelectPreset": "Επιλογή Προεπιλογής",
"socks5ManagePresets": "Διαχείριση Προεπιλογών",
"socks5ProxyNode": "Διαμεσολαβητής {{number}}",
"socks5AddProxy": "Προσθήκη διακομιστή μεσολάβησης στην αλυσίδα",
"socks5RemoveProxy": "Αφαίρεση Διακομιστή Μεσολάβησης",
"socks5ProxyType": "Τύπος Διαμεσολαβητή",
"socks5SaveAsPreset": "Αποθήκευση ως προεπιλογή",
"socks5SavePresetTitle": "Αποθήκευση της αλυσίδας μεσολάβησης ως προεπιλογή",
"socks5SavePresetDescription": "Αποθήκευση της τρέχουσας διαμεσολαβητικής αλυσίδας ρυθμίσεων ως επαναχρησιμοποιήσιμη προκαθορισμένη",
"socks5PresetName": "Προκαθορισμένο Όνομα",
"socks5PresetDescription": "Περιγραφή (προαιρετικό)",
"socks5PresetCreated": "Δημιουργήθηκε προεπιλογή αλυσίδας διακομιστή μεσολάβησης",
"socks5PresetUpdated": "Ενημέρωση προκαθορισμένης αλυσίδας διακομιστή μεσολάβησης",
"socks5PresetDeleted": "Η προκαθορισμένη προκαθορισμένη αλυσίδα διακομιστή μεσολάβησης διαγράφηκε",
"socks5PresetSaved": "Η προκαθορισμένη ρύθμιση \"{{name}}\" αποθηκεύτηκε επιτυχώς",
"socks5PresetSaveError": "Αποτυχία αποθήκευσης προεπιλογής",
"socks5PresetNameRequired": "Απαιτείται προκαθορισμένο όνομα",
"socks5EmptyChainError": "Αδυναμία αποθήκευσης μιας κενής αλυσίδας διαμεσολαβητή",
"socks5ProxyChainEmpty": "Προσθήκη τουλάχιστον ενός διακομιστή μεσολάβησης στην αλυσίδα",
"socks5HostDescription": "Όνομα κεντρικού υπολογιστή ή διεύθυνση IP του διακομιστή μεσολάβησης SOCKS",
"socks5PortDescription": "Αριθμός θύρας του διακομιστή μεσολάβησης SOCKS (προεπιλογή: 1080)",
"addProxyNode": "Προσθήκη Κόμβου Διαμεσολαβητή",
"noProxyNodes": "Δεν έχουν ρυθμιστεί κόμβοι διαμεσολαβητή. Κάντε κλικ στο κουμπί 'Προσθήκη κόμβου μεσολάβησης' για να προσθέσετε ένα.",
"proxyNode": "Κόμβος Διαμεσολαβητή",
"proxyType": "Τύπος Διαμεσολαβητή",
"quickActions": "Γρήγορες Ενέργειες",
"quickActionsDescription": "Οι γρήγορες ενέργειες σας επιτρέπουν να δημιουργήσετε προσαρμοσμένα κουμπιά που εκτελούν SSH αποσπάσματα σε αυτόν το διακομιστή. Αυτά τα κουμπιά θα εμφανίζονται στην κορυφή της σελίδας Στατιστικά διακομιστή για γρήγορη πρόσβαση.",
"quickActionsList": "Λίστα Γρήγορων Ενεργειών",
"addQuickAction": "Προσθήκη Γρήγορης Ενέργειας",
"quickActionName": "Όνομα ενέργειας",
"noSnippetFound": "Δεν βρέθηκε απόσπασμα",
"quickActionsOrder": "Τα κουμπιά γρήγορης δράσης θα εμφανίζονται με τη σειρά που αναφέρεται παραπάνω στη σελίδα Στατιστικά Διακομιστή",
"sidebarCustomization": "Προσαρμογή Κουμπιού Πλευρικής Μπάρας",
"sidebarCustomizationDesc": "Επιλέξτε ποιες ενέργειες εμφανίζονται ως γρήγορα κουμπιά στην πλαϊνή μπάρα. Οι ενέργειες που δεν εμφανίζονται ως κουμπιά θα εμφανιστούν στο αναπτυσσόμενο μενού.",
"showTerminalInSidebar": "Εμφάνιση Κουμπιού Τερματικού",
"showTerminalInSidebarDesc": "Εμφάνιση τερματικού ως γρήγορο κουμπί στην πλαϊνή μπάρα",
"showFileManagerInSidebar": "Εμφάνιση Κουμπιού Διαχειριστή Αρχείων",
"showFileManagerInSidebarDesc": "Εμφάνιση του διαχειριστή αρχείων ως γρήγορο κουμπί στην πλαϊνή μπάρα",
"showTunnelInSidebar": "Εμφάνιση Κουμπιού Tunnel",
"showTunnelInSidebarDesc": "Εμφάνιση διαχείρισης σήραγγας ως ένα γρήγορο κουμπί στην πλευρική μπάρα",
"showDockerInSidebar": "Εμφάνιση Κουμπιού Προσάρτησης",
"showDockerInSidebarDesc": "Εμφάνιση διαχείρισης docker ως γρήγορο κουμπί στην πλαϊνή μπάρα",
"showServerStatsInSidebar": "Εμφάνιση Κουμπιού Στατιστικών Διακομιστή",
"showServerStatsInSidebarDesc": "Εμφάνιση στατιστικών διακομιστή ως γρήγορο κουμπί στην πλαϊνή μπάρα",
"atLeastOneActionRequired": "Τουλάχιστον μία ενεργοποιημένη ενέργεια πρέπει να εμφανίζεται στην πλαϊνή μπάρα",
"advancedAuthSettings": "Προηγμένες Ρυθμίσεις Ταυτοποίησης",
"sudoPasswordAutoFill": "Αυτόματη Συμπλήρωση Κωδικού Πρόσβασης Sudo",
"sudoPasswordAutoFillDesc": "Αυτόματη προσφορά για εισαγωγή κωδικού πρόσβασης SSH όταν το σχετικό αίτημα για κωδικό πρόσβασης",
"sudoPassword": "Κωδικός Πρόσβασης Sudo",
"sudoPasswordDesc": "Προαιρετικός κωδικός πρόσβασης για εντολές sudo (χρήσιμο με έλεγχο ταυτότητας κλειδιών)",
"socks4": "SOCKS4",
"socks5": "SOCKS5",
"executeSnippetOnConnect": "Εκτέλεση ενός αποσπάσματος όταν συνδεθεί το τερματικό",
"autoMosh": "Αυτόματο-MOSH",
"autoMoshDesc": "Αυτόματη εκτέλεση της εντολής MOSH κατά τη σύνδεση",
"moshCommand": "Διοίκηση MOSH",
"moshCommandDesc": "Η εντολή MOSH για εκτέλεση",
"environmentVariables": "Μεταβλητές Περιβάλλοντος",
"environmentVariablesDesc": "Ορίστε προσαρμοσμένες μεταβλητές περιβάλλοντος για τη συνεδρία τερματικού",
"variableName": "Όνομα μεταβλητής",
"variableValue": "Τιμή",
"addVariable": "Προσθήκη Μεταβλητής",
"docker": "Προσάρτηση",
"openDocker": "Άνοιγμα Προσάρτησης",
"copyFullScreenUrl": "Αντιγραφή URL Πλήρους Οθόνης",
"fullScreenUrlCopied": "Το URL πλήρους οθόνης αντιγράφηκε στο πρόχειρο",
"failedToCopyUrl": "Αποτυχία αντιγραφής URL στο πρόχειρο",
"copyTerminalUrl": "Αντιγραφή URL Τερματικού",
"copyFileManagerUrl": "Αντιγραφή URL Διαχειριστή Αρχείων",
"copyTunnelUrl": "Αντιγραφή Διεύθυνσης Tunnel",
"copyServerStatsUrl": "Αντιγραφή Url Στατιστικών Διακομιστή",
"copyDockerUrl": "Αντιγραφή URL Προσάρτησης",
"fullScreenUrlTooltip": "Αντιγράψτε το URL για να ανοίξετε αυτήν την εφαρμογή σε πλήρη οθόνη",
"notEnabled": "Το Docker δεν είναι ενεργοποιημένο για αυτόν τον υπολογιστή. Ενεργοποιήστε το στις ρυθμίσεις κεντρικού υπολογιστή για να χρησιμοποιήσετε τα χαρακτηριστικά Docker.",
"validating": "Επικύρωση Docker...",
"error": "Σφάλμα",
"errorCode": "Κωδικός σφάλματος: {{code}}",
"version": "Docker v{{version}}",
"current": "Τρέχων",
"used_limit": "Χρησιμοποιείται / Όριο",
"percentage": "Ποσοστό",
"input": "Input",
"output": "Έξοδος",
"read": "Ανάγνωση",
"write": "Εγγραφή",
"pids": "PID",
"id": "ID",
"state": "Κατάσταση",
"console": "Κονσόλα",
"containerMustBeRunning": "Ο περιέκτης πρέπει να εκτελείται για να συνδεθεί στην κονσόλα",
"authenticationRequired": "Απαιτείται πιστοποίηση",
"connectedTo": "Συνδεδεμένο με {{containerName}}",
"disconnected": "Αποσυνδέθηκε",
"consoleError": "Σφάλμα κονσόλας",
"errorMessage": "Σφάλμα: {{message}}",
"failedToConnect": "Αποτυχία σύνδεσης στην κονσόλα",
"disconnectedFromContainer": "Αποσυνδέθηκε από την κονσόλα του περιέκτη.",
"containerNotRunning": "Ο περιέκτης δεν εκτελείται",
"startContainerToAccess": "Εκκίνηση του περιέκτη για πρόσβαση στην κονσόλα",
"selectShell": "Επιλογή κελύφους",
"bash": "Bash",
"sh": "Sh",
"ash": "Τέφρα",
"connecting": "Σύνδεση...",
"connect": "Σύνδεση",
"disconnect": "Αποσύνδεση",
"notConnected": "Δεν συνδέθηκε",
"clickToConnect": "Κάντε κλικ στο κουμπί Σύνδεση για να ξεκινήσετε ένα διαδραστικό κέλυφος",
"connectingTo": "Σύνδεση με {{containerName}}...",
"containerMustBeRunningToViewStats": "Το δοχείο πρέπει να εκτελείται για να δείτε τα στατιστικά",
"failedToFetchStats": "Αποτυχία λήψης στατιστικών",
"noContainersFound": "Δεν βρέθηκαν εμπορευματοκιβώτια",
"noContainersFoundHint": "Ξεκινήστε δημιουργώντας εμπορευματοκιβώτια στο διακομιστή σας",
"searchPlaceholder": "Αναζήτηση με όνομα, εικόνα ή ID...",
"filterByStatusPlaceholder": "Φιλτράρισμα ανά κατάσταση",
"allContainersCount": "Όλα ({{count}})",
"statusCount": "{{status}} ({{count}})",
"noContainersMatchFilters": "Κανένα δοχείο δεν ταιριάζει με τα φίλτρα σας",
"noContainersMatchFiltersHint": "Δοκιμάστε να προσαρμόσετε την αναζήτηση ή το φίλτρο",
"containerStarted": "Το κοντέινερ {{name}} ξεκίνησε",
"failedToStartContainer": "Αποτυχία εκκίνησης κοντέινερ: {{error}}",
"containerStopped": "Το κοντέινερ {{name}} σταμάτησε",
"failedToStopContainer": "Αποτυχία διακοπής κοντέινερ: {{error}}",
"containerRestarted": "Container {{name}} επανεκκινήθηκε",
"failedToRestartContainer": "Αποτυχία επανεκκίνησης κοντέινερ: {{error}}",
"containerUnpaused": "Container {{name}} unpaused",
"containerPaused": "Το κοντέινερ {{name}} τέθηκε σε παύση",
"failedToTogglePauseContainer": "Απέτυχε το {{action}} container: {{error}}",
"containerRemoved": "Το κοντέινερ {{name}} αφαιρέθηκε",
"failedToRemoveContainer": "Αποτυχία κατάργησης κοντέινερ: {{error}}",
"image": "Εικόνα:",
"idLabel": "ID:",
"ports": "Θύρες",
"noPorts": "Κανένα",
"created": "Δημιουργήθηκε:",
"start": "Έναρξη",
"stop": "Διακοπή",
"unpause": "Unpause",
"pause": "Παύση",
"restart": "Επανεκκίνηση",
"removeContainer": "Αφαίρεση Περιέκτη",
"confirmRemoveContainer": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε το δοχείο \"{{name}}\"?",
"runningContainerWarning": "Προειδοποίηση: Αυτό το κοντέινερ εκτελείται αυτή τη στιγμή και θα αφαιρεθεί με δύναμη.",
"removing": "Κατάργηση:",
"containerNotFound": "Ο περιέκτης δεν βρέθηκε",
"backToList": "Επιστροφή στη λίστα",
"logs": "Καταγραφή",
"stats": "Στατιστικά",
"consoleTab": "Κονσόλα",
"failedToFetchLogs": "Αποτυχία ανάκτησης αρχείων καταγραφής: {{error}}",
"failedToDownloadLogs": "Απέτυχε η λήψη των αρχείων καταγραφής: {{error}}",
"linesToShow": "Γραμμές για εμφάνιση",
"last50Lines": "Τελευταίες 50 γραμμές",
"last100Lines": "Τελευταίες 100 γραμμές",
"last500Lines": "Τελευταίες 500 γραμμές",
"last1000Lines": "Τελευταίες 1000 γραμμές",
"allLogs": "Όλα τα αρχεία καταγραφής",
"showTimestamps": "Εμφάνιση Χρονοσημάνσεων",
"autoRefresh": "Αυτόματη Ανανέωση",
"filterLogsPlaceholder": "Φιλτράρισμα αρχείων καταγραφής...",
"noLogsAvailable": "Δεν υπάρχουν διαθέσιμα αρχεία καταγραφής"
},
"terminal": {
"title": "Τερματικό",
"connect": "Σύνδεση στον εξυπηρετητή",
"disconnect": "Αποσύνδεση",
"clear": "Εκκαθάριση",
"copy": "Αντιγραφή",
"paste": "Επικόλληση",
"find": "Εύρεση",
"fullscreen": "Πλήρης Οθόνη",
"splitHorizontal": "Οριζόντιος Διαχωρισμός",
"splitVertical": "Κάθετος Διαχωρισμός",
"closePanel": "Κλείσιμο Πίνακα",
"reconnect": "Επανασύνδεση",
"sessionEnded": "Η Συνεδρία Έληξε",
"connectionLost": "Η Σύνδεση Χάθηκε",
"error": "ΣΦΑΛΜΑ: {{message}}",
"disconnected": "Αποσυνδέθηκε",
"connectionClosed": "Η σύνδεση έκλεισε",
"connectionError": "Σφάλμα σύνδεσης: {{message}}",
"connected": "Συνδεδεμένο",
"sshConnected": "Η σύνδεση SSH δημιουργήθηκε",
"authError": "Η πιστοποίηση απέτυχε: {{message}}",
"unknownError": "Προέκυψε άγνωστο σφάλμα",
"messageParseError": "Αποτυχία ανάλυσης μηνύματος διακομιστή",
"websocketError": "Σφάλμα σύνδεσης WebSocket",
"connecting": "Σύνδεση...",
"reconnecting": "Επανασύνδεση... ({{attempt}}/{{max}})",
"reconnected": "Επιτυχής επανασύνδεση",
"maxReconnectAttemptsReached": "Επιτεύχθηκαν μέγιστες προσπάθειες επανασύνδεσης",
"connectionTimeout": "Χρονικό όριο σύνδεσης",
"terminalTitle": "Τερματικό - {{host}}",
"terminalWithPath": "Τερματικό - {{host}}:{{path}}",
"runTitle": "Εκτέλεση {{command}} - {{host}}",
"totpRequired": "Απαιτείται Έλεγχος Ταυτότητας Δύο Παραγόντων",
"totpCodeLabel": "Κωδικός Επαλήθευσης",
"totpPlaceholder": "000000",
"totpVerify": "Επαλήθευση",
"warpgateAuthRequired": "Απαιτείται Πιστοποίηση Warpgate",
"warpgateSecurityKey": "Κλειδί Ασφαλείας",
"warpgateAuthUrl": "URL Ταυτοποίησης",
"warpgateOpenBrowser": "Άνοιγμα σε περιηγητή",
"warpgateContinue": "Έχω Ολοκληρώσει την Πιστοποίηση",
"warpgateTimeout": "Λήξη χρονικού ορίου ταυτοποίησης. Παρακαλώ επανασύνδεση.",
"sudoPasswordPopupTitle": "Εισαγωγή Κωδικού Πρόσβασης?",
"sudoPasswordPopupHint": "Πατήστε Enter για εισαγωγή, Esc για απόρριψη",
"sudoPasswordPopupConfirm": "Insert",
"sudoPasswordPopupDismiss": "Απόρριψη",
"websocketAbnormalClose": "Η σύνδεση έκλεισε απροσδόκητα. Αυτό μπορεί να οφείλεται σε πρόβλημα αντίστροφης διαμεσολάβησης ή ρύθμισης SSL. Παρακαλώ ελέγξτε τα αρχεία καταγραφής διακομιστή.",
"totpInvalid": "Μη έγκυρος κωδικός. Παρακαλώ προσπαθήστε ξανά.",
"authMethodFallback": "Αποτυχία ταυτοποίησης {{method}} . Προσπάθεια εναλλακτικής μεθόδου...",
"authenticationRequired": "Απαιτείται πιστοποίηση",
"connectionLogTitle": "Αρχείο Καταγραφής Σύνδεσης",
"connectionLogCopy": "Αντιγραφή αρχείων καταγραφής στο πρόχειρο",
"connectionLogClear": "Εκκαθάριση αρχείων καταγραφής",
"connectionLogEmpty": "Δεν υπάρχουν αρχεία καταγραφής σύνδεσης ακόμα",
"connectionLogConnecting": "Σύνδεση στον υπολογιστή...",
"connectionLogCopied": "Η σύνδεση καταγραφής αντιγράφηκε στο πρόχειρο",
"connectionLogCopyFailed": "Αποτυχία αντιγραφής αρχείων καταγραφής στο πρόχειρο",
"allAuthMethodsFailed": "Όλες οι μέθοδοι ταυτοποίησης απέτυχαν. Παρακαλώ ελέγξτε τα στοιχεία σας.",
"methodNotSupported": "Ο διακομιστής δεν υποστηρίζει έλεγχο ταυτότητας {{method}} Διαθέσιμες μεθόδους: {{available}}",
"retryWithMethod": "Επανάληψη με {{method}}",
"automaticFallback": "Αυτόματη προσπάθεια ελέγχου ταυτότητας {{method}}...",
"totpTimeout": "Λήξη χρονικού ορίου επαλήθευσης TOTP. Επανασύνδεση.",
"passwordTimeout": "Λήξη χρονικού ορίου επαλήθευσης κωδικού πρόσβασης. Επανασύνδεση.",
"connectionRejected": "Η σύνδεση απορρίφθηκε από το διακομιστή. Παρακαλώ ελέγξτε τον έλεγχο ταυτότητας και τις ρυθμίσεις δικτύου."
},
"fileManager": {
"title": "Διαχειριστής Αρχείων",
"file": "Αρχείο",
"folder": "Φάκελος",
"connectToSsh": "Συνδεθείτε στο SSH για να χρησιμοποιήσετε λειτουργίες αρχείων",
"uploadFile": "Μεταφόρτωση Αρχείου",
"downloadFile": "Λήψη",
"extractArchive": "Εξαγωγή Αρχειοθήκης",
"extractingArchive": "Εξαγωγή {{name}}...",
"archiveExtractedSuccessfully": "Το {{name}} εξήχθη επιτυχώς",
"extractFailed": "Η εξαγωγή απέτυχε",
"compressFile": "Συμπίεση Αρχείου",
"compressFiles": "Συμπίεση Αρχείων",
"compressFilesDesc": "Συμπίεση {{count}} αντικειμένων σε μια αρχειοθήκη",
"archiveName": "Όνομα Αρχειοθέτησης",
"enterArchiveName": "Εισάγετε όνομα αρχειοθήκης...",
"compressionFormat": "Μορφή Συμπίεσης",
"selectedFiles": "Επιλεγμένα αρχεία",
"andMoreFiles": "και {{count}} περισσότερα...",
"compress": "Συμπίεση",
"compressingFiles": "Συμπίεση {{count}} αντικειμένων σε {{name}}...",
"filesCompressedSuccessfully": "Το {{name}} δημιουργήθηκε με επιτυχία",
"compressFailed": "Η συμπίεση απέτυχε",
"edit": "Επεξεργασία",
"preview": "Προεπισκόπηση",
"previous": "Προηγούμενο",
"next": "Επόμενο",
"pageXOfY": "Σελίδα {{current}} του {{total}}",
"zoomOut": "Σμίκρυνση",
"zoomIn": "Μεγέθυνση",
"newFile": "Νέο Αρχείο",
"newFolder": "Νέος Φάκελος",
"rename": "Μετονομασία",
"renameItem": "Μετονομασία Αντικειμένου",
"deleteItem": "Διαγραφή Αντικειμένου",
"currentPath": "Τρέχουσα Διαδρομή",
"uploadFileTitle": "Μεταφόρτωση Αρχείου",
"maxFileSize": "Μέγιστο: 1GB (JSON) / 5GB (Binary) - Μεγάλα αρχεία που υποστηρίζονται",
"removeFile": "Αφαίρεση Αρχείου",
"clickToSelectFile": "Κάντε κλικ για να επιλέξετε ένα αρχείο",
"chooseFile": "Επιλογή Αρχείου",
"uploading": "Μεταφόρτωση...",
"downloading": "Λήψη...",
"uploadingFile": "Μεταφόρτωση {{name}}...",
"uploadingLargeFile": "Μεταφόρτωση μεγάλου αρχείου {{name}} ({{size}})...",
"downloadingFile": "Λήψη {{name}}...",
"creatingFile": "Δημιουργία {{name}}...",
"creatingFolder": "Δημιουργία {{name}}...",
"deletingItem": "Διαγραφή {{type}} {{name}}...",
"renamingItem": "Μετονομασία {{type}} {{oldName}} σε {{newName}}...",
"createNewFile": "Δημιουργία Νέου Αρχείου",
"fileName": "Όνομα Αρχείου",
"creating": "Δημιουργία...",
"createFile": "Δημιουργία Αρχείου",
"createNewFolder": "Δημιουργία Νέου Φακέλου",
"folderName": "Όνομα Φακέλου",
"createFolder": "Δημιουργία Φακέλου",
"warningCannotUndo": "Προειδοποίηση: Αυτή η ενέργεια δεν μπορεί να αναιρεθεί",
"itemPath": "Διαδρομή Αντικειμένου",
"thisIsDirectory": "Αυτός είναι ένας κατάλογος (θα διαγραφεί αναδρομικά)",
"deleting": "Διαγραφή...",
"currentPathLabel": "Τρέχουσα Διαδρομή",
"newName": "Νέο Όνομα",
"thisIsDirectoryRename": "Αυτός είναι ένας κατάλογος",
"renaming": "Μετονομασία...",
"fileUploadedSuccessfully": "Αρχείο \"{{name}}\" μεταφορτώθηκε επιτυχώς",
"failedToUploadFile": "Αποτυχία μεταφόρτωσης αρχείου",
"fileDownloadedSuccessfully": "Αρχείο \"{{name}}\" κατεβασμένο επιτυχώς",
"failedToDownloadFile": "Αποτυχία λήψης αρχείου",
"noFileContent": "Δεν ελήφθη περιεχόμενο αρχείου",
"filePath": "Διαδρομή Αρχείου",
"fileCreatedSuccessfully": "Αρχείο \"{{name}}\" δημιουργήθηκε με επιτυχία",
"failedToCreateFile": "Αποτυχία δημιουργίας αρχείου",
"folderCreatedSuccessfully": "Ο φάκελος \"{{name}}\" δημιουργήθηκε με επιτυχία",
"failedToCreateFolder": "Αποτυχία δημιουργίας φακέλου",
"failedToCreateItem": "Αποτυχία δημιουργίας στοιχείου",
"operationFailed": "{{operation}} λειτουργία απέτυχε για {{name}}: {{error}}",
"failedToResolveSymlink": "Αποτυχία επίλυσης συντόμευσης",
"itemDeletedSuccessfully": "Το {{type}} διαγράφηκε επιτυχώς",
"itemsDeletedSuccessfully": "{{count}} στοιχεία διαγράφηκαν με επιτυχία",
"failedToDeleteItems": "Αποτυχία διαγραφής στοιχείων",
"sudoPasswordRequired": "Απαιτείται Κωδικός Διαχειριστή",
"enterSudoPassword": "Εισάγετε sudo password για να συνεχίσετε αυτή τη λειτουργία",
"sudoPassword": "Κωδικός πρόσβασης Sudo",
"sudoOperationFailed": "Η επιχείρηση Sudo απέτυχε",
"sudoAuthFailed": "Ο έλεγχος ταυτότητας Sudo απέτυχε",
"deleteOperation": "Διαγραφή αρχείων/φακέλων",
"dragFilesToUpload": "Αποθέστε αρχεία εδώ για μεταφόρτωση",
"emptyFolder": "Αυτός ο φάκελος είναι κενός",
"itemCount": "{{count}} στοιχεία",
"selectedCount": "επιλεγμένο {{count}}",
"searchFiles": "Αναζήτηση αρχείων...",
"upload": "Ανέβασμα",
"selectHostToStart": "Επιλέξτε έναν εξυπηρετητή για να ξεκινήσετε τη διαχείριση αρχείων",
"failedToConnect": "Αποτυχία σύνδεσης στο SSH",
"failedToLoadDirectory": "Αποτυχία φόρτωσης φακέλου",
"noSSHConnection": "Δεν υπάρχει διαθέσιμη σύνδεση SSH",
"enterFolderName": "Εισάγετε όνομα φακέλου:",
"enterFileName": "Εισάγετε όνομα αρχείου:",
"copy": "Αντιγραφή",
"cut": "Αποκοπή",
"paste": "Επικόλληση",
"copyPath": "Αντιγραφή Διαδρομής",
"copyPaths": "Αντιγραφή Διαδρομών",
"delete": "Διαγραφή",
"properties": "Ιδιότητες",
"refresh": "Ανανέωση",
"downloadFiles": "Λήψη {{count}} αρχείων στον περιηγητή",
"copyFiles": "Αντιγραφή {{count}} αντικειμένων",
"cutFiles": "Αποκοπή {{count}} αντικειμένων",
"deleteFiles": "Διαγραφή στοιχείων {{count}}",
"filesCopiedToClipboard": "Τα στοιχεία {{count}} αντιγράφηκαν στο πρόχειρο",
"filesCutToClipboard": "{{count}} στοιχεία κομμένα στο πρόχειρο",
"pathCopiedToClipboard": "Η διαδρομή αντιγράφηκε στο πρόχειρο",
"pathsCopiedToClipboard": "Οι διαδρομές {{count}} αντιγράφηκαν στο πρόχειρο",
"failedToCopyPath": "Αποτυχία αντιγραφής διαδρομής στο πρόχειρο",
"movedItems": "Μετακινήθηκαν {{count}} στοιχεία",
"failedToDeleteItem": "Αποτυχία διαγραφής στοιχείου",
"itemRenamedSuccessfully": "Το {{type}} μετονομάστηκε με επιτυχία",
"failedToRenameItem": "Αποτυχία μετονομασίας στοιχείου",
"download": "Λήψη",
"permissions": "Δικαιώματα",
"size": "Μέγεθος",
"modified": "Τροποποιήθηκε",
"path": "Διαδρομή",
"confirmDelete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το {{name}}?",
"uploadSuccess": "Το αρχείο μεταφορτώθηκε επιτυχώς",
"uploadFailed": "Η μεταφόρτωση αρχείου απέτυχε",
"downloadSuccess": "Επιτυχής λήψη αρχείου",
"downloadFailed": "Η λήψη του αρχείου απέτυχε",
"permissionDenied": "Άρνηση πρόσβασης",
"checkDockerLogs": "Ελέγξτε τα αρχεία καταγραφής Docker για λεπτομερείς πληροφορίες σφάλματος",
"internalServerError": "Παρουσιάστηκε εσωτερικό σφάλμα διακομιστή",
"serverError": "Σφάλμα Διακομιστή",
"error": "Σφάλμα",
"requestFailed": "Το αίτημα απέτυχε με κωδικό κατάστασης",
"unknownFileError": "άγνωστο",
"cannotReadFile": "Αδυναμία ανάγνωσης αρχείου",
"noSshSessionId": "Δεν υπάρχει διαθέσιμο ID συνεδρίας SSH",
"noFilePath": "Δεν υπάρχει διαθέσιμη διαδρομή αρχείου",
"noCurrentHost": "Δεν υπάρχει διαθέσιμος υπολογιστής",
"fileSavedSuccessfully": "Το αρχείο αποθηκεύτηκε επιτυχώς",
"saveTimeout": "Λήξη χρονικού ορίου για τη λειτουργία αποθήκευσης. Το αρχείο μπορεί να έχει αποθηκευτεί επιτυχώς, αλλά η λειτουργία χρειάστηκε πάρα πολύ για να ολοκληρωθεί. Ελέγξτε τα αρχεία καταγραφής Docker για επιβεβαίωση.",
"failedToSaveFile": "Αποτυχία αποθήκευσης αρχείου",
"deletedSuccessfully": "διαγράφηκε επιτυχώς",
"connectToServer": "Σύνδεση σε διακομιστή",
"selectServerToEdit": "Επιλέξτε ένα διακομιστή από την πλαϊνή μπάρα για να ξεκινήσετε την επεξεργασία αρχείων",
"fileOperations": "Λειτουργίες Αρχείων",
"confirmDeleteMessage": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το {{name}}?",
"confirmDeleteSingleItem": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα \"{{name}}\"?",
"confirmDeleteMultipleItems": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα {{count}} αντικείμενα?",
"confirmDeleteMultipleItemsWithFolders": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα {{count}} αντικείμενα? Αυτό περιλαμβάνει φακέλους και τα περιεχόμενά τους.",
"confirmDeleteFolder": "Είστε βέβαιοι ότι θέλετε να διαγράψετε οριστικά τον φάκελο \"{{name}}\" και όλα τα περιεχόμενά του;",
"deleteDirectoryWarning": "Αυτό θα διαγράψει το φάκελο και όλα τα περιεχόμενά του.",
"actionCannotBeUndone": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"permanentDeleteWarning": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Το αντικείμενο(α) θα διαγραφεί οριστικά από το διακομιστή.",
"recent": "Πρόσφατα",
"pinned": "Καρφιτσωμένο",
"folderShortcuts": "Συντομεύσεις Φακέλου",
"noRecentFiles": "Δεν υπάρχουν πρόσφατα αρχεία.",
"noPinnedFiles": "Δεν υπάρχουν καρφιτσωμένα αρχεία.",
"enterFolderPath": "Εισαγωγή διαδρομής φακέλου",
"noShortcuts": "Χωρίς συντομεύσεις.",
"searchFilesAndFolders": "Αναζήτηση αρχείων και φακέλων...",
"noFilesOrFoldersFound": "Δεν βρέθηκαν αρχεία ή φάκελοι.",
"failedToConnectSSH": "Αποτυχία σύνδεσης στο SSH",
"failedToReconnectSSH": "Αποτυχία επανασύνδεσης SSH συνεδρίας",
"failedToListFiles": "Αποτυχία εμφάνισης αρχείων",
"fetchHomeDataTimeout": "Λήξη χρονικού ορίου για την ανάκτηση δεδομένων οικίας",
"sshStatusCheckTimeout": "Λήξη χρονικού ορίου ελέγχου κατάστασης SSH",
"sshReconnectionTimeout": "Λήξη χρονικού ορίου επανσύνδεσης SSH",
"saveOperationTimeout": "Λήξη χρονικού ορίου λειτουργίας αποθήκευσης",
"cannotSaveFile": "Αδυναμία αποθήκευσης αρχείου",
"dragSystemFilesToUpload": "Σύρετε τα αρχεία συστήματος εδώ για να ανεβάσετε",
"dragFilesToWindowToDownload": "Σύρετε αρχεία έξω από το παράθυρο για λήψη",
"openTerminalHere": "Άνοιγμα Τερματικού Εδώ",
"run": "Εκτέλεση",
"saveToSystem": "Αποθήκευση ως...",
"selectLocationToSave": "Επιλογή τοποθεσίας για αποθήκευση",
"openTerminalInFolder": "Άνοιγμα τερματικού σε αυτόν τον φάκελο",
"openTerminalInFileLocation": "Άνοιγμα τερματικού στην τοποθεσία αρχείου",
"terminalWithPath": "Τερματικό - {{host}}:{{path}}",
"runningFile": "Τρέξιμο - {{file}}",
"onlyRunExecutableFiles": "Μπορέστε να εκτελέσετε μόνο εκτελέσιμα αρχεία",
"noHostSelected": "Δεν επιλέχθηκε κεντρικός υπολογιστής",
"starred": "Αγαπημένα",
"shortcuts": "Συντομεύσεις",
"directories": "Κατάλογοι",
"removedFromRecentFiles": "Αφαιρέθηκε το \"{{name}}\" από τα πρόσφατα αρχεία",
"removeFailed": "Αποτυχία κατάργησης",
"unpinnedSuccessfully": "Unpinned \"{{name}}\" επιτυχώς",
"unpinFailed": "Αποτυχία αποσύνδεσης",
"removedShortcut": "Αφαιρέθηκε συντόμευση \"{{name}}\"",
"removeShortcutFailed": "Κατάργηση συντόμευσης απέτυχε",
"clearedAllRecentFiles": "Εκκαθάριση όλων των πρόσφατων αρχείων",
"clearFailed": "Αποτυχία εκκαθάρισης",
"removeFromRecentFiles": "Αφαίρεση από τα πρόσφατα αρχεία",
"clearAllRecentFiles": "Εκκαθάριση όλων των πρόσφατων αρχείων",
"unpinFile": "Ξεκαρφίτσωμα αρχείου",
"removeShortcut": "Αφαίρεση συντόμευσης",
"saveFilesToSystem": "Αποθήκευση {{count}} αρχείων ως...",
"pinFile": "Καρφίτσωμα αρχείου",
"addToShortcuts": "Προσθήκη στις συντομεύσεις",
"downloadToDefaultLocation": "Λήψη στην προεπιλεγμένη τοποθεσία",
"pasteFailed": "Η επικόλληση απέτυχε",
"noUndoableActions": "Καμία μη αναιρέσιμη ενέργεια",
"undoCopySuccess": "Αναίρεση λειτουργίας αντιγραφής: Διαγράφηκαν {{count}} αντιγραμμένα αρχεία",
"undoCopyFailedDelete": "Αποτυχία αναίρεσης: Δεν ήταν δυνατή η διαγραφή αντιγραμμένων αρχείων",
"undoCopyFailedNoInfo": "Αποτυχία αναίρεσης: Αδυναμία εύρεσης αντιγραμμένων πληροφοριών αρχείου",
"undoMoveSuccess": "Undid move operation: Μετακινήθηκε {{count}} αρχεία πίσω στην αρχική τοποθεσία",
"undoMoveFailedMove": "Αποτυχία αναίρεσης: Δεν ήταν δυνατή η μετακίνηση αρχείων πίσω",
"undoMoveFailedNoInfo": "Αποτυχία αναίρεσης: Αδυναμία εύρεσης πληροφοριών αρχείου που μετακινήθηκαν",
"undoDeleteNotSupported": "Η λειτουργία διαγραφής δεν μπορεί να αναιρεθεί: Τα αρχεία έχουν διαγραφεί οριστικά από το διακομιστή",
"undoTypeNotSupported": "Μη υποστηριζόμενος τύπος λειτουργίας αναίρεσης",
"undoOperationFailed": "Η λειτουργία αναίρεσης απέτυχε",
"unknownError": "Άγνωστο σφάλμα",
"enterPath": "Εισάγετε διαδρομή...",
"editPath": "Επεξεργασία διαδρομής",
"confirm": "Επιβεβαίωση",
"cancel": "Ακύρωση",
"find": "Εύρεση...",
"replaceWith": "Αντικατάσταση με...",
"replace": "Αντικατάσταση",
"replaceAll": "Αντικατάσταση Όλων",
"downloadInstead": "Λήψη Αντ 'αυτού",
"keyboardShortcuts": "Συντομεύσεις Πληκτρολογίου",
"searchAndReplace": "Αναζήτηση & Αντικατάσταση",
"editing": "Επεξεργασία",
"navigation": "Navigation",
"code": "Κωδικός",
"search": "Αναζήτηση",
"findNext": "Εύρεση Επόμενου",
"findPrevious": "Εύρεση Προηγούμενου",
"save": "Αποθήκευση",
"selectAll": "Επιλογή Όλων",
"undo": "Αναίρεση",
"redo": "Επανάληψη",
"goToLine": "Μετάβαση στη γραμμή",
"moveLineUp": "Μετακίνηση Γραμμής Πάνω",
"moveLineDown": "Μετακίνηση Γραμμής Κάτω",
"toggleComment": "Εναλλαγή Σχολίου",
"indent": "Εσοχή",
"outdent": "Εξωτερικό",
"autoComplete": "Auto Complete",
"imageLoadError": "Αποτυχία φόρτωσης εικόνας",
"rotate": "Περιστροφή",
"originalSize": "Αρχικό Μέγεθος",
"startTyping": "Αρχίστε να πληκτρολογείτε...",
"unknownSize": "Άγνωστο μέγεθος",
"fileIsEmpty": "Το αρχείο είναι κενό",
"largeFileWarning": "Προειδοποίηση Μεγάλου Αρχείου",
"largeFileWarningDesc": "Αυτό το αρχείο είναι {{size}} σε μέγεθος, το οποίο μπορεί να προκαλέσει προβλήματα απόδοσης όταν ανοιχθεί ως κείμενο.",
"fileNotFoundAndRemoved": "Αρχείο \"{{name}}\" δεν βρέθηκε και έχει αφαιρεθεί από πρόσφατα / καρφιτσωμένα αρχεία",
"failedToLoadFile": "Απέτυχε η φόρτωση του αρχείου: {{error}}",
"serverErrorOccurred": "Παρουσιάστηκε σφάλμα διακομιστή. Παρακαλώ προσπαθήστε ξανά αργότερα.",
"autoSaveFailed": "Η αυτόματη αποθήκευση απέτυχε",
"fileAutoSaved": "Αυτόματα αποθηκευμένο αρχείο",
"moveFileFailed": "Αποτυχία μετακίνησης του {{name}}",
"moveOperationFailed": "Αποτυχία λειτουργίας μετακίνησης",
"canOnlyCompareFiles": "Μπορεί να συγκρίνει μόνο δύο αρχεία",
"comparingFiles": "Σύγκριση αρχείων: {{file1}} και {{file2}}",
"dragFailed": "Αποτυχία λειτουργίας συρσίματος",
"filePinnedSuccessfully": "Αρχείο \"{{name}}\" καρφιτσώθηκε επιτυχώς",
"pinFileFailed": "Αποτυχία καρφιτσώματος",
"fileUnpinnedSuccessfully": "Αρχείο \"{{name}}\" ξεκαρφιτσώθηκε επιτυχώς",
"unpinFileFailed": "Αποτυχία ξεκαρφιτσώματος",
"shortcutAddedSuccessfully": "Συντόμευση φακέλου \"{{name}}\" προστέθηκε επιτυχώς",
"addShortcutFailed": "Αποτυχία προσθήκης συντόμευσης",
"operationCompletedSuccessfully": "{{operation}} {{count}} στοιχεία με επιτυχία",
"operationCompleted": "{{operation}} {{count}} στοιχεία",
"downloadFileSuccess": "Αρχείο {{name}} κατέβηκε επιτυχώς",
"downloadFileFailed": "Αποτυχία λήψης",
"moveTo": "Μετακίνηση στο {{name}}",
"diffCompareWith": "Σύγκριση διαφοράς με το {{name}}",
"dragOutsideToDownload": "Σύρετε έξω από το παράθυρο για λήψη ({{count}} αρχεία)",
"newFolderDefault": "Νέος Φάκελος",
"newFileDefault": "NewFile.txt",
"successfullyMovedItems": "Επιτυχής μετακίνηση {{count}} στοιχείων στο {{target}}",
"move": "Μετακίνηση",
"searchInFile": "Αναζήτηση σε αρχείο (Ctrl+F)",
"showKeyboardShortcuts": "Εμφάνιση συντομεύσεων πληκτρολογίου",
"startWritingMarkdown": "Αρχίστε να γράφετε το περιεχόμενό σας markdown...",
"loadingFileComparison": "Φόρτωση σύγκρισης αρχείου...",
"reload": "Reload",
"compare": "Σύγκριση",
"sideBySide": "Πλευρά δίπλα",
"inline": "Εμβόλιμο",
"fileComparison": "Σύγκριση αρχείων: {{file1}} vs {{file2}}",
"fileTooLarge": "Πολύ μεγάλο αρχείο: {{error}}",
"sshConnectionFailed": "Αποτυχία σύνδεσης SSH. Παρακαλώ ελέγξτε τη σύνδεσή σας στο {{name}} ({{ip}}:{{port}})",
"loadFileFailed": "Απέτυχε η φόρτωση του αρχείου: {{error}}",
"connecting": "Σύνδεση...",
"connectedSuccessfully": "Επιτυχής σύνδεση",
"totpVerificationFailed": "Αποτυχία επαλήθευσης TOTP",
"warpgateVerificationFailed": "Η ταυτοποίηση Warpgate απέτυχε",
"authenticationFailed": "Αποτυχία ταυτοποίησης",
"verificationCodePrompt": "Κωδικός επιβεβαίωσης:",
"changePermissions": "Αλλαγή Δικαιωμάτων",
"changePermissionsDesc": "Τροποποίηση δικαιωμάτων αρχείου για",
"currentPermissions": "Τρέχοντα Δικαιώματα",
"newPermissions": "Νέα Δικαιώματα",
"owner": "Ιδιοκτήτης",
"group": "Ομάδα",
"others": "Άλλα",
"read": "Ανάγνωση",
"write": "Εγγραφή",
"execute": "Εκτέλεση",
"permissionsChangedSuccessfully": "Τα δικαιώματα άλλαξαν επιτυχώς",
"failedToChangePermissions": "Αποτυχία αλλαγής δικαιωμάτων"
},
"tunnel": {
"log": {
"connecting": "Δημιουργία σύνδεσης σήραγγας...",
"sourceConnecting": "Σύνδεση στον πηγαίο υπολογιστή {{host}}...",
"sourceConnected": "Συνδεδεμένο στον πηγαίο υπολογιστή",
"endpointResolving": "Επίλυση του κεντρικού υπολογιστή τελικού σημείου {{host}}...",
"endpointResolved": "Κεντρικός υπολογιστής τελικού σημείου επιλύθηκε",
"forwarding": "Ρύθμιση προώθησης θύρας {{localPort}} → {{remotePort}}...",
"connected": "Η σήραγγα δημιουργήθηκε επιτυχώς",
"retrying": "Η σύνδεση απέτυχε, προσπάθεια ξανά στο {{countdown}}s (προσπάθεια {{attempt}}/{{max}})...",
"retryExhausted": "Επιτεύχθηκαν μέγιστες προσπάθειες επανάληψης",
"error": "Η σύνδεση της σήραγγας απέτυχε: {{error}}"
}
},
"tunnels": {
"title": "SSH Σήραγγες",
"noSshTunnels": "Χωρίς SSH Tunnels",
"createFirstTunnelMessage": "Δεν έχετε δημιουργήσει ακόμα SSH tunnel. Ρυθμίστε τις συνδέσεις tunnel στο Host Manager για να ξεκινήσετε.",
"connected": "Συνδεδεμένο",
"disconnected": "Αποσυνδέθηκε",
"connecting": "Σύνδεση...",
"disconnecting": "Αποσύνδεση...",
"unknownTunnelStatus": "Άγνωστο",
"statusUnknown": "Άγνωστο",
"unknown": "Άγνωστο",
"error": "Σφάλμα",
"failed": "Απέτυχε",
"retrying": "Επανάληψη",
"waiting": "Αναμονή",
"waitingForRetry": "Αναμονή για επανάληψη",
"retryingConnection": "Επανάληψη σύνδεσης",
"canceling": "Ακύρωση...",
"connect": "Σύνδεση",
"disconnect": "Αποσύνδεση",
"cancel": "Ακύρωση",
"port": "Θύρα",
"attempt": "Προσπάθεια {{current}} του {{max}}",
"nextRetryIn": "Επόμενη προσπάθεια σε {{seconds}} δευτερόλεπτα",
"checkDockerLogs": "Ελέγξτε τα αρχεία καταγραφής Docker για το λόγο σφάλματος, μπείτε στο",
"orCreate": "ή δημιουργήστε ένα ",
"noTunnelConnections": "Δεν έχουν ρυθμιστεί συνδέσεις διοχέτευσης",
"tunnelConnections": "Συνδέσεις Tunnel",
"addTunnel": "Προσθήκη Tunnel",
"editTunnel": "Επεξεργασία Σήραγγας",
"deleteTunnel": "Διαγραφή Tunnel",
"tunnelName": "Όνομα Tunnel",
"localPort": "Τοπική Θύρα",
"remoteHost": "Απομακρυσμένος Διακομιστής",
"remotePort": "Απομακρυσμένη Θύρα",
"autoStart": "Αυτόματη Εκκίνηση",
"status": "Κατάσταση",
"active": "Ενεργό",
"inactive": "Ανενεργό",
"start": "Έναρξη",
"stop": "Διακοπή",
"restart": "Επανεκκίνηση",
"connectionType": "Τύπος Σύνδεσης",
"local": "Τοπικό",
"remote": "Απομακρυσμένο",
"dynamic": "Δυναμικό",
"unknownConnectionStatus": "Άγνωστο",
"portMapping": "Θύρα {{sourcePort}} → {{endpointHost}}:{{endpointPort}}",
"endpointHostNotFound": "Ο κεντρικός υπολογιστής τελικού σημείου δεν βρέθηκε",
"discord": "Discord",
"githubIssue": "Πρόβλημα στο GitHub",
"forHelp": "για βοήθεια"
},
"serverStats": {
"title": "Στατιστικά Διακομιστή",
"cpu": "Επεξεργαστής",
"memory": "Μνήμη",
"disk": "Δίσκος",
"network": "Δίκτυο",
"uptime": "Χρόνος",
"loadAverage": "Avg: {{avg1}}, {{avg5}}, {{avg15}}",
"processes": "Διεργασίες",
"connections": "Συνδέσεις",
"usage": "Χρήση",
"available": "Διαθέσιμο",
"total": "Σύνολο",
"free": "Δωρεάν",
"used": "Χρησιμοποιείται",
"percentage": "Ποσοστό",
"refreshStatusAndMetrics": "Ανανέωση κατάστασης και μετρήσεων",
"refreshStatus": "Ανανέωση Κατάστασης",
"fileManagerAlreadyOpen": "Ο Διαχειριστής αρχείων είναι ήδη ανοιχτός για αυτόν τον κεντρικό υπολογιστή",
"openFileManager": "Άνοιγμα Διαχειριστή Αρχείων",
"connecting": "Σύνδεση...",
"connectionFailed": "Αποτυχία σύνδεσης με το διακομιστή",
"cpuCores_one": "{{count}} CPU",
"cpuCores_other": "{{count}} CPUs",
"naCpus": "Δ/Α ΚΜΕ",
"loadAverageNA": "Avg: N/A",
"cpuUsage": "Χρήση CPU",
"memoryUsage": "Χρήση Μνήμης",
"diskUsage": "Χρήση Δίσκου",
"rootStorageSpace": "Root Αποθηκευτικός Χώρος",
"of": "από",
"feedbackMessage": "Έχετε ιδέες για το τι θα πρέπει να έρθει επόμενο για τη διαχείριση του διακομιστή? Μοιραστείτε τις",
"failedToFetchHostConfig": "Αποτυχία ανάκτησης ρύθμισης παραμέτρων κεντρικού υπολογιστή",
"failedToFetchStatus": "Αποτυχία ανάκτησης της κατάστασης του διακομιστή",
"failedToFetchMetrics": "Αποτυχία λήψης μετρήσεων διακομιστή",
"failedToFetchHomeData": "Αποτυχία λήψης δεδομένων οικίας",
"loadingMetrics": "Φόρτωση μετρήσεων...",
"refreshing": "Ανανέωση...",
"serverOffline": "Διακομιστής Χωρίς Σύνδεση",
"cannotFetchMetrics": "Αδυναμία λήψης μετρήσεων από διακομιστή εκτός σύνδεσης",
"totpRequired": "Απαιτείται Πιστοποίηση TOTP",
"totpUnavailable": "Στατιστικά διακομιστή μη διαθέσιμα για διακομιστές TOTP",
"totpVerified": "Επαληθευμένο TOTP, ξεκίνησε η συλλογή μετρήσεων",
"totpFailed": "Αποτυχία επαλήθευσης TOTP",
"totpInvalidCode": "Μη έγκυρος κωδικός επαλήθευσης",
"totpCancelled": "Η συλλογή μετρικών ακυρώθηκε",
"authenticationFailed": "Αποτυχία ταυτοποίησης",
"noneAuthNotSupported": "Τα Στατιστικά Διακομιστή δεν υποστηρίζουν τύπο ελέγχου ταυτότητας 'none'.",
"load": "Φόρτωση",
"editLayout": "Επεξεργασία Διάταξης",
"cancelEdit": "Ακύρωση",
"addWidget": "Προσθήκη Γραφικού Στοιχείου",
"saveLayout": "Αποθήκευση Διάταξης",
"unsavedChanges": "Μη αποθηκευμένες αλλαγές",
"layoutSaved": "Η διάταξη αποθηκεύτηκε επιτυχώς",
"failedToSaveLayout": "Αποτυχία αποθήκευσης διάταξης",
"systemInfo": "Πληροφορίες Συστήματος",
"hostname": "Hostname",
"operatingSystem": "Λειτουργικό Σύστημα",
"kernel": "Πυρήνας",
"totalUptime": "Συνολικό Χρόνο Ενημέρωσης",
"seconds": "δευτερόλεπτα",
"networkInterfaces": "Διεπαφές Δικτύου",
"noInterfacesFound": "Δεν βρέθηκαν διεπαφές δικτύου",
"totalProcesses": "Συνολικές Διεργασίες",
"running": "Εκτελείται",
"noProcessesFound": "Δεν βρέθηκαν διεργασίες",
"loginStats": "Στατιστικά Σύνδεσης SSH",
"totalLogins": "Σύνολο Συνδέσεων",
"uniqueIPs": "Μοναδικά IP",
"recentSuccessfulLogins": "Πρόσφατες Επιτυχημένες Συνδέσεις",
"recentFailedAttempts": "Πρόσφατες Αποτυχημένες Προσπάθειες",
"noRecentLoginData": "Δεν υπάρχουν πρόσφατα δεδομένα σύνδεσης",
"from": "από",
"quickActions": "Γρήγορες Ενέργειες",
"executeQuickAction": "Εκτέλεση {{name}}",
"executingQuickAction": "Εκτέλεση {{name}}...",
"quickActionSuccess": "{{name}} ολοκληρώθηκε με επιτυχία",
"quickActionFailed": "{{name}} απέτυχε",
"quickActionError": "Απέτυχε η εκτέλεση του {{name}}",
"ports": {
"title": "Θύρες Ακρόασης",
"protocol": "Protocol",
"port": "Θύρα",
"address": "Διεύθυνση",
"state": "Κατάσταση",
"process": "Διεργασία",
"noData": "Δεν υπάρχουν δεδομένα θυρών ακρόασης"
},
"firewall": {
"title": "Τείχος Προστασίας",
"active": "Ενεργό",
"inactive": "Ανενεργό",
"notDetected": "Δεν Ανιχνεύθηκε",
"policy": "Πολιτική",
"rules": "κανόνες",
"noRules": "Χωρίς κανόνες",
"noData": "Δεν υπάρχουν διαθέσιμα δεδομένα τείχους προστασίας",
"action": "Ενέργεια",
"protocol": "Proto",
"port": "Θύρα",
"source": "Πηγή",
"accept": "ΑΠΟΔΟΧΗ",
"drop": "DROP",
"reject": "ΑΠΟΡΡΙΨΗ",
"anywhere": "Οπουδήποτε"
}
},
"auth": {
"tagline": "ΔΙΑΧΕΙΡΙΣΗ SSH ΔΙΑΧΕΙΡΙΣΗΣ ΔΙΑΚΟΠΗΣ",
"description": "Ασφαλής, ισχυρή, και διαισθητική διαχείριση σύνδεσης SSH",
"welcomeBack": "Καλώς ήρθατε πίσω στο TERMIX",
"createAccount": "Δημιουργήστε τον λογαριασμό σας TERMIX",
"continueExternal": "Συνέχεια με εξωτερικό πάροχο",
"loginTitle": "Συνδεθείτε στο Termix",
"registerTitle": "Δημιουργία Λογαριασμού",
"loginButton": "Είσοδος",
"registerButton": "Εγγραφή",
"forgotPassword": "Ξεχάσατε Τον Κωδικό Πρόσβασης?",
"rememberMe": "Να Με Θυμάσαι",
"noAccount": "Δεν έχετε λογαριασμό?",
"hasAccount": "Έχετε ήδη λογαριασμό?",
"loginSuccess": "Επιτυχής σύνδεση",
"loginFailed": "Αποτυχία σύνδεσης",
"registerSuccess": "Επιτυχής εγγραφή",
"registerFailed": "Η εγγραφή απέτυχε",
"logoutSuccess": "Επιτυχής αποσύνδεση",
"invalidCredentials": "Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης",
"accountCreated": "Ο λογαριασμός δημιουργήθηκε επιτυχώς",
"passwordReset": "Ο σύνδεσμος επαναφοράς κωδικού εστάλη",
"twoFactorAuth": "Έλεγχος Ταυτότητας Δύο Παραγόντων",
"enterCode": "Εισάγετε τον κωδικό επαλήθευσης",
"backupCode": "Ή χρησιμοποιήστε εφεδρικό κωδικό",
"verifyCode": "Επαλήθευση Κωδικού",
"redirectingToApp": "Ανακατεύθυνση στην εφαρμογή...",
"enableTwoFactor": "Ενεργοποίηση Ταυτοποίησης Δύο Παραγόντων",
"disableTwoFactor": "Απενεργοποίηση Ταυτοποίησης Δύο Παραμέτρων",
"scanQRCode": "Σαρώστε αυτόν τον κωδικό QR με την εφαρμογή ελέγχου ταυτότητας",
"backupCodes": "Κωδικοί Αντιγράφων Ασφαλείας",
"saveBackupCodes": "Αποθηκεύστε αυτούς τους εφεδρικούς κωδικούς σε ασφαλές μέρος",
"twoFactorEnabledSuccess": "Ο έλεγχος ταυτότητας δύο παραγόντων ενεργοποιήθηκε επιτυχώς!",
"twoFactorDisabled": "Ο έλεγχος ταυτότητας δύο παραγόντων απενεργοποιήθηκε",
"newBackupCodesGenerated": "Δημιουργήθηκαν νέοι εφεδρικοί κωδικοί",
"backupCodesDownloaded": "Έγινε λήψη αντιγράφων ασφαλείας κωδικών",
"pleaseEnterSixDigitCode": "Παρακαλώ εισάγετε έναν 6-ψήφιο κωδικό",
"invalidVerificationCode": "Μη έγκυρος κωδικός επαλήθευσης",
"failedToDisableTotp": "Αποτυχία απενεργοποίησης TOTP",
"failedToGenerateBackupCodes": "Αποτυχία δημιουργίας εφεδρικών κωδικών",
"enterPassword": "Εισάγετε τον κωδικό σας",
"lockedOidcAuth": "Κλειδωμένο (OIDC Auth)",
"twoFactorTitle": "Έλεγχος Ταυτότητας Δύο Παραγόντων",
"twoFactorProtected": "Ο λογαριασμός σας προστατεύεται με έλεγχο ταυτότητας δύο παραγόντων",
"twoFactorActive": "Ο έλεγχος ταυτότητας δύο παραγόντων είναι ενεργός στο λογαριασμό σας",
"disable2FA": "Απενεργοποίηση 2FA",
"disableTwoFactorWarning": "Η απενεργοποίηση του ελέγχου ταυτότητας δύο παραγόντων θα καταστήσει τον λογαριασμό σας λιγότερο ασφαλή",
"passwordOrTotpCode": "Κωδικός Πρόσβασης ή Κωδικός TOTP",
"or": "Ή",
"generateNewBackupCodesText": "Δημιουργήστε νέους εφεδρικούς κωδικούς αν έχετε χάσει τους υπάρχοντες σας",
"generateNewBackupCodes": "Δημιουργία Νέων Εφεδρικών Κωδικών",
"yourBackupCodes": "Οι Αντίγραφοι Κωδικοί Σας",
"download": "Λήψη",
"setupTwoFactorTitle": "Ρύθμιση Ελέγχου Ταυτότητας Δύο Παραγόντων",
"sshAuthenticationRequired": "Απαιτείται Πιστοποίηση SSH",
"sshNoKeyboardInteractive": "Διαδραστική Πιστοποίηση Πληκτρολογίου Μη Διαθέσιμη",
"sshAuthenticationFailed": "Αποτυχία Ταυτοποίησης",
"sshAuthenticationTimeout": "Χρονικό Όριο Ταυτοποίησης",
"sshNoKeyboardInteractiveDescription": "Ο διακομιστής δεν υποστηρίζει έλεγχο ταυτότητας διαδραστικού πληκτρολογίου. Παρακαλώ δώστε τον κωδικό σας ή το SSH κλειδί.",
"sshAuthFailedDescription": "Τα παρεχόμενα διαπιστευτήρια ήταν εσφαλμένα. Παρακαλώ δοκιμάστε ξανά με έγκυρα διαπιστευτήρια.",
"sshTimeoutDescription": "Λήξη χρονικού ορίου προσπάθειας ταυτοποίησης. Παρακαλώ δοκιμάστε ξανά.",
"sshProvideCredentialsDescription": "Παρακαλώ δώστε τα SSH διαπιστευτήρια σας για να συνδεθείτε σε αυτόν το διακομιστή.",
"sshPasswordDescription": "Εισάγετε τον κωδικό πρόσβασης για αυτή τη σύνδεση SSH.",
"sshKeyPasswordDescription": "Αν το SSH κλειδί σας είναι κρυπτογραφημένο, εισάγετε εδώ τη φράση πρόσβασης.",
"step1ScanQR": "Βήμα 1: Σαρώστε τον κωδικό QR με την εφαρμογή ελέγχου ταυτότητας",
"manualEntryCode": "Χειροκίνητος Κώδικας Εισόδου",
"cannotScanQRText": "Αν δεν μπορείτε να σαρώσετε τον κωδικό QR, πληκτρολογήστε αυτόν τον κωδικό χειροκίνητα στην εφαρμογή ελέγχου ταυτότητας",
"nextVerifyCode": "Επόμενο: Επαλήθευση Κώδικα",
"verifyAuthenticator": "Επαληθεύστε Τον Πιστοποιητικό Σας",
"step2EnterCode": "Βήμα 2: Εισάγετε τον 6-ψήφιο κωδικό από την εφαρμογή ελέγχου ταυτότητας",
"verificationCode": "Κωδικός Επαλήθευσης",
"back": "Πίσω",
"verifyAndEnable": "Επαλήθευση και ενεργοποίηση",
"saveBackupCodesTitle": "Αποθηκεύστε Τους Εφεδρικούς Κωδικούς Σας",
"step3StoreCodesSecurely": "Βήμα 3: Αποθηκεύστε αυτούς τους κώδικες σε ασφαλές μέρος",
"importantBackupCodesText": "Αποθηκεύστε αυτούς τους εφεδρικούς κωδικούς σε μια ασφαλή τοποθεσία. Μπορείτε να τους χρησιμοποιήσετε για να αποκτήσετε πρόσβαση στο λογαριασμό σας εάν χάσετε τη συσκευή ελέγχου ταυτότητάς σας.",
"completeSetup": "Ολοκλήρωση Εγκατάστασης",
"notEnabledText": "Ο έλεγχος ταυτότητας δύο παραγόντων προσθέτει ένα επιπλέον επίπεδο ασφάλειας απαιτώντας έναν κωδικό από την εφαρμογή ελέγχου ταυτότητας κατά την σύνδεση.",
"enableTwoFactorButton": "Ενεργοποίηση Ταυτοποίησης Δύο Παραγόντων",
"addExtraSecurityLayer": "Προσθέστε ένα επιπλέον επίπεδο ασφάλειας στο λογαριασμό σας",
"firstUser": "Πρώτος Χρήστης",
"firstUserMessage": "Είστε ο πρώτος χρήστης και θα γίνει ένας διαχειριστής. Μπορείτε να δείτε τις ρυθμίσεις διαχειριστή στο αναπτυσσόμενο μενού του χρήστη πλαϊνής μπάρας. Αν νομίζετε ότι αυτό είναι λάθος, ελέγξτε τα αρχεία καταγραφής docker ή δημιουργήστε ένα ζήτημα GitHub.",
"external": "Εξωτερικό",
"loginWithExternal": "Συνδεθείτε με τον εξωτερικό πάροχο",
"loginWithExternalDesc": "Συνδεθείτε χρησιμοποιώντας τον καθορισμένο εξωτερικό πάροχο ταυτότητας σας",
"externalNotSupportedInElectron": "Ο εξωτερικός έλεγχος ταυτότητας δεν υποστηρίζεται ακόμα στην εφαρμογή Electron. Παρακαλούμε χρησιμοποιήστε την έκδοση web για σύνδεση OIDC.",
"resetPasswordButton": "Επαναφορά Κωδικού Πρόσβασης",
"sendResetCode": "Αποστολή Κωδικού Επαναφοράς",
"resetCodeDesc": "Εισάγετε το όνομα χρήστη σας για να λάβετε έναν κωδικό επαναφοράς κωδικού. Ο κωδικός θα συνδεθεί στα αρχεία καταγραφής docker container.",
"resetCode": "Reset Code",
"verifyCodeButton": "Επαλήθευση Κωδικού",
"enterResetCode": "Εισάγετε τον 6ψήφιο κωδικό από τα αρχεία καταγραφής docker container για τον χρήστη:",
"goToLogin": "Μετάβαση στη σύνδεση",
"newPassword": "Νέος Κωδικός Πρόσβασης",
"confirmNewPassword": "Επιβεβαίωση Κωδικού Πρόσβασης",
"enterNewPassword": "Εισάγετε τον νέο κωδικό πρόσβασης για το χρήστη:",
"signUp": "Εγγραφή",
"mobileApp": "Εφαρμογή Για Κινητά",
"loggingInToMobileApp": "Σύνδεση στην εφαρμογή για κινητά",
"desktopApp": "Εφαρμογή Επιφάνειας Εργασίας",
"loggingInToDesktopApp": "Σύνδεση στην εφαρμογή επιφάνειας εργασίας",
"loggingInToDesktopAppViaWeb": "Σύνδεση στην εφαρμογή επιφάνειας εργασίας μέσω διεπαφής ιστού",
"loadingServer": "Φόρτωση διακομιστή...",
"authenticating": "Ταυτοποίηση...",
"dataLossWarning": "Η επαναφορά του κωδικού πρόσβασής σας με αυτόν τον τρόπο θα διαγράψει όλα τα αποθηκευμένα SSH hosts, διαπιστευτήρια και άλλα κρυπτογραφημένα δεδομένα. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Χρησιμοποιήστε την μόνο αν έχετε ξεχάσει τον κωδικό σας και δεν είστε συνδεδεμένοι.",
"authenticationDisabled": "Απενεργοποίηση Ταυτοποίησης",
"authenticationDisabledDesc": "Όλες οι μέθοδοι ταυτοποίησης είναι απενεργοποιημένες. Παρακαλώ επικοινωνήστε με το διαχειριστή.",
"passwordResetSuccess": "Επιτυχής Επαναφορά Κωδικού Πρόσβασης",
"passwordResetSuccessDesc": "Επιτυχής επαναφορά του κωδικού πρόσβασης. Μπορείτε τώρα να συνδεθείτε με το νέο κωδικό πρόσβασης."
},
"errors": {
"notFound": "Η σελίδα δεν βρέθηκε",
"unauthorized": "Μη εξουσιοδοτημένη πρόσβαση",
"forbidden": "Απαγορεύεται η πρόσβαση",
"serverError": "Σφάλμα διακομιστή",
"networkError": "Σφάλμα δικτύου",
"databaseConnection": "Δεν ήταν δυνατή η σύνδεση με τη βάση δεδομένων",
"unknownError": "Άγνωστο σφάλμα",
"loginFailed": "Αποτυχία σύνδεσης",
"failedPasswordReset": "Αποτυχία έναρξης επαναφοράς κωδικού πρόσβασης",
"failedVerifyCode": "Αποτυχία επαλήθευσης κωδικού επαναφοράς",
"failedCompleteReset": "Αποτυχία ολοκλήρωσης της επαναφοράς κωδικού πρόσβασης",
"invalidTotpCode": "Invalid TOTP code",
"failedOidcLogin": "Αποτυχία έναρξης σύνδεσης OIDC",
"failedUserInfo": "Αποτυχία λήψης πληροφοριών χρήστη μετά την σύνδεση OIDC",
"oidcAuthFailed": "Αποτυχία ταυτοποίησης OIDC",
"noTokenReceived": "Δεν ελήφθη κανένα διακριτικό από τη σύνδεση",
"invalidAuthUrl": "Μη έγκυρη έγκριση URL λήφθηκε από το σύστημα υποστήριξης",
"invalidInput": "Invalid input",
"requiredField": "Αυτό το πεδίο είναι υποχρεωτικό",
"minLength": "Το ελάχιστο μήκος είναι {{min}}",
"maxLength": "Το μέγιστο μήκος είναι {{max}}",
"invalidEmail": "Μη έγκυρη διεύθυνση email",
"passwordMismatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν",
"passwordLoginDisabled": "Το όνομα χρήστη/κωδικός πρόσβασης είναι απενεργοποιημένο",
"weakPassword": "Ο κωδικός πρόσβασης είναι πολύ αδύναμος",
"usernameExists": "Το όνομα χρήστη υπάρχει ήδη",
"emailExists": "Το email υπάρχει ήδη",
"loadFailed": "Αποτυχία φόρτωσης δεδομένων",
"saveError": "Αποτυχία αποθήκευσης",
"sessionExpired": "Η συνεδρία έληξε - παρακαλώ συνδεθείτε ξανά",
"totpRateLimited": "Περιορισμένος ρυθμός: Πάρα πολλές προσπάθειες επαλήθευσης TOTP. Παρακαλώ δοκιμάστε ξανά αργότερα.",
"totpRateLimitedWithTime": "Περιορισμένος ρυθμός: Πάρα πολλές προσπάθειες επαλήθευσης TOTP. Παρακαλώ περιμένετε {{time}} δευτερόλεπτα πριν προσπαθήσετε ξανά.",
"resetCodeRateLimited": "Περιορισμένη βαθμολογία: Πάρα πολλές προσπάθειες επαλήθευσης. Παρακαλώ δοκιμάστε ξανά αργότερα.",
"resetCodeRateLimitedWithTime": "Περιορισμένος ρυθμός: Πάρα πολλές προσπάθειες επαλήθευσης. Παρακαλώ περιμένετε {{time}} δευτερόλεπτα πριν προσπαθήσετε ξανά."
},
"messages": {
"saveSuccess": "Αποθηκεύτηκε επιτυχώς",
"saveError": "Αποτυχία αποθήκευσης",
"deleteSuccess": "Διαγράφηκε επιτυχώς",
"deleteError": "Αποτυχία διαγραφής",
"updateSuccess": "Επιτυχής ενημέρωση",
"updateError": "Αποτυχία ενημέρωσης",
"copySuccess": "Αντιγράφηκε στο πρόχειρο",
"copyError": "Αποτυχία αντιγραφής",
"copiedToClipboard": "{{item}} αντιγράφηκε στο πρόχειρο",
"connectionEstablished": "Η σύνδεση δημιουργήθηκε",
"connectionClosed": "Η σύνδεση έκλεισε",
"reconnecting": "Επανασύνδεση...",
"processing": "Επεξεργασία...",
"pleaseWait": "Παρακαλώ περιμένετε...",
"registrationDisabled": "Νέα εγγραφή λογαριασμού απενεργοποιείται από έναν διαχειριστή. Παρακαλούμε συνδεθείτε ή επικοινωνήστε με το διαχειριστή.",
"databaseConnected": "Η βάση δεδομένων συνδέθηκε επιτυχώς",
"databaseConnectionFailed": "Αποτυχία σύνδεσης με το διακομιστή βάσης δεδομένων",
"checkServerConnection": "Παρακαλώ ελέγξτε τη σύνδεση του διακομιστή σας και προσπαθήστε ξανά",
"resetCodeSent": "Η επαναφορά κωδικού στάλθηκε στα αρχεία καταγραφής Docker",
"codeVerified": "Επιτυχής επαλήθευση κωδικού",
"passwordResetSuccess": "Επιτυχής επαναφορά κωδικού πρόσβασης",
"loginSuccess": "Επιτυχής σύνδεση",
"registrationSuccess": "Επιτυχής εγγραφή"
},
"profile": {
"title": "Προφίλ Χρήστη",
"description": "Διαχειριστείτε τις ρυθμίσεις του λογαριασμού σας και την ασφάλεια",
"security": "Ασφάλεια",
"changePassword": "Αλλαγή Κωδικού Πρόσβασης",
"twoFactorAuth": "Έλεγχος Ταυτότητας Δύο Παραγόντων",
"accountInfo": "Πληροφορίες Λογαριασμού",
"role": "Ρόλος",
"admin": "Διαχειριστής",
"user": "Χρήστης",
"authMethod": "Μέθοδος Ταυτοποίησης",
"local": "Τοπικό",
"external": "Εξωτερικό (OIDC)",
"externalAndLocal": "Διπλή Πιστοποίηση",
"selectPreferredLanguage": "Επιλέξτε την προτιμώμενη γλώσσα για τη διεπαφή",
"fileColorCoding": "Κωδικοποίηση Χρώματος Αρχείου",
"fileColorCodingDesc": "Αρχεία χρωμάτων-κώδικα ανά τύπο: φάκελοι (κόκκινο), αρχεία (μπλε), symlinks (πράσινο)",
"commandAutocomplete": "Αυτόματη Ολοκλήρωση Εντολής",
"commandAutocompleteDesc": "Ενεργοποίηση προτάσεων αυτόματης συμπλήρωσης πλήκτρων Tab για εντολές τερματικού βάσει του ιστορικού εντολών σας",
"defaultSnippetFoldersCollapsed": "Σύμπτυξη φακέλων αποσπώμενων από προεπιλογή",
"defaultSnippetFoldersCollapsedDesc": "Όταν ενεργοποιηθεί, όλοι οι φάκελοι αποκοπής θα καταρρεύσουν όταν ανοίξετε την καρτέλα αποσπασμάτων",
"terminalSyntaxHighlighting": "Επισήμανση Σύνταξης Τερματικού",
"showHostTags": "Εμφάνιση Ετικετών Υπολογιστή",
"showHostTagsDesc": "Εμφάνιση ετικετών σε κάθε κεντρικό υπολογιστή στην πλαϊνή μπάρα. Απενεργοποιήστε για να αποκρύψετε όλες τις ετικέτες.",
"account": "Λογαριασμός",
"appearance": "Εμφάνιση",
"languageLocalization": "Γλώσσα & Τοπικοποίηση",
"fileManagerSettings": "Διαχειριστής Αρχείων",
"terminalSettings": "Τερματικό",
"hostSidebarSettings": "Κεντρικός Υπολογιστής & Πλαϊνή Μπάρα",
"snippetsSettings": "Δείγματα",
"updateSettings": "Ενημερώσεις",
"disableUpdateCheck": "Απενεργοποίηση Ελέγχου Ενημέρωσης",
"disableUpdateCheckDesc": "Διακοπή ελέγχου για νέες εκδόσεις κατά την εκκίνηση και τον πίνακα ελέγχου. Μειώνει τα αιτήματα δικτύου.",
"currentPassword": "Τρέχων Κωδικός Πρόσβασης",
"passwordChangedSuccess": "Ο κωδικός πρόσβασης άλλαξε επιτυχώς! Παρακαλώ συνδεθείτε ξανά.",
"failedToChangePassword": "Απέτυχε η αλλαγή του κωδικού πρόσβασης. Παρακαλώ ελέγξτε τον τρέχοντα κωδικό πρόσβασης και προσπαθήστε ξανά.",
"theme": "Θέμα",
"themeLight": "Φωτεινό",
"themeDark": "Σκοτεινό",
"themeSystem": "Σύστημα",
"appearanceDesc": "Επιλέξτε το χρώμα θέματος για την εφαρμογή",
"terminalSyntaxHighlightingDesc": "Αυτόματη επισήμανση εντολών, μονοπατιών, IP και επιπέδων καταγραφής στην έξοδο τερματικού",
"enableCommandPaletteShortcut": "Ενεργοποίηση Συντόμευσης Παλέτας Εντολών",
"enableCommandPaletteShortcutDesc": "Διπλό χτύπημα αριστερά Shift για άνοιγμα της παλέτας εντολών για γρήγορη πρόσβαση στους υπολογιστές"
},
"user": {
"failedToLoadVersionInfo": "Αποτυχία φόρτωσης πληροφοριών έκδοσης"
},
"placeholders": {
"enterCode": "000000",
"ipAddress": "127.0.0.1",
"port": "22",
"maxRetries": "3",
"retryInterval": "10",
"language": "Γλώσσα",
"username": "όνομα χρήστη",
"hostname": "όνομα κεντρικού υπολογιστή",
"folder": "φάκελος",
"password": "κωδικός",
"keyPassword": "κωδικός πρόσβασης",
"sudoPassword": "sudo password (προαιρετικό)",
"notes": "προσθέστε σημειώσεις σχετικά με αυτόν τον υπολογιστή...",
"expirationDate": "Επιλέξτε ημερομηνία λήξης",
"pastePrivateKey": "Επικολλήστε το ιδιωτικό σας κλειδί εδώ...",
"pastePublicKey": "Επικολλήστε το δημόσιο κλειδί εδώ...",
"credentialName": "Ο SSH Διακομιστής Μου",
"description": "Περιγραφή διαπιστευτηρίων SSH",
"searchCredentials": "Αναζήτηση διαπιστευτηρίων με βάση όνομα, όνομα χρήστη ή ετικέτες...",
"sshConfig": "ρύθμιση τελικού σημείου ssh",
"homePath": "/οικία",
"clientId": "το δικό σας-πελάτη",
"clientSecret": "σας-πελάτης-μυστικό",
"authUrl": "https://your-provider.com/application/o/authorize/",
"redirectUrl": "https://your-provider.com/application/o/termix/",
"tokenUrl": "https://your-provider.com/application/o/token/",
"userIdField": "υπο",
"usernameField": "όνομα",
"scopes": "άνοιγμα προφίλ email",
"userinfoUrl": "https://your-provider.com/application/o/userinfo/",
"enterUsername": "Εισάγετε όνομα χρήστη για δημιουργία διαχειριστή",
"searchHosts": "Αναζήτηση υπολογιστών με όνομα, όνομα χρήστη, IP, φάκελο, ετικέτες...",
"enterPassword": "Εισάγετε τον κωδικό σας",
"totpCode": "6-digit TOTP code",
"searchHostsAny": "Αναζήτηση hosts (δοκιμή: ετικέτα:prod, χρήστης:root, ip:192.168)...",
"confirmPassword": "Εισάγετε τον κωδικό πρόσβασής σας για επιβεβαίωση",
"typeHere": "Πληκτρολογήστε εδώ",
"fileName": "Εισάγετε όνομα αρχείου (π.χ. example.txt)",
"folderName": "Εισάγετε όνομα φακέλου",
"fullPath": "Εισάγετε την πλήρη διαδρομή για το στοιχείο",
"currentPath": "Εισάγετε την τρέχουσα διαδρομή για το στοιχείο",
"newName": "Εισάγετε νέο όνομα",
"socks5Host": "127.0.0.1",
"socks5Username": "όνομα διακομιστή μεσολάβησης",
"socks5Password": "κωδικός διακομιστή μεσολάβησης",
"socks5PresetName": "π.χ., Αλυσίδα VPN Εργασίας",
"socks5PresetDescription": "π.χ., Διαμεσολαβητική αλυσίδα για πρόσβαση σε διακομιστές εργασίας",
"moshCommand": "mosh user@server",
"defaultPort": "22",
"defaultEndpointPort": "224",
"defaultMaxRetries": "3",
"defaultRetryInterval": "10"
},
"leftSidebar": {
"failedToLoadHosts": "Αποτυχία φόρτωσης υπολογιστών",
"noFolder": "Χωρίς Φάκελο",
"passwordRequired": "Απαιτείται κωδικός πρόσβασης",
"failedToDeleteAccount": "Αποτυχία διαγραφής λογαριασμού",
"failedToMakeUserAdmin": "Αποτυχία δημιουργίας διαχειριστή χρήστη",
"userIsNowAdmin": "Ο χρήστης {{username}} είναι τώρα διαχειριστής",
"removeAdminConfirm": "Είστε βέβαιοι ότι θέλετε να καταργήσετε την κατάσταση διαχειριστή από το {{username}}?",
"deleteUserConfirm": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το χρήστη {{username}}? Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"deleteAccount": "Διαγραφή Λογαριασμού",
"closeDeleteAccount": "Κλείσιμο Διαγραφής Λογαριασμού",
"deleteAccountWarning": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Αυτό θα διαγράψει οριστικά το λογαριασμό σας και όλα τα συσχετισμένα δεδομένα.",
"deleteAccountWarningDetails": "Η διαγραφή του λογαριασμού σας θα καταργήσει όλα τα δεδομένα σας, συμπεριλαμβανομένων SSH hosts, διαμορφώσεις και ρυθμίσεις. Αυτή η ενέργεια είναι μη αναστρέψιμη.",
"deleteAccountWarningShort": "Αυτή η ενέργεια δεν είναι αναστρέψιμη και θα διαγράψει οριστικά το λογαριασμό σας.",
"cannotDeleteAccount": "Αδυναμία Διαγραφής Λογαριασμού",
"lastAdminWarning": "Είστε ο τελευταίος χρήστης διαχειριστή. Δεν μπορείτε να διαγράψετε το λογαριασμό σας, καθώς αυτό θα άφηνε το σύστημα χωρίς διαχειριστές. Παρακαλώ κάντε έναν άλλο χρήστη πρώτα διαχειριστή, ή επικοινωνήστε με την υποστήριξη συστήματος.",
"confirmPassword": "Επιβεβαίωση Κωδικού Πρόσβασης",
"deleting": "Διαγραφή...",
"cancel": "Ακύρωση"
},
"interface": {
"sidebar": "Sidebar",
"toggleSidebar": "Εναλλαγή Πλευρικής Μπάρας",
"close": "Κλείσιμο",
"online": "Συνδεδεμένος",
"offline": "Αποσυνδεδεμένος",
"maintenance": "Συντήρηση",
"degraded": "Μειώθηκε",
"noTunnelConnections": "Δεν έχουν ρυθμιστεί συνδέσεις διοχέτευσης",
"discord": "Discord",
"connectToSshForOperations": "Συνδεθείτε στο SSH για να χρησιμοποιήσετε λειτουργίες αρχείων",
"uploadFile": "Μεταφόρτωση Αρχείου",
"newFile": "Νέο Αρχείο",
"newFolder": "Νέος Φάκελος",
"rename": "Μετονομασία",
"deleteItem": "Διαγραφή Αντικειμένου",
"createNewFile": "Δημιουργία Νέου Αρχείου",
"createNewFolder": "Δημιουργία Νέου Φακέλου",
"renameItem": "Μετονομασία Αντικειμένου",
"clickToSelectFile": "Κάντε κλικ για να επιλέξετε ένα αρχείο",
"noSshHosts": "Δεν Υπάρχουν Υπολογιστές SSH",
"sshHosts": "SSH Hosts",
"importSshHosts": "Εισαγωγή SSH Hosts από JSON",
"clientId": "Ταυτότητα Πελάτη",
"clientSecret": "Μυστικό Πελάτη",
"error": "Σφάλμα",
"warning": "Προειδοποίηση",
"deleteAccount": "Διαγραφή Λογαριασμού",
"closeDeleteAccount": "Κλείσιμο Διαγραφής Λογαριασμού",
"cannotDeleteAccount": "Αδυναμία Διαγραφής Λογαριασμού",
"confirmPassword": "Επιβεβαίωση Κωδικού Πρόσβασης",
"deleting": "Διαγραφή...",
"externalAuth": "Εξωτερική Ταυτοποίηση (OIDC)",
"configureExternalProvider": "Ρύθμιση παρόχου εξωτερικής ταυτότητας για",
"waitingForRetry": "Αναμονή για επανάληψη",
"retryingConnection": "Επανάληψη σύνδεσης",
"resetSplitSizes": "Επαναφορά διαχωρισμένων μεγεθών",
"sshManagerAlreadyOpen": "Ο Διαχειριστής SSH είναι ήδη ανοιχτός",
"disabledDuringSplitScreen": "Απενεργοποιημένο κατά την διαίρεση οθόνης",
"unknown": "Άγνωστο",
"connected": "Συνδεδεμένο",
"disconnected": "Αποσυνδέθηκε",
"maxRetriesExhausted": "Max retries εξαντληθεί",
"endpointHostNotFound": "Ο κεντρικός υπολογιστής τελικού σημείου δεν βρέθηκε",
"administrator": "Διαχειριστής",
"user": "Χρήστης",
"external": "Εξωτερικό",
"local": "Τοπικό",
"saving": "Αποθηκεύεται...",
"saveConfiguration": "Αποθήκευση Ρυθμίσεων",
"loading": "Φόρτωση...",
"refresh": "Ανανέωση",
"adding": "Προσθήκη...",
"makeAdmin": "Δημιουργία Διαχειριστή",
"verifying": "Επαλήθευση...",
"verifyAndEnable": "Επαλήθευση και ενεργοποίηση",
"secretKey": "Μυστικό κλειδί",
"totpQrCode": "TOTP QR Code",
"passwordRequired": "Απαιτείται κωδικός πρόσβασης κατά τη χρήση ταυτοποίησης κωδικού",
"sshKeyRequired": "Το Ιδιωτικό Κλειδί SSH απαιτείται όταν χρησιμοποιείται έλεγχος ταυτότητας κλειδιού",
"keyTypeRequired": "Ο τύπος κλειδιού απαιτείται όταν χρησιμοποιείτε έλεγχο ταυτότητας κλειδιού",
"validSshConfigRequired": "Πρέπει να επιλέξετε μια έγκυρη διαμόρφωση SSH από τη λίστα",
"updateHost": "Διακομιστής Ενημέρωσης",
"addHost": "Προσθήκη Διακομιστή",
"editHost": "Επεξεργασία Υπολογιστή",
"pinConnection": "Σύνδεση Καρφιτσών",
"authentication": "Ταυτοποίηση",
"password": "Κωδικός",
"key": "Κλειδί",
"sshPrivateKey": "Ιδιωτικό Κλειδί SSH",
"keyPassword": "Κωδικός Πρόσβασης Κλειδιού",
"keyType": "Τύπος Κλειδιού",
"enableTerminal": "Ενεργοποίηση Τερματικού",
"enableTunnel": "Ενεργοποίηση Tunnel",
"enableFileManager": "Ενεργοποίηση Διαχειριστή Αρχείων",
"defaultPath": "Προεπιλεγμένη Διαδρομή",
"tunnelConnections": "Συνδέσεις Tunnel",
"maxRetries": "Μέγιστες Επαναλήψεις",
"upload": "Ανέβασμα",
"updateKey": "Ενημέρωση Κλειδιού",
"productionFolder": "Παραγωγή",
"databaseServer": "Εξυπηρετητής Βάσης Δεδομένων",
"developmentServer": "Εξυπηρετητής Ανάπτυξης",
"developmentFolder": "Ανάπτυξη",
"webServerProduction": "Διακομιστής Ιστοσελίδων - Παραγωγή",
"unknownError": "Άγνωστο σφάλμα",
"failedToInitiatePasswordReset": "Αποτυχία έναρξης επαναφοράς κωδικού πρόσβασης",
"failedToVerifyResetCode": "Αποτυχία επαλήθευσης κωδικού επαναφοράς",
"failedToCompletePasswordReset": "Αποτυχία ολοκλήρωσης της επαναφοράς κωδικού πρόσβασης",
"invalidTotpCode": "Invalid TOTP code",
"failedToStartOidcLogin": "Αποτυχία έναρξης σύνδεσης OIDC",
"failedToGetUserInfoAfterOidc": "Αποτυχία λήψης πληροφοριών χρήστη μετά την σύνδεση OIDC",
"loginWithExternalProvider": "Σύνδεση με εξωτερικό πάροχο",
"loginWithExternal": "Συνδεθείτε με τον εξωτερικό πάροχο",
"sendResetCode": "Αποστολή Κωδικού Επαναφοράς",
"verifyCode": "Επαλήθευση Κωδικού",
"resetPassword": "Επαναφορά Κωδικού Πρόσβασης",
"login": "Είσοδος",
"signUp": "Εγγραφή",
"failedToUpdateOidcConfig": "Αποτυχία ενημέρωσης παραμέτρων OIDC",
"failedToMakeUserAdmin": "Αποτυχία δημιουργίας διαχειριστή χρήστη",
"failedToStartTotpSetup": "Αποτυχία έναρξης εγκατάστασης TOTP",
"invalidVerificationCode": "Μη έγκυρος κωδικός επαλήθευσης",
"failedToDisableTotp": "Αποτυχία απενεργοποίησης TOTP",
"failedToGenerateBackupCodes": "Αποτυχία δημιουργίας εφεδρικών κωδικών"
},
"mobile": {
"selectHostToStart": "Επιλέξτε έναν διακομιστή για να ξεκινήσετε τη συνεδρία τερματικού",
"limitedSupportMessage": "Η υποστήριξη της ιστοσελίδας για κινητά είναι ακόμα σε εξέλιξη. Χρησιμοποιήστε την εφαρμογή για κινητά για καλύτερη εμπειρία.",
"mobileAppInProgress": "Η εφαρμογή για κινητά βρίσκεται σε εξέλιξη",
"mobileAppInProgressDesc": "Εργαζόμαστε σε μια ειδική εφαρμογή για κινητά για να παρέχουμε μια καλύτερη εμπειρία σε κινητές συσκευές.",
"viewMobileAppDocs": "Εγκατάσταση Εφαρμογής Για Κινητά",
"mobileAppDocumentation": "Τεκμηρίωση Εφαρμογής Για Κινητά"
},
"dashboard": {
"title": "Ταμπλό",
"loading": "Φόρτωση ταμπλό...",
"github": "GitHub",
"support": "Υποστήριξη",
"discord": "Discord",
"donate": "Δωρεά",
"serverOverview": "Επισκόπηση Διακομιστή",
"version": "Έκδοση",
"upToDate": "Έως την ημερομηνία",
"updateAvailable": "Διαθέσιμη Ενημέρωση",
"uptime": "Χρόνος",
"database": "Βάση Δεδομένων",
"healthy": "Υγιείς",
"error": "Σφάλμα",
"totalServers": "Σύνολο Εξυπηρετητών",
"totalTunnels": "Σύνολο Σηράγγων",
"totalCredentials": "Σύνολο Διαπιστευτηρίων",
"recentActivity": "Πρόσφατη Δραστηριότητα",
"reset": "Reset",
"loadingRecentActivity": "Φόρτωση πρόσφατης δραστηριότητας...",
"noRecentActivity": "Καμία πρόσφατη δραστηριότητα",
"quickActions": "Γρήγορες Ενέργειες",
"addHost": "Προσθήκη Διακομιστή",
"addCredential": "Προσθήκη Διαπιστευτηρίου",
"adminSettings": "Ρυθμίσεις Διαχειριστή",
"userProfile": "Προφίλ Χρήστη",
"serverStats": "Στατιστικά Διακομιστή",
"loadingServerStats": "Φόρτωση στατιστικών διακομιστή...",
"noServerData": "Δεν υπάρχουν διαθέσιμα δεδομένα διακομιστή",
"cpu": "Επεξεργαστής",
"ram": "RAM",
"notAvailable": "Δ/Υ",
"customizeLayout": "Προσαρμογή Πίνακα Ελέγχου",
"dashboardSettings": "Ρυθμίσεις Ταμπλό",
"enableDisableCards": "Ενεργοποίηση/Απενεργοποίηση Καρτών",
"resetLayout": "Επαναφορά προεπιλογών",
"serverOverviewCard": "Επισκόπηση Διακομιστή",
"recentActivityCard": "Πρόσφατη Δραστηριότητα",
"networkGraphCard": "Γράφημα Δικτύου",
"networkGraph": "Γράφημα Δικτύου",
"quickActionsCard": "Γρήγορες Ενέργειες",
"serverStatsCard": "Στατιστικά Διακομιστή"
},
"networkGraph": {
"title": "Γράφημα Δικτύου",
"addHost": "Προσθήκη Διακομιστή",
"addGroup": "Προσθήκη Ομάδας",
"addLink": "Προσθήκη Συνδέσμου",
"deleteSelected": "Διαγραφή Επιλεγμένων",
"zoomIn": "Μεγέθυνση",
"zoomOut": "Σμίκρυνση",
"resetView": "Επαναφορά Προβολής",
"exportJson": "Εξαγωγή JSON",
"importJson": "Εισαγωγή JSON",
"selectHost": "Επιλογή Διακομιστή",
"chooseHost": "Επιλογή κεντρικού υπολογιστή...",
"parentGroup": "Γονική Ομάδα",
"noGroup": "Καμία Ομάδα",
"groupName": "Όνομα Ομάδας",
"color": "Χρώμα",
"source": "Πηγή",
"target": "Target",
"moveToGroup": "Μετακίνηση στην ομάδα",
"selectGroup": "Επιλογή ομάδας...",
"addConnection": "Προσθήκη Σύνδεσης",
"hostDetails": "Λεπτομέρειες Υπολογιστή",
"connectToHost": "Σύνδεση στον εξυπηρετητή",
"openTerminal": "Άνοιγμα Τερματικού",
"openFileManager": "Άνοιγμα Διαχειριστή Αρχείων",
"openTunnel": "Άνοιγμα Σηράγγων",
"openDocker": "Άνοιγμα Προσάρτησης",
"openServerStats": "Άνοιγμα Λεπτομερειών Διακομιστή",
"moveToGroupAction": "Μετακίνηση στην ομάδα",
"removeFromGroup": "Αφαίρεση από την ομάδα",
"addHostHere": "Προσθήκη Υπολογιστή Εδώ",
"editGroup": "Επεξεργασία Ομάδας",
"delete": "Διαγραφή",
"cancel": "Ακύρωση",
"add": "Προσθήκη",
"create": "Δημιουργία",
"update": "Ενημέρωση",
"move": "Μετακίνηση",
"connect": "Σύνδεση",
"close": "Κλείσιμο",
"createGroup": "Δημιουργία Ομάδας",
"noAvailableHosts": "Δεν υπάρχουν διαθέσιμοι υπολογιστές",
"selectSourcePlaceholder": "Επιλογή Πηγής...",
"selectTargetPlaceholder": "Select Target...",
"invalidFile": "Μη Έγκυρο Αρχείο",
"hostAlreadyExists": "Ο οικοδεσπότης βρίσκεται ήδη στην τοπολογία",
"sourceTargetMustDiffer": "Η πηγή και ο στόχος πρέπει να είναι διαφορετικοί",
"connectionExists": "Η σύνδεση υπάρχει ήδη",
"unknown": "Άγνωστο",
"name": "Όνομα",
"ip": "IP",
"status": "Κατάσταση",
"id": "ID",
"failedToLoadData": "Αποτυχία φόρτωσης δεδομένων τοπολογίας δικτύου",
"failedToAddNode": "Αποτυχία προσθήκης κόμβου",
"sourceDifferentFromTarget": "Η πηγή και ο στόχος πρέπει να είναι διαφορετικοί",
"exportJSON": "Εξαγωγή JSON",
"importJSON": "Εισαγωγή JSON",
"searchHost": "Αναζήτηση υπολογιστών...",
"noHostFound": "Δεν βρέθηκαν υπολογιστές",
"searchGroup": "Αναζήτηση ομάδων...",
"noGroupFound": "Δεν βρέθηκαν ομάδες",
"searchNode": "Αναζήτηση κόμβων...",
"noNodeFound": "Δεν βρέθηκαν κόμβοι",
"terminal": "Τερματικό",
"fileManager": "Διαχειριστής Αρχείων",
"tunnel": "Σήραγγα",
"docker": "Προσάρτηση",
"serverStats": "Στατιστικά Διακομιστή"
},
"rbac": {
"shareHost": "Κοινοποίηση Διακομιστή",
"shareHostTitle": "Κοινή Χρήση Πρόσβασης Διακομιστή",
"shareHostDescription": "Παραχώρηση προσωρινής ή μόνιμης πρόσβασης σε αυτόν τον κεντρικό υπολογιστή",
"targetUser": "Χρήστης Προορισμού",
"selectUser": "Επιλέξτε έναν χρήστη με τον οποίο θα μοιραστείτε",
"duration": "Διάρκεια",
"durationHours": "Διάρκεια (ώρες)",
"neverExpires": "Ποτέ δεν λήγει",
"permissionLevel": "Επίπεδο Δικαιωμάτων",
"permissionLevels": {
"readonly": "Μόνο Για Ανάγνωση",
"readonlyDesc": "Μπορεί να δει μόνο, καμία εισαγωγή εντολής",
"restricted": "Περιορισμένη",
"restrictedDesc": "Μπλοκάρει επικίνδυνες εντολές (passwd, rm -rf, κλπ.)",
"monitored": "Ελέγχτηκε",
"monitoredDesc": "Καταγράφει όλες τις εντολές, αλλά δεν αποκλείει (Προτείνεται)",
"full": "Πλήρης Πρόσβαση",
"fullDesc": "Δεν υπάρχουν περιορισμοί (δεν συνιστάται)"
},
"blockedCommands": "Αποκλεισμένες Εντολές",
"blockedCommandsPlaceholder": "Εισάγετε εντολές για μπλοκ, π.χ. passwd, rm, dd",
"maxSessionDuration": "Μέγιστη Διάρκεια Συνεδρίας (Λεπτά)",
"createTempUser": "Δημιουργία Προσωρινού Χρήστη",
"createTempUserDesc": "Δημιουργεί έναν περιορισμένο χρήστη στο διακομιστή αντί να μοιράζονται τα διαπιστευτήριά σας. Απαιτεί ασφαλή πρόσβαση. Πιο ασφαλή επιλογή.",
"expiresAt": "Λήγει Στις",
"expiresIn": "Λήγει σε {{hours}} ώρες",
"expired": "Έληξε",
"grantedBy": "Χορηγήθηκε Από",
"accessLevel": "Επίπεδο Πρόσβασης",
"lastAccessed": "Τελευταία Πρόσβαση",
"accessCount": "Αριθμός Πρόσβασης",
"revokeAccess": "Ανάκληση Πρόσβασης",
"confirmRevokeAccess": "Είστε βέβαιοι ότι θέλετε να ανακαλέσετε την πρόσβαση για {{username}}?",
"hostSharedSuccessfully": "Ο υπολογιστής μοιράστηκε επιτυχώς με το {{username}}",
"hostAccessUpdated": "Η πρόσβαση στον υπολογιστή ενημερώθηκε",
"failedToShareHost": "Αποτυχία κοινής χρήσης κεντρικού υπολογιστή",
"accessRevokedSuccessfully": "Η πρόσβαση ανακλήθηκε επιτυχώς",
"failedToRevokeAccess": "Αποτυχία ανάκλησης πρόσβασης",
"shared": "Κοινόχρηστο",
"sharedHosts": "Κοινόχρηστοι Υπολογιστές",
"sharedWithMe": "Κοινή Χρήση Με Μου",
"noSharedHosts": "Κανένας υπολογιστής δεν μοιράστηκε μαζί σας",
"owner": "Ιδιοκτήτης",
"viewAccessList": "Προβολή Λίστας Πρόσβασης",
"accessList": "Λίστα Πρόσβασης",
"noAccessGranted": "Δεν έχει χορηγηθεί πρόσβαση για αυτόν τον υπολογιστή",
"noAccessGrantedMessage": "Κανένας χρήστης δεν έχει ακόμη πρόσβαση σε αυτόν τον υπολογιστή",
"manageAccessFor": "Διαχείριση πρόσβασης για",
"totalAccessRecords": "{{count}} εγγραφή(εις) πρόσβασης",
"neverAccessed": "Ποτέ",
"timesAccessed": "{{count}} φορά(ες)",
"daysRemaining": "{{days}} ημέρα(ες)",
"hoursRemaining": "{{hours}} ώρα(ες)",
"failedToFetchAccessList": "Αποτυχία λήψης της λίστας πρόσβασης",
"currentAccess": "Τρέχουσα Πρόσβαση",
"securityWarning": "Προειδοποίηση Ασφαλείας",
"securityWarningMessage": "Τα διαπιστευτήρια κοινής χρήσης παρέχουν στο χρήστη πλήρη πρόσβαση για να εκτελέσει οποιαδήποτε λειτουργία στο διακομιστή, συμπεριλαμβανομένης της αλλαγής κωδικών πρόσβασης και της διαγραφής αρχείων. Κοινή χρήση μόνο με αξιόπιστους χρήστες.",
"tempUserRecommended": "Σας συνιστούμε να ενεργοποιήσετε το 'Δημιουργία Προσωρινού Χρήστη' για καλύτερη ασφάλεια.",
"roleManagement": "Διαχείριση Ρόλων",
"manageRoles": "Διαχείριση Ρόλων",
"manageRolesFor": "Διαχείριση ρόλων για το {{username}}",
"assignRole": "Εκχώρηση Ρόλου",
"removeRole": "Αφαίρεση Ρόλου",
"userRoles": "Ρόλοι Χρήστη",
"permissions": "Δικαιώματα",
"systemRole": "Ρόλος Συστήματος",
"customRole": "Προσαρμοσμένος Ρόλος",
"roleAssignedSuccessfully": "Ο ρόλος ανατέθηκε με επιτυχία στον {{username}}",
"failedToAssignRole": "Αποτυχία αντιστοίχισης ρόλου",
"roleRemovedSuccessfully": "Ο ρόλος αφαιρέθηκε από το {{username}} με επιτυχία",
"failedToRemoveRole": "Αποτυχία κατάργησης ρόλου",
"cannotRemoveSystemRole": "Αδυναμία κατάργησης ρόλου συστήματος",
"cannotShareWithSelf": "Δεν είναι δυνατή η κοινή χρήση κεντρικού υπολογιστή με τον εαυτό σας",
"noCustomRolesToAssign": "Δεν υπάρχουν διαθέσιμοι προσαρμοσμένοι ρόλοι. Οι ρόλοι συστήματος έχουν οριστεί αυτόματα.",
"credentialSharingWarning": "Η πιστοποίηση διαπιστευτηρίων δεν υποστηρίζεται για κοινή χρήση",
"credentialRequired": "Απαιτείται διαπιστευτήριο κατά την κοινή χρήση ενός κεντρικού υπολογιστή",
"credentialRequiredDescription": "Αυτός ο υπολογιστής δεν χρησιμοποιεί έλεγχο ταυτότητας με βάση τα διαπιστευτήρια. Για να μοιραστεί τους υπολογιστές υπολογιστών, λόγω της κρυπτογράφησης ανά χρήστη, ο υπολογιστής πρέπει να χρησιμοποιεί έλεγχο ταυτότητας με βάση τα διαπιστευτήρια.",
"auditLogs": "Αρχεία Καταγραφής Ελέγχου",
"viewAuditLogs": "Προβολή Αρχείων Καταγραφής Ελέγχου",
"action": "Ενέργεια",
"resourceType": "Τύπος Πόρου",
"resourceName": "Όνομα Πόρου",
"timestamp": "Χρονοσήμανση",
"ipAddress": "Διεύθυνση IP",
"userAgent": "Πράκτορας Χρήστη",
"success": "Επιτυχία",
"failed": "Απέτυχε",
"details": "Λεπτομέρειες",
"noAuditLogs": "Δεν υπάρχουν διαθέσιμα αρχεία καταγραφής ελέγχου",
"sessionRecordings": "Εγγραφές Συνεδρίας",
"viewRecording": "Προβολή Εγγραφής",
"downloadRecording": "Λήψη Εγγραφής",
"dangerousCommand": "Εντοπίστηκε Επικίνδυνη Εντολή",
"commandBlocked": "Η Εντολή Αποκλείστηκε",
"terminateSession": "Τερματισμός Συνεδρίας",
"sessionTerminated": "Η συνεδρία τερματίστηκε από τον ιδιοκτήτη του κεντρικού υπολογιστή",
"sharedAccessExpired": "Η κοινόχρηστη πρόσβασή σας σε αυτόν τον υπολογιστή έχει λήξει",
"sharedAccessExpiresIn": "Η κοινόχρηστη πρόσβαση λήγει σε {{hours}} ώρες",
"roles": {
"label": "Ρόλοι",
"admin": "Διαχειριστής",
"user": "Χρήστης"
},
"createRole": "Δημιουργία Ρόλου",
"editRole": "Επεξεργασία Ρόλου",
"roleName": "Όνομα Ρόλου",
"displayName": "Εμφανιζόμενο Όνομα",
"description": "Περιγραφή",
"assignRoles": "Ανάθεση Ρόλων",
"userRoleAssignment": "Ανάθεση Ρόλου Χρήστη",
"selectUserPlaceholder": "Επιλέξτε ένα χρήστη",
"searchUsers": "Αναζήτηση χρηστη...",
"noUserFound": "Δεν βρέθηκε χρήστης",
"currentRoles": "Τρέχοντες Ρόλοι",
"noRolesAssigned": "Δεν έχουν ανατεθεί ρόλοι",
"assignNewRole": "Εκχώρηση Νέου Ρόλου",
"selectRolePlaceholder": "Επιλέξτε ένα ρόλο",
"searchRoles": "Αναζήτηση ρόλων...",
"noRoleFound": "Δεν βρέθηκε ρόλος",
"assign": "Ανάθεση",
"roleCreatedSuccessfully": "Ο ρόλος δημιουργήθηκε με επιτυχία",
"roleUpdatedSuccessfully": "Ο ρόλος ενημερώθηκε επιτυχώς",
"roleDeletedSuccessfully": "Ο ρόλος διαγράφηκε επιτυχώς",
"failedToLoadRoles": "Αποτυχία φόρτωσης ρόλων",
"failedToSaveRole": "Αποτυχία αποθήκευσης ρόλου",
"failedToDeleteRole": "Αποτυχία διαγραφής ρόλου",
"roleDisplayNameRequired": "Το όνομα εμφάνισης ρόλου απαιτείται",
"roleNameRequired": "Απαιτείται όνομα ρόλου",
"roleNameHint": "Χρησιμοποιήστε πεζά γράμματα, αριθμούς, κάτω παύλες και παύλες μόνο",
"displayNamePlaceholder": "Προγραμματιστής",
"descriptionPlaceholder": "Προγραμματιστές και μηχανικοί λογισμικού",
"confirmDeleteRole": "Διαγραφή Ρόλου",
"confirmDeleteRoleDescription": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το ρόλο '{{name}}'? Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"confirmRemoveRole": "Αφαίρεση Ρόλου",
"confirmRemoveRoleDescription": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε αυτό το ρόλο από το χρήστη?",
"editRoleDescription": "Ενημέρωση πληροφοριών ρόλου",
"createRoleDescription": "Δημιουργία ενός νέου προσαρμοσμένου ρόλου για την ομαδοποίηση χρηστών",
"assignRolesDescription": "Διαχείριση εκχωρήσεων ρόλου για τους χρήστες",
"noRoles": "Δεν βρέθηκαν ρόλοι",
"selectRole": "Επιλογή Ρόλου",
"type": "Τύπος",
"user": "Χρήστης",
"role": "Ρόλος",
"saveHostFirst": "Αποθήκευση Υπολογιστή Πρώτα",
"saveHostFirstDescription": "Παρακαλώ αποθηκεύστε τον κεντρικό υπολογιστή πριν ρυθμίσετε τις ρυθμίσεις κοινής χρήσης.",
"shareWithUser": "Κοινή χρήση με το χρήστη",
"shareWithRole": "Κοινή χρήση με το ρόλο",
"share": "Κοινοποίηση",
"target": "Target",
"expires": "Λήγει",
"never": "Ποτέ",
"noAccessRecords": "Δεν βρέθηκαν εγγραφές πρόσβασης",
"sharedSuccessfully": "Επιτυχής κοινοποίηση",
"failedToShare": "Αποτυχία κοινοποίησης",
"confirmRevokeAccessDescription": "Είστε βέβαιοι ότι θέλετε να ανακαλέσετε αυτή την πρόσβαση?",
"hours": "ώρες",
"sharing": "Κοινή χρήση",
"selectUserAndRole": "Παρακαλώ επιλέξτε τόσο έναν χρήστη όσο και ένα ρόλο",
"view": "Προβολή Μόνο",
"viewDesc": "Λόγω του συστήματος κρυπτογράφησης Termix, άλλα επίπεδα δικαιωμάτων θα έρθουν σε μεταγενέστερη ημερομηνία"
},
"commandPalette": {
"searchPlaceholder": "Αναζήτηση για οικοδεσπότες ή γρήγορες ενέργειες...",
"recentActivity": "Πρόσφατη Δραστηριότητα",
"navigation": "Navigation",
"addHost": "Προσθήκη Διακομιστή",
"addCredential": "Προσθήκη Διαπιστευτηρίου",
"adminSettings": "Ρυθμίσεις Διαχειριστή",
"userProfile": "Προφίλ Χρήστη",
"updateLog": "Ενημέρωση Αρχείου Καταγραφής",
"hosts": "Υπολογιστές",
"openServerDetails": "Άνοιγμα Λεπτομερειών Διακομιστή",
"openFileManager": "Άνοιγμα Διαχειριστή Αρχείων",
"edit": "Επεξεργασία",
"links": "Σύνδεσμοι",
"github": "GitHub",
"support": "Υποστήριξη",
"discord": "Discord",
"donate": "Δωρεά",
"press": "Τύπος",
"toToggle": "για εναλλαγή",
"close": "Κλείσιμο",
"hostManager": "Διαχειριστής Υπολογιστών",
"pressToToggle": "Πατήστε το πλήκτρο Left Shift δύο φορές για να ανοίξετε την παλέτα εντολών"
},
"docker": {
"notEnabled": "Το Docker δεν είναι ενεργοποιημένο για αυτόν τον υπολογιστή",
"validating": "Επικύρωση Docker...",
"connectingToHost": "Σύνδεση στον υπολογιστή...",
"connecting": "Σύνδεση...",
"error": "Σφάλμα",
"errorCode": "Κωδικός σφάλματος: {{code}}",
"version": "Docker {{version}}",
"connectionFailed": "Αποτυχία σύνδεσης στο Docker",
"totpVerificationFailed": "Η επαλήθευση TOTP απέτυχε. Παρακαλώ προσπαθήστε ξανά.",
"warpgateVerificationFailed": "Η ταυτοποίηση Warpgate απέτυχε. Παρακαλώ προσπαθήστε ξανά.",
"verificationCodePrompt": "Εισάγετε τον κωδικό επαλήθευσης",
"loadingContainers": "Φόρτωση εμπορευματοκιβωτίων...",
"containerStarted": "Το κοντέινερ {{name}} ξεκίνησε",
"failedToStartContainer": "Αποτυχία εκκίνησης κοντέινερ {{name}}",
"containerStopped": "Το κοντέινερ {{name}} σταμάτησε",
"failedToStopContainer": "Αποτυχία διακοπής του κοντέινερ {{name}}",
"containerRestarted": "Container {{name}} επανεκκινήθηκε",
"failedToRestartContainer": "Απέτυχε η επανεκκίνηση του container {{name}}",
"containerPaused": "Το κοντέινερ {{name}} τέθηκε σε παύση",
"containerUnpaused": "Container {{name}} unpaused",
"failedToTogglePauseContainer": "Αποτυχία εναλλαγής κατάστασης παύσης για το κοντέινερ {{name}}",
"containerRemoved": "Το κοντέινερ {{name}} αφαιρέθηκε",
"failedToRemoveContainer": "Αποτυχία κατάργησης του κοντέινερ {{name}}",
"image": "Εικόνα",
"idLabel": "ID",
"ports": "Θύρες",
"noPorts": "Δεν υπάρχουν θύρες",
"created": "Δημιουργήθηκε",
"start": "Έναρξη",
"stop": "Διακοπή",
"pause": "Παύση",
"unpause": "Unpause",
"restart": "Επανεκκίνηση",
"remove": "Αφαίρεση",
"removeContainer": "Αφαίρεση Περιέκτη",
"confirmRemoveContainer": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το δοχείο '{{name}}'? Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"runningContainerWarning": "Προειδοποίηση: Αυτό το δοχείο εκτελείται αυτή τη στιγμή. Η αφαίρεση του θα σταματήσει πρώτα τον περιέκτη.",
"removing": "Κατάργηση...",
"noContainersFound": "Δεν βρέθηκαν εμπορευματοκιβώτια",
"noContainersFoundHint": "Δεν υπάρχουν διαθέσιμα δοχεία Docker σε αυτόν τον υπολογιστή",
"searchPlaceholder": "Αναζήτηση εμπορευματοκιβωτίων...",
"filterByStatusPlaceholder": "Φιλτράρισμα ανά κατάσταση",
"allContainersCount": "Όλα ({{count}})",
"statusCount": "{{status}} ({{count}})",
"noContainersMatchFilters": "Κανένα δοχείο δεν ταιριάζει με τα φίλτρα σας",
"noContainersMatchFiltersHint": "Δοκιμάστε να προσαρμόσετε τα κριτήρια αναζήτησης ή φίλτρου",
"containerMustBeRunningToViewStats": "Το δοχείο πρέπει να εκτελείται για να δείτε τα στατιστικά στοιχεία",
"failedToFetchStats": "Αποτυχία λήψης στατιστικών στοιχείων εμπορευματοκιβωτίων",
"containerNotRunning": "Ο περιέκτης δεν εκτελείται",
"startContainerToViewStats": "Εκκίνηση του περιέκτη για προβολή στατιστικών",
"loadingStats": "Φόρτωση στατιστικών...",
"errorLoadingStats": "Σφάλμα φόρτωσης στατιστικών",
"noStatsAvailable": "Δεν υπάρχουν διαθέσιμα στατιστικά στοιχεία",
"cpuUsage": "Χρήση CPU",
"current": "Τρέχων",
"memoryUsage": "Χρήση Μνήμης",
"usedLimit": "Χρησιμοποιείται / Όριο",
"percentage": "Ποσοστό",
"networkIo": "Δίκτυο I/O",
"input": "Input",
"output": "Έξοδος",
"blockIo": "Αποκλεισμός I/O",
"read": "Ανάγνωση",
"write": "Εγγραφή",
"pids": "PID",
"containerInformation": "Πληροφορίες Περιέκτη",
"name": "Όνομα",
"id": "ID",
"state": "Κατάσταση",
"disconnectedFromContainer": "Αποσυνδέθηκε από περιέκτη",
"containerMustBeRunning": "Ο περιέκτης πρέπει να εκτελείται για πρόσβαση στην κονσόλα",
"authenticationRequired": "Απαιτείται πιστοποίηση",
"connectedTo": "Συνδεδεμένο με {{containerName}}",
"disconnected": "Αποσυνδέθηκε",
"consoleError": "Σφάλμα κονσόλας",
"errorMessage": "Σφάλμα: {{message}}",
"failedToConnect": "Αποτυχία σύνδεσης με τον περιέκτη",
"console": "Κονσόλα",
"selectShell": "Επιλογή κελύφους",
"bash": "Bash",
"sh": "sh",
"ash": "τέφρα",
"connect": "Σύνδεση",
"disconnect": "Αποσύνδεση",
"notConnected": "Δεν συνδέθηκε",
"clickToConnect": "Κάντε κλικ στη σύνδεση για να ξεκινήσετε μια συνεδρία κελύφους",
"connectingTo": "Σύνδεση με {{containerName}}...",
"containerNotFound": "Ο περιέκτης δεν βρέθηκε",
"backToList": "Πίσω στη Λίστα",
"logs": "Καταγραφή",
"stats": "Στατιστικά",
"consoleTab": "Κονσόλα",
"startContainerToAccess": "Εκκίνηση του περιέκτη για πρόσβαση στην κονσόλα",
"log": {
"connecting": "Σύνδεση στο Docker host...",
"authStarted": "Επίλυση διαπιστευτηρίων πιστοποίησης...",
"totpRequired": "Απαιτείται επαλήθευση TOTP",
"warpgateRequired": "Απαιτείται έλεγχος ταυτότητας Warpgate",
"sessionCreated": "Ιδρύθηκε συνεδρία Docker SSH",
"sessionReady": "Έτοιμο για λειτουργίες Docker",
"error": "Η σύνδεση Docker απέτυχε: {{error}}"
}
},
"stats": {
"log": {
"connecting": "Έναρξη συλλογής μετρήσεων...",
"existingSession": "Χρήση υπάρχουσας συνεδρίας μέτρησης",
"totpVerifying": "Απαιτείται επαλήθευση TOTP",
"sessionEstablished": "Ιδρύθηκε συνεδρία μετρήσεων",
"collecting": "Συλλογή μετρήσεων διακομιστή",
"heartbeat": "Διατήρηση της σύνδεσης ζωντανής",
"stopped": "Η συλλογή μετρικών σταμάτησε",
"error": "Η συλλογή μετρήσεων απέτυχε: {{error}}"
}
},
"sftp": {
"log": {
"connecting": "Σύνδεση σε διακομιστή SFTP...",
"jumpHost": "Σύνδεση μέσω jump host {{host}}...",
"connected": "Ιδρύθηκε σύνδεση SFTP",
"authFailed": "Αποτυχία ταυτοποίησης",
"error": "Η λειτουργία SFTP απέτυχε: {{error}}"
}
},
"theme": {
"switchToLight": "Εναλλαγή σε φως",
"switchToDark": "Εναλλαγή σε Σκοτεινό"
}
}