license: release Nexus Terminal under the GNU AGPL v3

- LICENSE: the GNU Affero General Public License, version 3 (verbatim
  from gnu.org).
- SPDX-License-Identifier: AGPL-3.0-only plus a copyright line on every
  first-party source file (Rust, shell, Python, PHP); vendored crates keep
  their own licenses.
- Cargo manifests carry license/authors/repository; the macOS bundle
  copyright and the About page state the license and link the source.
- Release zips (and the macOS app bundle) include LICENSE.
- README: License section.
This commit is contained in:
Andy Dixon
2026-10-13 09:46:31 +01:00
parent ee7f831d32
commit 9805681c2c
87 changed files with 930 additions and 5 deletions
+3
View File
@@ -2,6 +2,9 @@
name = "nexus"
version.workspace = true
edition.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
build = "build.rs"
[[bin]]
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Embeds the icon and version info into the Windows executable.
fn main() {
println!("cargo:rerun-if-changed=../packaging/windows/nexus.ico");
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! The main window: title bar, connection sidebar, tab strip and workspace (terminals, split
//! panes, protocol viewers), right dock (SFTP or the profile editor), status bar, command
//! palette, prompts and toasts. Session events from nexus-core are drained here every frame.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Window chrome: custom title bar, status bar, command palette, credential and host-key
//! prompts, the main window's modal dialogs, toasts and resize edges.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Remote desktop viewer for VNC and RDP: the remote framebuffer as a texture, with mouse,
//! keyboard and clipboard input. Input is expressed in X keysyms and VNC pointer masks (VNC's own
//! terms); `Remote` translates them for RDP. Toolbar after the web build's `vnc.js` (status,
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Port forwards dialog for a live SSH session: list, stop, add.
use crate::chrome::modal;
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! GitHub repository browser: owner groups of repo cards with ZIP download and Visit. Port of
//! `github.js`.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! IRC client view: room tabs, message log, composer and room/user lists. Port of `irc.js`;
//! lines are `ircformat::format_event` spans drawn in the terminal theme's colours.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Nexus Terminal: SSH, Telnet, RAW TCP, Serial, VNC, IRC, GitHub and local terminals in one
//! native window. `nexus-terminal [--theme pro|midnight|light] [--screenshot out.png] [--size WxH]`.
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Finds the OSC sequences the VT parser ignores but Nexus uses: OSC 133 (shell integration
//! marks: prompt, command, output, finished with exit status) and OSC 7 (the shell's working
//! directory). Sequences may be split across reads, so the scanner keeps state between chunks.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Profile editor (right dock): create and edit every protocol's settings. A port of the
//! `profiles.js` drawer plus the Serial protocol. Switching protocol keeps the common fields
//! (including the group), and list editors keep unsaved edits.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Quick Connect dialog: an ad-hoc session without saving a profile.
use crate::chrome::modal;
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! RAW TCP viewer: text / hex / split views of the capture, pause, clear, save, and a send bar.
//! Port of the web build's `raw.js`. Sent data comes back through `Event::RawData` ("send"), so
//! the echo of a sent entry needs no local bookkeeping.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Recordings browser and playback window (port of the RecordingManager in recordings.js).
use crate::state::Shared;
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Reopens the previous run's tabs and splits at launch: saved profiles reconnect, local shells
//! start again in the directory they were in. The layout is saved whenever it changes (not only on
//! exit), so it survives a crash. Quick Connect tabs aren't restored (they have no saved profile).
+11 -1
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Settings window: General, Terminal, Security, Known Hosts, Help, About. Also the
//! master-password dialog (strength meter + confirm) used to create or unlock the vault.
@@ -781,14 +784,21 @@ impl Settings {
// --- About ----------------------------------------------------------------------------
fn about(&mut self, ui: &mut Ui, s: &mut Shared) {
const SOURCE_URL: &str = "https://github.com/andydixon/nexus";
let t = Tokens::get(ui.ctx());
ui.add_space(8.0);
ui.label(RichText::new("Nexus Terminal").font(theme::semibold(22.0)));
ui.label(RichText::new(format!("Version {}", nexus_core::service::VERSION)).color(t.text_dim));
ui.label(RichText::new("Developed by Andy Dixon - dixon.cx/nexus").color(t.text_faint));
ui.horizontal(|ui| {
ui.label(RichText::new("Free software under the GNU Affero General Public License v3. Source:").color(t.text_faint));
if ui.link("github.com/andydixon/nexus").clicked() {
widgets::open_web_url(ui.ctx(), SOURCE_URL);
}
});
ui.add_space(8.0);
for f in [
"SSH, Telnet, RAW TCP, Serial, VNC, IRC, GitHub and local terminals",
"SSH, Telnet, RAW TCP, Serial, VNC, RDP, IRC, GitHub and local terminals",
"AES-256-GCM encrypted credential vault",
"Platform-native keychain integration",
"SFTP file browser and transfer",
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! SFTP browser (right dock), the file-drop dialog and the remote directory picker.
//! Every SFTP call blocks on the network, so it runs on a worker thread; results come back
//! through `inbox` and are applied on the UI thread at the start of the next frame.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! The connection sidebar: Local Machine, Favourites, Recent, folders, Ungrouped; fuzzy search;
//! click to connect, Ctrl/Cmd-click to multi-select, double-click to edit; bulk actions.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Snippet library window and the {{variable}} prompt (port of snippets.js).
use crate::state::{Request, Shared};
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Split panes: a binary tree of sessions inside one tab. A new split starts as a placeholder
//! pane offering Local Machine and the saved connections; ✕ on a pane promotes its sibling.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! SSH Key Manager window: key pairs in ~/.ssh — copy public key, delete, generate (in-process, OpenSSH format).
use crate::settings::{Job, poll};
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! State shared by the main window and every feature module: the service, cached profiles and
//! preferences, open tabs, toasts, and a request queue features use to ask the app to act.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! The tab strip and the workspace under it: the active tab's session (or its split panes),
//! terminal find bar and connection overlays.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! TermView: an alacritty_terminal grid drawn with egui's painter. Bytes from a session go
//! straight into the VT parser; keystrokes, paste, mouse reports and terminal replies come back
//! out through `TermResponse` for the app to send to the session (and broadcast targets).
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! The 11 terminal colour schemes, generated from the web build's themes.js.
pub struct TermTheme {
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Design system: colour tokens, radii and typography (Inter for UI, JetBrains Mono for bytes).
//! Widgets read `Tokens::get(ctx)` instead of hard-coding colours, so every theme applies
//! everywhere. Copied from Leviathan Desktop so both apps share one look.
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Profile export/import: encrypted `.nexus` and plain JSON.
use crate::settings::{Job, poll};
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Trigger rules: match terminal output lines and notify / highlight / beep (port of triggers.js).
//! Rules live in `triggers.json` in the data directory (the web build's localStorage rules are
//! not migrated).
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! How a session is drawn. Terminal-style protocols share `TermView`; the rest have their own.
use crate::desktop_view::DesktopView;
+3
View File
@@ -1,3 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Andy Dixon
//! Shared widgets: section headers, buttons, chips, key/value grids, virtual lists, empty states.
//! Colours always come from `Tokens`.