The ultimate lightweight, fully typed, and customizable terminal component for Svelte 5.
Svelte Bash is a high-performance terminal emulator component designed specifically for modern Svelte applications. It provides a realistic shell experience with a virtual file system, command history navigation, and advanced features like autoplay sequences for tutorials.
Note: As of v1.0.1, svelte-bash has been refactored to use Pure Vanilla CSS internally. This means it has ZERO dependencies on Tailwind CSS and will render correctly in any project (including Bootstrap, Tailwind, or plain CSS projects). You do NOT need to install Tailwind.
Whether you are building a developer portfolio, a documentation site, or a web-based CLI tool, Svelte Bash offers the perfect balance of aesthetics and functionality.
ls -la, cd, cat, and pwd commands.mkdir, touch, rm, cp, mv).persist prop to automatically save/load state to localStorage.> and >>.nano <file>) to edit files directly.alias ll='ls -la').dracula, matrix, dark, and light presets, plus full CSS control.npm install svelte-bash
Import the component and pass a structure object to define the virtual file system.
<script>
import { Terminal } from 'svelte-bash';
const fileSystem = {
'readme.md': '# Hello World',
'src': {
'app.js': 'console.log("Hi")'
}
};
</script>
<Terminal
structure={fileSystem}
user="guest"
style="height: 300px"
/>
For simple apps, simply pass a string to the persist prop and the terminal will autosave the filesystem state to localStorage under that storage key:
<Terminal
structure={initialState}
persist="my-local-storage-key"
/>
If you need programmatic control, you can still listen to on:change:
<script>
import { Terminal } from 'svelte-bash';
function handleFsChange(event) {
// event.detail contains the new FileStructure
console.log("Filesystem changed:", event.detail);
}
</script>
<Terminal
structure={initialState}
on:change={handleFsChange}
/>
Svelte Bash now supports basic stream redirection (> and >>) out of the box. You can write the output of any command directly to a file:
$ ls -la > output.txt
$ cat output.txt
Need to edit files? Just type nano <filename> and you'll get a fully functional, zero-dependency GNU Nano GUI embedded right in the terminal space, allowing direct modifications to strings inside the virtual filesystem!
You can extend the terminal with your own commands or presets.
<script>
import { Terminal } from 'svelte-bash';
const myCommands = {
// Return a string
hello: () => "Hello form svelte-bash!",
// Accept arguments
echo: (args) => args.join(' '),
// Define an alias programmatically
ll: () => "alias ll='ls -la'"
};
</script>
<Terminal commands={myCommands} />
Typewriter Welcome Messages: Instead of printing immediately, welcome messages can be animated character-by-character.
<Terminal
welcomeMessage={["Wake up, Neo..."]}
typewriter={true} <!-- or {30} for typing speed -->
/>
ZSH-Style Syntax Highlighting & Ghost Completion:
Give your terminal that beloved Oh-My-Zsh feel. syntaxHighlight parses inputs to color valid commands green, invalid ones red, strings yellow, and flags blue. ghostCompletion predicts your next move.
<Terminal
syntaxHighlight={true}
ghostCompletion={true}
/>
Perfect for documentation or presentations. The terminal will automatically type and execute the provided sequence.
<Terminal
autoplay={[
{ command: "mkdir project" },
{ command: "touch project/index.js", delayAfter: 500 },
{ command: "ls -la" }
]}
typingSpeed={80}
/>
Svelte Bash allows comprehensive styling customization.
Built-in Presets:
dark (default)lightdraculamatrixCustom Theme Object:
<Terminal
theme={{
background: '#1a1b26',
foreground: '#a9b1d6',
prompt: '#7aa2f7',
cursor: '#c0caf5'
}}
/>
| Prop | Type | Default | Description |
|---|---|---|---|
structure |
FileStructure |
{} |
Key-value pairs defining the virtual file system. |
commands |
Record<string, Function> |
{} |
Custom command handlers. |
theme |
string | Theme |
'dark' |
Theme preset name or specific color object. |
user |
string |
'user' |
The username displayed in the prompt. |
promptStr |
string |
undefined |
Static override for the entire prompt. |
welcomeMessage |
string | string[] |
[] |
Message shown on initialization. |
typewriter |
boolean | number |
false |
Animate the welcome message character-by-character. |
syntaxHighlight |
boolean |
false |
Enable interactive ZSH-style tokenization. |
ghostCompletion |
boolean |
false |
Faint overlay predicting internal/external commands. |
persist |
boolean | string |
undefined |
Key to sync the filesystem structurally with localStorage. |
autoplay |
AutoplayItem[] |
undefined |
Array of commands to execute automatically. |
bootplay |
BootplayItem[] |
undefined |
Fast, non-interactive initialization logs. |
typingSpeed |
number |
50 |
Default typing speed for autoplay (ms). |
bootSpeed |
number |
10 |
Default stream interval for bootplay logs (ms). |
| Event | Detail | Description |
|---|---|---|
change |
FileStructure |
Fired when the filesystem is modified (mkdir, rm, etc). |
Contributions are welcome! Please feel free to submit a Pull Request.
MIT 漏 Yusuf Cengiz