diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..d1191b80
--- /dev/null
+++ b/LICENSE
@@ -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.
\ No newline at end of file
diff --git a/README.md b/README.md
index 9ec7805d..a1b85746 100644
--- a/README.md
+++ b/README.md
@@ -5,58 +5,51 @@
#### Top Technologies
[](#)
-[](#)
-[](#)
-[](#)
+[](#)
+[](#)
+[](#)
[](#)
[](#)
-[](#)
-[](#)
+[](#)
+[](#)
If you would like, you can support the project here!\
-[](https://paypal.me/LukeGustafson803)
+[](https://github.com/sponsors/LukeGus)
# Overview
-Termix is an open-source forever free self-hosted Homepage (other protocols planned, see [Planned Features](#planned-features)) server management panel inspired by [Nexterm](https://github.com/gnmyt/Nexterm). Its purpose is to provide an all-in-one docker-hosted web solution to manage your servers in one easy place. I'm using this project to help me learn [React](https://github.com/facebook/react), [Vite](https://github.com/vitejs/vite-plugin-react), and [Docker](https://www.docker.com) but also because I could never settle on a server management software that I enjoyed to use.
-
-> [!WARNING]
-> This app is in the VERY early stages of development. Expect bugs, data loss, and unexplainable issues! For that reason, I recommend you securely tunnel your connection to Termix through a VPN.
+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
-- Homepage
-- Split Screen (Up to 4) & Tab System
-- User Authentication
-- Save Hosts (and easily view, connect, and manage them)
-- SSHTerminal Themes
+- **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, responsive interface built with React, Tailwind CSS, and the amazing Shadcn
+- **Docker Support** - Easy deployment with Docker and Docker Compose
# Planned Features
-- VNC
-- RDP
-- SFTP (build in file transfer)
-- ChatGPT/Ollama Integration (for commands)
-- Apps (like notes, AI, etc)
-- User Management (roles, permissions, etc.)
-- Homepage Tunneling
-- More Authentication Methods
-- More Security Features (like 2FA, etc.)
+- **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 [Wiki](https://github.com/LukeGus/Termix/wiki) for information on how to install Termix. You can also use these links to go directly to guide. [Docker](https://github.com/LukeGus/Termix/wiki/Docker) or [Manual](https://github.com/LukeGus/Termix/wiki/Manual).
+Visit the Termix [Docs](https://docs.termix.site/docs) for information on how to install Termix.
# 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. If you would like to support me financially, you can on [Paypal](https://paypal.me/LukeGustafson803).
+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
-
-
-
+TBD
# License
-Distributed under the MIT license. See LICENSE for more information.
+Distributed under the Apache License Version 2.0. See LICENSE for more information.
\ No newline at end of file
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index 9b84669d..a4c55fad 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -8,7 +8,7 @@ services:
volumes:
- termix-data:/app/data
environment:
- PORT: 8080
+ PORT: "8080"
volumes:
termix-data:
diff --git a/src/App.tsx b/src/App.tsx
index 08b62989..46efa03f 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,10 +1,9 @@
-import React, {useEffect} from "react"
+import React from "react"
import {Homepage} from "@/apps/Homepage/Homepage.tsx"
import {SSH} from "@/apps/SSH/Terminal/SSH.tsx"
import {SSHTunnel} from "@/apps/SSH/Tunnel/SSHTunnel.tsx";
import {ConfigEditor} from "@/apps/SSH/Config Editor/ConfigEditor.tsx";
-import {Tools} from "@/apps/Tools/Tools.tsx";
import {SSHManager} from "@/apps/SSH/Manager/SSHManager.tsx"
function App() {
@@ -32,10 +31,6 @@ function App() {
return
- case "tools":
- return
}
}
diff --git a/src/apps/Homepage/Homepage.tsx b/src/apps/Homepage/Homepage.tsx
index 3ec39d3e..7e6a7bf9 100644
--- a/src/apps/Homepage/Homepage.tsx
+++ b/src/apps/Homepage/Homepage.tsx
@@ -1,21 +1,71 @@
import {HomepageSidebar} from "@/apps/Homepage/HomepageSidebar.tsx";
import React, {useEffect, useState} from "react";
import {HomepageAuth} from "@/apps/Homepage/HomepageAuth.tsx";
+import axios from "axios";
interface HomepageProps {
onSelectView: (view: string) => void;
}
+function getCookie(name: string) {
+ return document.cookie.split('; ').reduce((r, v) => {
+ const parts = v.split('=');
+ return parts[0] === name ? decodeURIComponent(parts[1]) : r;
+ }, "");
+}
+
+const apiBase =
+ typeof window !== "undefined" && window.location.hostname === "localhost"
+ ? "http://localhost:8081/users"
+ : "/users";
+
+const API = axios.create({
+ baseURL: apiBase,
+});
+
export function Homepage({onSelectView}: HomepageProps): React.ReactElement {
const [loggedIn, setLoggedIn] = useState(false);
const [isAdmin, setIsAdmin] = useState(false);
const [username, setUsername] = useState(null);
+ const [authLoading, setAuthLoading] = useState(true);
+ const [dbError, setDbError] = useState(null);
+
+ useEffect(() => {
+ const jwt = getCookie("jwt");
+ if (jwt) {
+ setAuthLoading(true);
+ Promise.all([
+ API.get("/me", {headers: {Authorization: `Bearer ${jwt}`}}),
+ API.get("/db-health")
+ ])
+ .then(([meRes]) => {
+ setLoggedIn(true);
+ setIsAdmin(!!meRes.data.is_admin);
+ setUsername(meRes.data.username || null);
+ setDbError(null);
+ })
+ .catch((err) => {
+ setLoggedIn(false);
+ setIsAdmin(false);
+ setUsername(null);
+ setCookie("jwt", "", -1);
+ if (err?.response?.data?.error?.includes("Database")) {
+ setDbError("Could not connect to the database. Please try again later.");
+ } else {
+ setDbError(null);
+ }
+ })
+ .finally(() => setAuthLoading(false));
+ } else {
+ setAuthLoading(false);
+ }
+ }, []);
return (