diff --git a/docs/docs/config.mdx b/docs/docs/config.mdx
index 6648d1d92..9a211c3cc 100644
--- a/docs/docs/config.mdx
+++ b/docs/docs/config.mdx
@@ -4,6 +4,14 @@ id: "config"
title: "Configuration"
---
+import { Kbd } from "@site/src/components/kbd.tsx";
+import { PlatformProvider, PlatformSelectorButton } from "@site/src/components/platformcontext.tsx";
+
+
+
+
+
+
Wave's configuration files are located at `~/.config/waveterm/`.
The main configuration file is `settings.json` (`~/.config/waveterm/settings.json`).
@@ -27,6 +35,7 @@ wsh editconfig
| ------------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| app:globalhotkey | string | A systemwide keybinding to open your most recent wave window. This is a set of key names separated by `:`. For more info, see [Customizable Systemwide Global Hotkey](#customizable-systemwide-global-hotkey) |
| app:dismissarchitecturewarning | bool | Disable warnings on app start when you are using a non-native architecture for Wave. For more info, see [Why does Wave warn me about ARM64 translation when it launches?](./faq#why-does-wave-warn-me-about-arm64-translation-when-it-launches). |
+| app:defaultnewblock | string | Sets the default new block (Cmd:n, Cmd:d). "term" for terminal block, "launcher" for launcher block (default = "term") |
| ai:preset | string | the default AI preset to use |
| ai:baseurl | string | Set the AI Base Url (must be OpenAI compatible) |
| ai:apitoken | string | your AI api token |
@@ -91,6 +100,7 @@ For reference, this is the current default configuration (v0.10.4):
"ai:model": "gpt-4o-mini",
"ai:maxtokens": 2048,
"ai:timeoutms": 60000,
+ "app:defaultnewblock": "term",
"autoupdate:enabled": true,
"autoupdate:installonquit": true,
"autoupdate:intervalms": 3600000,
@@ -121,7 +131,76 @@ files as well: `termthemes.json`, `presets.json`, and `widgets.json`.
:::
-### Terminal Theming
+## WebBookmarks Configuration
+
+WebBookmarks allows you to store and manage web links with customizable display preferences. The bookmarks are stored in a JSON file (`bookmarks.json`) as a key-value map where the key (`id`) is an arbitrary identifier for the bookmark. By convention, you should start your ids with "bookmark@". In the web widget, you can pull up your bookmarks using
+
+### Bookmark Structure
+
+Each bookmark follows this structure (only `url` is required):
+
+```json
+{
+ "url": "https://example.com",
+ "title": "Example Site",
+ "iconurl": "https://example.com/custom-icon.png",
+ "display:order": 1
+}
+```
+
+### Fields
+
+| Field | Type | Description |
+| ------------- | ------- | ----------------------------------------------------------------------------------------------------------------- |
+| url | string | **Required.** The URL of the bookmark. |
+| title | string | **Optional.** A display title for the bookmark. |
+| icon | string | **Optional, rarely used.** Overrides the default favicon with an icon name. |
+| iconcolor | string | **Optional, rarely used.** Sets a custom color for the specified icon. |
+| iconurl | string | **Optional.** Provides a custom icon URL, useful if the favicon is incorrect (e.g., for dark mode compatibility). |
+| display:order | float64 | **Optional.** Defines the order in which bookmarks appear. |
+
+### Example `bookmarks.json`
+
+```json
+{
+ "bookmark@google": {
+ "url": "https://www.google.com",
+ "title": "Google"
+ },
+ "bookmark@claude": {
+ "url": "https://claude.ai",
+ "title": "Claude AI"
+ },
+ "bookmark@wave": {
+ "url": "https://waveterm.dev",
+ "title": "Wave Terminal",
+ "display:order": -1
+ },
+ "bookmark@wave-github": {
+ "url": "https://github.com/wavetermdev/waveterm",
+ "title": "Wave Github",
+ "iconurl": "https://github.githubassets.com/favicons/favicon-dark.png"
+ },
+ "bookmark@chatgpt": {
+ "url": "https://chatgpt.com",
+ "iconurl": "https://cdn.oaistatic.com/assets/favicon-miwirzcw.ico"
+ },
+ "bookmark@wave-pulls": {
+ "url": "https://github.com/wavetermdev/waveterm/pulls",
+ "title": "Wave Pull Requests",
+ "iconurl": "https://github.githubassets.com/favicons/favicon-dark.png"
+ }
+}
+```
+
+### Behavior
+
+- If `iconurl` is set, it fetches the icon from the specified URL instead of the site's default favicon.
+- Bookmarks are sorted based on `display:order` (if provided), otherwise by id.
+- `icon` and `iconcolor` are rarely needed since the default behavior fetches the site's favicon.
+- favicons are refreshed every 24-hours
+
+## Terminal Theming
User-defined terminal themes are located in `~/.config/waveterm/termthemes.json`.
@@ -203,17 +282,17 @@ wsh editconfig termthemes.json
| cursorAccent | CSS color | | | color for cursor |
| selectionBackground | CSS color | | | background color for selected text |
-### Customizable Systemwide Global Hotkey
+## Customizable Systemwide Global Hotkey
Wave allows settings a custom global hotkey to open your most recent window from anywhere in your computer. This has the name `"app:globalhotkey"` in the `settings.json` file and takes the form of a series of key names separated by the `:` character.
-#### Examples
+### Examples
As a practical example, suppose you want a value of `F5` as your global hotkey. Then you can simply set the value of `"app:globalhotkey"` to `"F5"` and reboot Wave to make that your global hotkey.
As a less practical example, suppose you use the combination of the keys `Ctrl`, `Option`, and `e`. Then the value for this keybinding would be `"Ctrl:Option:e"`.
-#### Allowed Key Names
+### Allowed Key Names
We support the following key names:
@@ -251,3 +330,5 @@ We support the following key names:
- The numpad minus/subtract represented by `Subtract`
- The numpad star/multiply represented by `Multiply`
- The numpad slash/divide represented by `Divide`
+
+
diff --git a/docs/docs/keybindings.mdx b/docs/docs/keybindings.mdx
index b73470d26..ee3fac107 100644
--- a/docs/docs/keybindings.mdx
+++ b/docs/docs/keybindings.mdx
@@ -20,25 +20,27 @@ replace "Cmd" with "Alt" (note that "Ctrl" is "Ctrl" on both Mac, Windows, and L
-| Key | Function |
-| ---------------------------- | --------------------------------------------------------------------------------- |
-| | Open a new tab |
-| | Open a new terminal block (defaults to the same connection and working directory) |
-| | Open a new window |
-| | Close the current block |
-| | Close the current tab |
-| | Magnify / Un-Magnify the current block |
-| | Open the "connection" switcher |
-| | Refocus the current block (useful if the block has lost input focus) |
-| | Show block numbers |
-| | Switch to block number |
-| | Move left, right, up, down between blocks |
-| | Switch to tab number |
-| | Switch tab left |
-| | Switch tab right |
-| | Switch to workspace number |
-| | Refresh the UI |
-| | Toggle terminal multi-input mode |
+| Key | Function |
+| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| | Open a new tab |
+| | Open a new block (defaults to a terminal block with the same connection and working directory). Switch to launcher using `app:defaultnewblock` setting |
+| | Split horizontally, open a new block to the right |
+| | Split vertically, open a new block below |
+| | Open a new window |
+| | Close the current block |
+| | Close the current tab |
+| | Magnify / Un-Magnify the current block |
+| | Open the "connection" switcher |
+| | Refocus the current block (useful if the block has lost input focus) |
+| | Show block numbers |
+| | Switch to block number |
+| | Move left, right, up, down between blocks |
+| | Switch to tab number |
+| | Switch tab left |
+| | Switch tab right |
+| | Switch to workspace number |
+| | Refresh the UI |
+| | Toggle terminal multi-input mode |
## File Preview Keybindings
@@ -66,6 +68,7 @@ replace "Cmd" with "Alt" (note that "Ctrl" is "Ctrl" on both Mac, Windows, and L
| | Back |
| | Forward |
| | Find in webpage |
+| | Open a bookmark |
## WaveAI Keybindings
diff --git a/frontend/app/block/block.tsx b/frontend/app/block/block.tsx
index badead269..58e119927 100644
--- a/frontend/app/block/block.tsx
+++ b/frontend/app/block/block.tsx
@@ -9,6 +9,7 @@ import {
FullSubBlockProps,
SubBlockProps,
} from "@/app/block/blocktypes";
+import { LauncherViewModel } from "@/app/view/launcher/launcher";
import { PreviewModel } from "@/app/view/preview/preview";
import { SysinfoViewModel } from "@/app/view/sysinfo/sysinfo";
import { VDomModel } from "@/app/view/vdom/vdom-model";
@@ -44,6 +45,7 @@ BlockRegistry.set("cpuplot", SysinfoViewModel);
BlockRegistry.set("sysinfo", SysinfoViewModel);
BlockRegistry.set("vdom", VDomModel);
BlockRegistry.set("help", HelpViewModel);
+BlockRegistry.set("launcher", LauncherViewModel);
function makeViewModel(blockId: string, blockView: string, nodeModel: BlockNodeModel): ViewModel {
const ctor = BlockRegistry.get(blockView);
diff --git a/frontend/app/block/blockframe.tsx b/frontend/app/block/blockframe.tsx
index 6a9e4185d..7d359993f 100644
--- a/frontend/app/block/blockframe.tsx
+++ b/frontend/app/block/blockframe.tsx
@@ -537,6 +537,8 @@ const BlockFrame_Default_Component = (props: BlockFrameProps) => {
const [magnifiedBlockOpacityAtom] = React.useState(() => getSettingsKeyAtom("window:magnifiedblockopacity"));
const magnifiedBlockOpacity = jotai.useAtomValue(magnifiedBlockOpacityAtom);
const connBtnRef = React.useRef();
+ const noHeader = util.useAtomValueSafe(viewModel?.noHeader);
+
React.useEffect(() => {
if (!manageConnection) {
return;
@@ -618,7 +620,7 @@ const BlockFrame_Default_Component = (props: BlockFrameProps) => {
/>
)}