An AI-native file editor and IDE that runs in the browser, backed by a self-hosted Java server.
Aether is a triple-pane workspace — Explorer, Editor, and AI Assistant — for browsing, editing, and chatting with an LLM about files that live on your local disk, a remote server over SSH, or Google Drive.
There is no build framework, no ORM, and no bundler. It's plain Java, JSP, and JavaScript, deployed straight into a Jetty container.
- Triple-pane workspace — file explorer, CodeMirror-based code editor, and an AI chat pane, all in one page with no full reloads (a lightweight custom AJAX layer patches the DOM from server-rendered XML fragments).
- Multiple storage backends — a
FileProviderabstraction unifies the local filesystem, SSH/SFTP servers, and Google Drive behind one interface, so the same explorer, editor, and AI tools work identically no matter where a file lives. - AI assistant with tool use — agents (defined as JSON in
WEB-INF/agents/) can read, write, patch, rename, move, copy, and search files, run commands, and ask the user for permission before any destructive action, streamed live over a WebSocket. - Bring your own model provider — connect any number of OpenAI-compatible endpoints (Ollama, LM Studio, OpenRouter, Lemonade, hosted frontier APIs, ...) at once; every model from every provider shows up in one selector, labeled by provider.
- Google Drive integration — all your data (settings, chat sessions, and optionally the files themselves) can live in your own Google Drive.
- Auto-save — edits are debounced and buffered server-side in the session before being committed to the underlying file provider, so a dropped connection doesn't lose work.
| Layer | Choice |
|---|---|
| Language | Java 25 |
| Web container | Jakarta EE 11 / Jetty 12.1 |
| Server-side views | JSP, rendered as XML fragments over a custom AJAX mechanism |
| Client | Vanilla JavaScript (scriptlib.js), CodeMirror for editing |
| Config/state | JSON files (org.eclipse.jetty.util.ajax.JSON), no database |
| SSH/SFTP | JSch 2.28.4 (mwiede fork) |
| AI backend | Any OpenAI-compatible /v1/chat/completions endpoint (Ollama, etc.) over a WebSocket bridge |
No Spring, no Maven/Gradle, no ORM.
Aether follows a small variant of the Front Controller / Command pattern:
Portal(aWebFilter) intercepts every request and routes it viaCommandInitializer, which scans for@CommandRegisterannotations on bean classes.- Each request is handled by a
BeanObjectsubclass (e.g.DocumentBean,BrowseBean,SettingBean). Parameters are injected byPortalthrough public setters — beans never callrequest.getParameter()directly. - The response is JSP content wrapped as
text/xml, containing<replacehtml>and<command>tags.AjaxWrapper/AjaxModifierhandle CDATA-wrapping automatically. - The client (
scriptlib.js) fires requests withmakeRequest(...), patches the returned fragments into the page, and manages view state (showView('panel' | 'editor' | 'media')). - File I/O goes through
FileProviderimplementations (LocalFileProvider,SshFileProvider,GoogleDriveProvider), resolved per-session viaPathMapand the provider registry. - The AI assistant (
AgentWorker) streams chat and tool calls from an OpenAI-compatible endpoint overAetherWebSocket(/socket/aetherui), executing tool calls with a permission-request round trip to the client before anything destructive happens.
| Store | Contents | Lifetime |
|---|---|---|
HttpSession |
Login identity (email, account id, admin flag) | Survives context restarts (Jetty session persistence) |
| In-memory cache | Registered storage providers, cached settings | Cleared on context restart |
.vibed files (encrypted, on disk) |
OAuth access/refresh tokens only | Survives full server restarts |
aether.ing.setting.json (in the user's Google Drive) |
Storage provider list, generated SSH keypair | User-level, provider-agnostic |
AGENTS.md + aether.ing.json (in the working directory) |
Project overview fed to the AI, and chat sessions/config | Per-project |
There's no Maven/Gradle build — you'll need a Java 25 compiler and a Jakarta EE 11 compatible container.
- Resolve the library dependencies referenced in
.classpath(AspectJ RT, Jetty-home-12, JSch-2). - Build: compiled classes go to
src/main/webapp/WEB-INF/classes. - Deploy the contents of
src/main/webappto a Jetty 12.1 (or other Jakarta EE 11) server. Runtime jars are expected on the server's own classpath, not bundled inWEB-INF/lib. - On first run,
SetupBeanwalks you through initial admin configuration. - Add at least one OpenAI-compatible LLM provider (e.g. a local Ollama install) from Settings → LLM Providers to enable the AI assistant.
MIT — see LICENSE.
