-# Description
-Termix is an open-source forever free self-hosted SSH (other protocols planned, see [Planned Features](#planned-features)) 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.
+# Overview
+Termix is an open-source forever free self-hosted SSH (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 possibly even security issues!
+> 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 through a VPN.
+
+# Features
+- SSH (password auth only)
+- Split Screen (Up to 4) & Tab System
# Planned Features
-- [x] SSH
-- [ ] VNC
-- [ ] RDP
-- [ ] SMTP (build in file transfer)
-- [ ] Split Screen & Tabs
-- [ ] ChatGPT/Ollama Integration (for commands)
-- [ ] Login Screen
-
-# How Termix is Different
-Before developing Termix, I faced the issue of a server management panel that did not have every feature I liked. [Guacamole](https://guacamole.apache.org/) had poor copy/paste abilities and a poor UI. [Shellngn](https://shellngn.com/) was too expensive and all other alternatives had one major problem with them. I plan to develop the management panel of my dreams with even an AI integration for those pesky commands I always forget the syntax of.
+- Key Auth for SSH
+- VNC
+- RDP
+- SFTP (build in file transfer)
+- ChatGPT/Ollama Integration (for commands)
+- Login Screen
+- User Management
+- Apps (like notes, AI, etc)
# Installation
-View 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).
-
-# Known Bugs
-### Please create an [Issue](https://github.com/LukeGus/Termix/issues) if you find any problems!
-Start session button stays connected even if SSH fails to connect.
+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).
# Show-off
diff --git a/docker/Dockerfile b/docker/Dockerfile
index aea15f32..f89529c1 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -33,7 +33,7 @@ RUN mkdir -p /var/log/nginx && \
# Expose ports
EXPOSE 8080 8081
-# Use a start script to run both services
+# Use a entrypoint script to run all services
COPY docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
CMD ["/entrypoint.sh"]
\ No newline at end of file
diff --git a/repo-images/DemoImage1.png b/repo-images/DemoImage1.png
index f1641293..68f6e262 100644
Binary files a/repo-images/DemoImage1.png and b/repo-images/DemoImage1.png differ
diff --git a/src/App.jsx b/src/App.jsx
index 11107ce1..079a07e9 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -38,6 +38,47 @@ function App() {
};
}, []);
+ useEffect(() => {
+ terminals.forEach((terminal) => {
+ if (
+ (terminal.id === activeTab || splitTabIds.includes(terminal.id)) &&
+ terminal.terminalRef?.resizeTerminal
+ ) {
+ terminal.terminalRef.resizeTerminal();
+ }
+ });
+ }, [splitTabIds, activeTab, terminals]);
+
+ useEffect(() => {
+ const handleResize = () => {
+ terminals.forEach((terminal) => {
+ if (
+ (terminal.id === activeTab || splitTabIds.includes(terminal.id)) &&
+ terminal.terminalRef?.resizeTerminal
+ ) {
+ terminal.terminalRef.resizeTerminal();
+ }
+ });
+ };
+
+ window.addEventListener("resize", handleResize);
+
+ return () => {
+ window.removeEventListener("resize", handleResize);
+ };
+ }, [splitTabIds, activeTab, terminals]);
+
+ useEffect(() => {
+ terminals.forEach((terminal) => {
+ if (
+ (terminal.id === activeTab || splitTabIds.includes(terminal.id)) &&
+ terminal.terminalRef?.resizeTerminal
+ ) {
+ terminal.terminalRef.resizeTerminal();
+ }
+ });
+ }, [splitTabIds]);
+
const handleAddHost = () => {
if (form.ip && form.user && form.password && form.port) {
const newTerminal = {
@@ -88,13 +129,10 @@ function App() {
const getLayoutStyle = () => {
if (splitTabIds.length === 1) {
- // Horizontal split (2 tabs: left-right)
return "flex flex-row h-full gap-4";
} else if (splitTabIds.length > 1) {
- // 2x2 Grid layout (4 tabs max), with evenly spaced rows
return "grid grid-cols-2 grid-rows-2 gap-4 h-full overflow-hidden";
}
- // No split, main tab takes the entire screen
return "flex flex-col h-full";
};
@@ -177,6 +215,7 @@ function App() {
{
if (ref && !terminal.terminalRef) {
setTerminals((prev) =>
diff --git a/src/Launchpad.jsx b/src/Launchpad.jsx
index 2b503ecb..a59d5595 100644
--- a/src/Launchpad.jsx
+++ b/src/Launchpad.jsx
@@ -56,7 +56,10 @@ function Launchpad({ onClose }) {
>
Launchpad
-
W.I.P. Feature
+
A one-stop shop for adding hosts, apps (AI, notes, etc.), and all new features to come! Coming to you in a future update. Stay tuned!