A terminal-emulator portfolio β fully data-driven, forkable in 10 minutes.
Links
- π¦ Repository β github.com/srs-sudeep/Termx
- π Live Demo β termx.vercel.app
- π¬ Video Demo β youtu.be/-oJOWGoLEAc
TermX was inspired by satnaing/terminal-portfolio.
- Powerline-style prompt β oh-my-zsh inspired colored segments (
user@host βΆ path βΆ β―) that adapt to the active theme. - Ghost-text autocomplete β inline suggestions with
Tabcycling andβto accept, no popup lists in the buffer. - Looks and feels like a real terminal β boot sequence, command history, autocomplete, ANSI-style output, and a Matrix-rain easter egg.
- 14 themes built in β Tokyo Night by default; switch with
theme set <name>or the settings panel. - Easy to make your own β update one config file (
src/config/user.config.ts) with your name, projects, experience, and links. - Strong first impression β large ASCII banner of your name plus a portrait emblem on the welcome screen.
- Remembers your preferences β theme, font, and other settings persist via
localStorage. - Works well on desktop and mobile β responsive layout, accessible focus management, reduced-motion support.
- Private by design β 100% client-side, no analytics, no backend, no account.
- Quality-gated β lint, typecheck, and 180+ tests run via Husky pre-push hook.
| Welcome screen | Help |
|---|---|
![]() |
![]() |
whoami |
projects |
|---|---|
![]() |
![]() |
experience |
education |
|---|---|
![]() |
![]() |
contact |
neofetch |
|---|---|
![]() |
![]() |
sudo / fortune |
Settings panel |
|---|---|
![]() |
![]() |
Switch with theme set <name> or open the settings panel.
![]() |
![]() |
![]() |
| tokyo-night (default) | termfolio | dracula |
![]() |
![]() |
![]() |
| nord | one-dark | monokai |
![]() |
![]() |
![]() |
| gruvbox-dark | gruvbox-light | solarized-dark |
![]() |
![]() |
![]() |
| solarized-light | hacker | matrix |
![]() |
![]() |
|
| retro | light |
core
help Show available commands
clear Clear the terminal (alias: cls)
echo Print text
whoami Who am I
date Current date and time
history Show command history
man Manual page for a command
pwd Current directory
ls List directory contents
cd Change directory
portfolio
about Who I am (alias: bio)
projects Browse my projects (alias: work)
skills My skills
experience Work experience
education Education history
contact Get in touch
social Social profiles
resume Download my rΓ©sumΓ© (alias: cv)
system
theme Manage terminal themes
font Change font family or size
settings Open the settings panel
reset Reset all preferences
fun
neofetch System info, terminal-style
banner Large ASCII name
cowsay Classic cowsay
fortune Random programming wisdom
coffee 418 I'm a teapot
sudo Permission denied: nice try.
matrix Enter the Matrix (Esc to exit)
hack Elite hacking simulation
# 1. Fork this repo on GitHub, then clone your fork
git clone https://github.com/YOUR_HANDLE/TermX.git
cd TermX
# 2. Install dependencies
bun install
# 3. Edit your personal data β this is the only file you need to touch
$EDITOR src/config/user.config.ts
# 4. Start the dev server
bun run devOpen http://localhost:5173.
Everything user-editable lives in src/config/.
| File | What lives here |
|---|---|
user.config.ts |
Name, bio, projects, skills, experience, education, social links, contact, fortunes |
themes.config.ts |
Colour themes β add your own or remove ones you don't need |
commands.config.ts |
Custom commands or overrides for built-in commands |
settings.config.ts |
Boot sequence on/off, default theme, typewriter effect, prompt template |
// src/config/commands.config.ts
import type { Command } from '@/types';
export const customCommands: Command[] = [
{
name: 'spotify',
description: 'Open my Spotify profile',
category: 'custom',
execute: () => ({
type: 'redirect',
url: 'https://open.spotify.com/user/yourhandle',
newTab: true,
}),
},
];// src/config/themes.config.ts β append to the themes array
{
name: 'catppuccin',
label: 'Catppuccin Mocha',
mode: 'dark',
colors: {
bg: '#1e1e2e', fg: '#cdd6f4', cursor: '#f5e0dc',
prompt: '#a6e3a1', accent: '#cba6f7',
success: '#a6e3a1', error: '#f38ba8',
warning: '#f9e2af', info: '#89dceb',
muted: '#6c7086', selection: '#313244', border: '#45475a',
},
font: { family: '"JetBrains Mono", monospace', size: '14px', lineHeight: '1.6' },
},Then run theme set catppuccin.
TermX is a static SPA β deploy anywhere.
bun run build # output: dist/| Platform | Instructions |
|---|---|
| Vercel | vercel --prod β vercel.json included, zero config |
| Netlify | Connect your repo β netlify.toml included |
| GitHub Pages | Push to main β Actions workflow builds and publishes |
| Cloudflare Pages | Build command bun run build, output directory dist |
| Runtime / pkg manager | Bun |
| Bundler | Vite 5 |
| UI | React 18 + TypeScript 5 strict |
| Styling | TailwindCSS 3 + CSS variables |
| State | Zustand 4 |
| Animation | Framer Motion 11 |
| Testing | Vitest 2 + Testing Library |
| Code quality | ESLint 8 + Prettier 3 + Husky 9 |
| Key | Action |
|---|---|
Tab |
Autocomplete / cycle through matches |
β |
Accept ghost-text suggestion |
β / β |
Navigate command history |
Ctrl + L |
Clear screen |
Ctrl + C |
Cancel current input |
Ctrl + U |
Clear input line |
Esc |
Exit matrix / hack effects |
bun run dev # start Vite dev server (HMR)
bun run build # tsc --noEmit + vite build
bun run preview # preview the production build locally
bun run typecheck # tsc --noEmit only
bun run lint # ESLint (zero warnings allowed)
bun run lint:fix # auto-fix lint issues
bun run format # Prettier write
bun run format:check # Prettier check (CI)
bun run test # Vitest (single run)
bun run test:watch # Vitest watch mode
bun run test:coverage # coverage report
bun run validate # lint + typecheck + tests (CI gate)
bun run prepush # format + validate (run before pushing)Installed automatically on bun install:
pre-commitβ runs lint + typecheck on every commitpre-pushβ runs format + lint + typecheck + tests before push
Bypass with --no-verify if absolutely needed (not recommended).
src/
βββ config/ β USER-EDITABLE: your personal data + settings
βββ commands/ β one file per command (core / portfolio / system / fun)
βββ components/ β React UI components
βββ hooks/ β custom React hooks
βββ lib/ β framework-agnostic logic (parser, registry, storage)
βββ store/ β Zustand stores (terminal, theme)
βββ types/ β TypeScript types (single source of truth)
βββ styles/ β global CSS + theme variable definitions
MIT β fork freely, that's the point.























