Clean commit without large files
This commit is contained in:
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
github: [LukeGus]
|
||||
116
.github/workflows/docker-image.yml
vendored
Normal file
116
.github/workflows/docker-image.yml
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
name: Build and Push Docker Image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- development
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
- '.gitignore'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag_name:
|
||||
description: "Custom tag name for the Docker image"
|
||||
required: false
|
||||
default: ""
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
platforms: arm64
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
driver-opts: |
|
||||
image=moby/buildkit:master
|
||||
network=host
|
||||
|
||||
- name: Cache npm dependencies
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.npm
|
||||
node_modules
|
||||
*/*/node_modules
|
||||
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-node-
|
||||
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ github.ref_name }}-${{ hashFiles('docker/Dockerfile') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-buildx-${{ github.ref_name }}-
|
||||
${{ runner.os }}-buildx-
|
||||
|
||||
- name: Login to Docker Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Determine Docker image tag
|
||||
run: |
|
||||
echo "REPO_OWNER=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
|
||||
if [ "${{ github.event.inputs.tag_name }}" != "" ]; then
|
||||
IMAGE_TAG="${{ github.event.inputs.tag_name }}"
|
||||
elif [ "${{ github.ref }}" == "refs/heads/main" ]; then
|
||||
IMAGE_TAG="latest"
|
||||
elif [ "${{ github.ref }}" == "refs/heads/development" ]; then
|
||||
IMAGE_TAG="development-latest"
|
||||
else
|
||||
IMAGE_TAG="${{ github.ref_name }}-development-latest"
|
||||
fi
|
||||
echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV
|
||||
|
||||
- name: Build and Push Multi-Arch Docker Image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./docker/Dockerfile
|
||||
push: true
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ghcr.io/${{ env.REPO_OWNER }}/termix:${{ env.IMAGE_TAG }}
|
||||
labels: |
|
||||
org.opencontainers.image.source=https://github.com/${{ github.repository }}
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
cache-from: type=local,src=/tmp/.buildx-cache
|
||||
cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
|
||||
build-args: |
|
||||
BUILDKIT_INLINE_CACHE=1
|
||||
BUILDKIT_CONTEXT_KEEP_GIT_DIR=1
|
||||
outputs: type=registry,compression=zstd,compression-level=19
|
||||
|
||||
- name: Move cache
|
||||
run: |
|
||||
rm -rf /tmp/.buildx-cache
|
||||
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
|
||||
|
||||
- name: Delete all untagged image versions
|
||||
if: success()
|
||||
uses: quartx-analytics/ghcr-cleaner@v1
|
||||
with:
|
||||
owner-type: user
|
||||
token: ${{ secrets.GHCR_TOKEN }}
|
||||
repository-owner: ${{ github.repository_owner }}
|
||||
delete-untagged: true
|
||||
|
||||
- name: Cleanup Docker Images Locally
|
||||
if: always()
|
||||
run: |
|
||||
docker image prune -af
|
||||
docker system prune -af --volumes
|
||||
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
/db/
|
||||
13
LICENSE
Normal file
13
LICENSE
Normal file
@@ -0,0 +1,13 @@
|
||||
Copyright 2025 Luke Gustafson
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
87
README.md
Normal file
87
README.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# Repo Stats
|
||||

|
||||

|
||||

|
||||
<a href="https://discord.gg/jVQGdvHDrf"><img alt="Discord" src="https://img.shields.io/discord/1347374268253470720"></a>
|
||||
#### Top Technologies
|
||||
[](#)
|
||||
[](#)
|
||||
[](#)
|
||||
[](#)
|
||||
[](#)
|
||||
[](#)
|
||||
[](#)
|
||||
[](#)
|
||||
|
||||
|
||||
<br />
|
||||
<p align="center">
|
||||
<a href="https://github.com/LukeGus/Termix">
|
||||
<img alt="Termix Banner" src=./public/icon.svg style="width: 250px; height: auto;"> </a>
|
||||
</p>
|
||||
|
||||
If you would like, you can support the project here!\
|
||||
[](https://github.com/sponsors/LukeGus)
|
||||
|
||||
# Overview
|
||||
Termix is an open-source, forever-free, self-hosted all-in-one server management platform. It provides a web-based solution for managing your servers and infrastructure through a single, intuitive interface. Termix offers SSH terminal access, SSH tunneling capabilities, and remote file configuration editing, with many more tools to come.
|
||||
|
||||
# Features
|
||||
- **SSH Terminal Access** - Full-featured terminal with split-screen support (up to 4 panels) and tab system
|
||||
- **SSH Tunnel Management** - Create and manage SSH tunnels with automatic reconnection and health monitoring
|
||||
- **Remote Config Editor** - Edit files directly on remote servers with syntax highlighting and file management
|
||||
- **SSH Host Manager** - Save, organize, and manage your SSH connections with tags and folders
|
||||
- **User Authentication** - Secure user management with admin controls
|
||||
- **Modern UI** - Clean interface built with React, Tailwind CSS, and the amazing Shadcn
|
||||
|
||||
# Planned Features
|
||||
- **Improved Admin Control** - Ability to manage admins, and give more fine-grained control over their permissions, share hosts, reset passwords, delete accounts, etc
|
||||
- **More auth types** - Add 2FA, OCID support, etc
|
||||
- **Theming** - Modify themeing for all tools
|
||||
- **Improved SFTP Support** - Ability to manage files easier with the config editor by uploading, creating, and removing files
|
||||
- **Improved Terminal Support** - Add more terminal protocols such as VNC and RDP (anyone who has experience in integrating RDP into a web-application similar to Apache Guacamole, please contact me by creating an issue)
|
||||
|
||||
# Installation
|
||||
Visit the Termix [Docs](https://docs.termix.site/docs) for more information on how to install Termix. Otherwise, view a sample docker-compose file here:
|
||||
```yaml
|
||||
services:
|
||||
termix:
|
||||
image: ghcr.io/lukegus/termix:latest
|
||||
container_name: termix
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
volumes:
|
||||
- termix-data:/app/data
|
||||
environment:
|
||||
PORT: "8080"
|
||||
|
||||
volumes:
|
||||
termix-data:
|
||||
driver: local
|
||||
```
|
||||
|
||||
# Support
|
||||
If you need help with Termix, you can join the [Discord](https://discord.gg/jVQGdvHDrf) server and visit the support channel. You can also open an issue or open a pull request on the [GitHub](https://github.com/LukeGus/Termix/issues) repo.
|
||||
|
||||
# Show-off
|
||||
|
||||
<p align="center">
|
||||
<img src="./repo-images/Image 1.png" width="400" alt="Termix Demo 1"/>
|
||||
<img src="./repo-images/Image 2.png" width="400" alt="Termix Demo 2"/>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="./repo-images/Image 3.png" width="250" alt="Termix Demo 3"/>
|
||||
<img src="./repo-images/Image 4.png" width="250" alt="Termix Demo 4"/>
|
||||
<img src="./repo-images/Image 5.png" width="250" alt="Termix Demo 5"/>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<video src="https://github.com/user-attachments/assets/0f95495d-c5db-48f5-b18b-9ab48bb10d31" width="800" controls>
|
||||
Your browser does not support the video tag.
|
||||
</video>
|
||||
</p>
|
||||
|
||||
# License
|
||||
Distributed under the Apache License Version 2.0. See LICENSE for more information.
|
||||
21
components.json
Normal file
21
components.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"$schema": "https://ui.shadcn.com/schema.json",
|
||||
"style": "new-york",
|
||||
"rsc": false,
|
||||
"tsx": true,
|
||||
"tailwind": {
|
||||
"config": "",
|
||||
"css": "src/index.css",
|
||||
"baseColor": "zinc",
|
||||
"cssVariables": true,
|
||||
"prefix": ""
|
||||
},
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils",
|
||||
"ui": "@/components/ui",
|
||||
"lib": "@/lib",
|
||||
"hooks": "@/hooks"
|
||||
},
|
||||
"iconLibrary": "lucide"
|
||||
}
|
||||
78
docker/Dockerfile
Normal file
78
docker/Dockerfile
Normal file
@@ -0,0 +1,78 @@
|
||||
# Stage 1: Install dependencies and build frontend
|
||||
FROM node:18-alpine AS deps
|
||||
WORKDIR /app
|
||||
|
||||
RUN apk add --no-cache python3 make g++
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN npm ci --force && \
|
||||
npm cache clean --force
|
||||
|
||||
# Stage 2: Build frontend
|
||||
FROM deps AS frontend-builder
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm run build
|
||||
|
||||
# Stage 3: Build backend TypeScript
|
||||
FROM deps AS backend-builder
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm run build:backend
|
||||
|
||||
# Stage 4: Production dependencies
|
||||
FROM node:18-alpine AS production-deps
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN npm ci --only=production --ignore-scripts --force && \
|
||||
npm cache clean --force
|
||||
|
||||
# Stage 5: Build native modules
|
||||
FROM node:18-alpine AS native-builder
|
||||
WORKDIR /app
|
||||
|
||||
RUN apk add --no-cache python3 make g++
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN npm ci --only=production bcryptjs better-sqlite3 --force && \
|
||||
npm cache clean --force
|
||||
|
||||
# Stage 6: Final image
|
||||
FROM node:18-alpine
|
||||
ENV DATA_DIR=/app/data \
|
||||
PORT=8080 \
|
||||
NODE_ENV=production
|
||||
|
||||
RUN apk add --no-cache nginx gettext su-exec && \
|
||||
mkdir -p /app/data && \
|
||||
chown -R node:node /app/data
|
||||
|
||||
COPY docker/nginx.conf /etc/nginx/nginx.conf
|
||||
COPY --from=frontend-builder /app/dist /usr/share/nginx/html
|
||||
RUN chown -R nginx:nginx /usr/share/nginx/html
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=production-deps /app/node_modules /app/node_modules
|
||||
COPY --from=native-builder /app/node_modules/bcryptjs /app/node_modules/bcryptjs
|
||||
COPY --from=native-builder /app/node_modules/better-sqlite3 /app/node_modules/better-sqlite3
|
||||
COPY --from=backend-builder /app/dist/backend ./dist/backend
|
||||
|
||||
COPY package.json ./
|
||||
RUN chown -R node:node /app
|
||||
|
||||
VOLUME ["/app/data"]
|
||||
|
||||
EXPOSE ${PORT} 8081 8082 8083 8084
|
||||
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
CMD ["/entrypoint.sh"]
|
||||
15
docker/docker-compose.yml
Normal file
15
docker/docker-compose.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
services:
|
||||
termix:
|
||||
image: ghcr.io/lukegus/termix:latest
|
||||
container_name: termix
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
volumes:
|
||||
- termix-data:/app/data
|
||||
environment:
|
||||
PORT: "8080"
|
||||
|
||||
volumes:
|
||||
termix-data:
|
||||
driver: local
|
||||
29
docker/entrypoint.sh
Normal file
29
docker/entrypoint.sh
Normal file
@@ -0,0 +1,29 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
export PORT=${PORT:-8080}
|
||||
echo "Configuring web UI to run on port: $PORT"
|
||||
|
||||
envsubst '${PORT}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf.tmp
|
||||
mv /etc/nginx/nginx.conf.tmp /etc/nginx/nginx.conf
|
||||
|
||||
mkdir -p /app/data
|
||||
chown -R node:node /app/data
|
||||
chmod 755 /app/data
|
||||
|
||||
echo "Starting nginx..."
|
||||
nginx
|
||||
|
||||
echo "Starting backend services..."
|
||||
cd /app
|
||||
export NODE_ENV=production
|
||||
|
||||
if command -v su-exec > /dev/null 2>&1; then
|
||||
su-exec node node dist/backend/starter.js
|
||||
else
|
||||
su -s /bin/sh node -c "node dist/backend/starter.js"
|
||||
fi
|
||||
|
||||
echo "All services started"
|
||||
|
||||
tail -f /dev/null
|
||||
84
docker/nginx.conf
Normal file
84
docker/nginx.conf
Normal file
@@ -0,0 +1,84 @@
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
|
||||
server {
|
||||
listen ${PORT};
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
location /users/ {
|
||||
proxy_pass http://127.0.0.1:8081;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location /ssh/db/ {
|
||||
proxy_pass http://127.0.0.1:8081;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location /ssh/websocket/ {
|
||||
proxy_pass http://127.0.0.1:8082/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location /ssh/tunnel/ {
|
||||
proxy_pass http://127.0.0.1:8083;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location /ssh/config_editor/ {
|
||||
proxy_pass http://127.0.0.1:8084;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location ~ ^/ssh/config_editor/(recent|pinned|shortcuts) {
|
||||
proxy_pass http://127.0.0.1:8081;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
}
|
||||
}
|
||||
23
eslint.config.js
Normal file
23
eslint.config.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import js from '@eslint/js'
|
||||
import globals from 'globals'
|
||||
import reactHooks from 'eslint-plugin-react-hooks'
|
||||
import reactRefresh from 'eslint-plugin-react-refresh'
|
||||
import tseslint from 'typescript-eslint'
|
||||
import { globalIgnores } from 'eslint/config'
|
||||
|
||||
export default tseslint.config([
|
||||
globalIgnores(['dist']),
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
extends: [
|
||||
js.configs.recommended,
|
||||
tseslint.configs.recommended,
|
||||
reactHooks.configs['recommended-latest'],
|
||||
reactRefresh.configs.vite,
|
||||
],
|
||||
languageOptions: {
|
||||
ecmaVersion: 2020,
|
||||
globals: globals.browser,
|
||||
},
|
||||
},
|
||||
])
|
||||
10
how --name-only 9d11bbb
Normal file
10
how --name-only 9d11bbb
Normal file
@@ -0,0 +1,10 @@
|
||||
[33m25148c3[m[33m ([m[1;36mHEAD[m[33m -> [m[1;32mdev-1.1[m[33m)[m Update fonts
|
||||
[33m9d11bbb[m Hide ssh password, add rss like feed to homepage, support utf8 encoding and nerdfonts/ohmyzsh
|
||||
[33m7dd28f8[m[33m ([m[1;31morigin/dev-1.1[m[33m)[m Move .env
|
||||
[33m7b7b070[m Start on update indicators
|
||||
[33m8247369[m Finalized OIDC for beta testing
|
||||
[33maf53ef2[m Update hard coded frontend url
|
||||
[33m0ee1746[m Update hard coded frontend url
|
||||
[33m840a048[m Update auth for ocid
|
||||
[33m3abdf1d[m Update auth for ocid
|
||||
[33m11a8791[m Update auth for ocid
|
||||
13
index.html
Normal file
13
index.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Termix</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
8437
package-lock.json
generated
Normal file
8437
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
98
package.json
Normal file
98
package.json
Normal file
@@ -0,0 +1,98 @@
|
||||
{
|
||||
"name": "termix",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"build:backend": "tsc -p tsconfig.node.json",
|
||||
"dev:backend": "tsc -p tsconfig.node.json && node ./dist/backend/starter.js",
|
||||
"lint": "eslint .",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hookform/resolvers": "^5.1.1",
|
||||
"@radix-ui/react-accordion": "^1.2.11",
|
||||
"@radix-ui/react-avatar": "^1.1.10",
|
||||
"@radix-ui/react-checkbox": "^1.3.2",
|
||||
"@radix-ui/react-collapsible": "^1.1.11",
|
||||
"@radix-ui/react-dialog": "^1.1.14",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.15",
|
||||
"@radix-ui/react-label": "^2.1.7",
|
||||
"@radix-ui/react-popover": "^1.1.14",
|
||||
"@radix-ui/react-scroll-area": "^1.2.9",
|
||||
"@radix-ui/react-select": "^2.2.5",
|
||||
"@radix-ui/react-separator": "^1.1.7",
|
||||
"@radix-ui/react-slider": "^1.3.5",
|
||||
"@radix-ui/react-slot": "^1.2.3",
|
||||
"@radix-ui/react-switch": "^1.2.5",
|
||||
"@radix-ui/react-tabs": "^1.1.12",
|
||||
"@radix-ui/react-tooltip": "^1.2.7",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"@types/bcryptjs": "^2.4.6",
|
||||
"@types/multer": "^2.0.0",
|
||||
"@uiw/codemirror-extensions-hyper-link": "^4.24.1",
|
||||
"@uiw/codemirror-extensions-langs": "^4.24.1",
|
||||
"@uiw/codemirror-themes": "^4.24.1",
|
||||
"@uiw/react-codemirror": "^4.24.1",
|
||||
"@xterm/addon-attach": "^0.11.0",
|
||||
"@xterm/addon-clipboard": "^0.1.0",
|
||||
"@xterm/addon-fit": "^0.10.0",
|
||||
"@xterm/addon-search": "^0.15.0",
|
||||
"@xterm/addon-unicode11": "^0.8.0",
|
||||
"@xterm/addon-web-links": "^0.11.0",
|
||||
"@xterm/xterm": "^5.5.0",
|
||||
"axios": "^1.10.0",
|
||||
"bcryptjs": "^3.0.2",
|
||||
"better-sqlite3": "^12.2.0",
|
||||
"chalk": "^4.1.2",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"cookie-parser": "^1.4.7",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^17.2.0",
|
||||
"drizzle-orm": "^0.44.3",
|
||||
"express": "^5.1.0",
|
||||
"jose": "^5.2.3",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"lucide-react": "^0.525.0",
|
||||
"multer": "^2.0.2",
|
||||
"nanoid": "^5.1.5",
|
||||
"node-fetch": "^3.3.2",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"react-hook-form": "^7.60.0",
|
||||
"react-resizable-panels": "^3.0.3",
|
||||
"react-xtermjs": "^1.0.10",
|
||||
"ssh2": "^1.16.0",
|
||||
"tailwind-merge": "^3.3.1",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"validator": "^13.15.15",
|
||||
"ws": "^8.18.3",
|
||||
"zod": "^4.0.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.30.1",
|
||||
"@types/better-sqlite3": "^7.6.13",
|
||||
"@types/cors": "^2.8.19",
|
||||
"@types/express": "^5.0.3",
|
||||
"@types/jsonwebtoken": "^9.0.10",
|
||||
"@types/node": "^24.0.13",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"@types/ssh2": "^1.15.5",
|
||||
"@types/ws": "^8.18.1",
|
||||
"@vitejs/plugin-react-swc": "^3.10.2",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"eslint": "^9.30.1",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.20",
|
||||
"globals": "^16.3.0",
|
||||
"ts-node": "^10.9.2",
|
||||
"tw-animate-css": "^1.3.5",
|
||||
"typescript": "~5.8.3",
|
||||
"typescript-eslint": "^8.35.1",
|
||||
"vite": "^7.0.4"
|
||||
}
|
||||
}
|
||||
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 221 KiB |
BIN
public/fonts/JetBrainsMonoNLNerdFont-Bold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-Bold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-BoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-ExtraBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-ExtraBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-ExtraBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-ExtraLight.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-ExtraLight.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-ExtraLightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-ExtraLightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-Italic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-Italic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-Light.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-Light.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-LightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-LightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-Medium.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-Medium.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-MediumItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-MediumItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-Regular.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-Regular.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-SemiBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-SemiBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-SemiBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-SemiBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-Thin.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-Thin.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFont-ThinItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFont-ThinItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Bold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Bold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-BoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ExtraBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ExtraBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ExtraBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ExtraLight.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ExtraLight.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ExtraLightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ExtraLightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Italic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Italic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Light.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Light.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-LightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-LightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Medium.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Medium.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-MediumItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-MediumItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Regular.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Regular.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-SemiBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-SemiBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-SemiBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-SemiBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Thin.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-Thin.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ThinItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontMono-ThinItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Bold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Bold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-BoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ExtraBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ExtraBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ExtraBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ExtraLight.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ExtraLight.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ExtraLightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ExtraLightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Italic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Italic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Light.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Light.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-LightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-LightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Medium.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Medium.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-MediumItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-MediumItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Regular.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Regular.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-SemiBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-SemiBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-SemiBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-SemiBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Thin.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-Thin.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ThinItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNLNerdFontPropo-ThinItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-Bold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-Bold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-BoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-ExtraBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-ExtraBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-ExtraBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-ExtraLight.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-ExtraLight.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-ExtraLightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-ExtraLightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-Italic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-Italic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-Light.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-Light.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-LightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-LightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-Medium.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-Medium.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-MediumItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-MediumItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-Regular.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-Regular.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-SemiBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-SemiBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-SemiBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-SemiBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-Thin.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-Thin.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFont-ThinItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFont-ThinItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-Bold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-Bold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-BoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-ExtraBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-ExtraBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-ExtraBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-ExtraLight.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-ExtraLight.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-ExtraLightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-ExtraLightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-Italic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-Italic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-Light.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-Light.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-LightItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-LightItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-Medium.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-Medium.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-MediumItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-MediumItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-Regular.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-Regular.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-SemiBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-SemiBold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-SemiBoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-SemiBoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-Thin.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-Thin.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontMono-ThinItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontMono-ThinItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontPropo-Bold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontPropo-Bold.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontPropo-BoldItalic.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontPropo-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
public/fonts/JetBrainsMonoNerdFontPropo-ExtraBold.ttf
Normal file
BIN
public/fonts/JetBrainsMonoNerdFontPropo-ExtraBold.ttf
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user