visitor@laratermio:~$ 

laratermio

Your portfolio lives in the terminal. Visitors type commands to explore your work — no scrolling, no nav menus, no template layout.

laratermio — demo
laratermio demo

concept
An interactive terminal, not a webpage

The entire portfolio runs inside a browser-based terminal emulator. A visitor arrives, sees a prompt, and starts typing. There are no hero images, no carousels, no "contact me" buttons. Just a cursor and commands — and the discipline to make that interesting.

laratermio — bash
visitor@laratermio:~$ help
 
explore
about—Who I am and what drives me
contact—Get in touch
contact <email> <message>—Drop your email and a short message
education—Education & certifications
open <name>—Open a link in a new tab
search <query>—Search across education, experience, projects, skills
skills—Technical skills and stack
experience
experience—Work history
experience <n>—Jump directly to experience n
experience -a—Full work history at once
projects
projects—Side projects and open source
projects <n>—Jump directly to project n
projects -a—All projects at once
system
cd <dir>—Navigate the portfolio filesystem
clear—Clear the terminal screen
history—Show command history
ls—List contents of current directory
theme <mode>—Switch color scheme (light / dark / system)
whoami—Print current user identity

→ Curious? There are more commands that won't appear in help — explore and find them.


stack
What it runs on

Managed through a Filament 5 admin panel. All content — experience, projects, skills, terminal commands — lives in the database and is fully editable without touching code.

visitor@laratermio
─────────────────────
Terminal:laratermio
Framework:Laravel 13
PHP:8.5
UI:Livewire 4
Admin:Filament 5
CSS:Tailwind 4
Shell:jQuery Terminal
Media:Spatie Media Library
Mail:Resend
Database:MySQL 8
Tests:Pest 4

feature
PDF CV — generated from your content

Your terminal content doubles as a CV. Hit "Generate" in the admin panel and DomPDF renders everything — experience, education, skills, projects, contact — to a clean A4 PDF. The CV link appears automatically in the terminal nav once the file exists. One source of truth for your portfolio and your resume.

$ cv

One button in the admin panel. Experience, education, skills, and projects rendered to A4. The terminal picks it up automatically — no config, no code change.

PDF export

local development
Run the project

Sail / Docker (recommended — no local MySQL needed)

step 1
$ git clone sonole/laratermio
$ cd laratermio
$ cp .env.example .env
$ sail up -d
  ↳ app + MySQL containers
step 2
$ sail artisan optimize
$ sail artisan key:generate
$ sail artisan optimize
$ sail artisan migrate --seed
step 3
$ sail npm install
$ sail npm run dev
  ↳ visit localhost

seeding content

db:seed (and SystemSeeder) only seeds the admin user and terminal commands. Portfolio content is seeded separately. Pick one:

content seeding options
# Placeholder / demo content — fictitious data, safe to share
$ php artisan db:seed --class=ContentSeeder
 
# Your real content — edit PersonalContentSeeder with your own data first
$ php artisan db:seed --class=PersonalContentSeeder
 
# Or re-seed individual sections without touching the rest:
$ open localhost/admin/import-demo-content

Both seeders truncate their tables before inserting. Settings files and project media are deleted from disk and re-attached from public/stubs/. Prefix with ./vendor/bin/sail artisan when using Sail.

.env — required values
# ── App ─────────────────────────────
APP_URL=http://localhost
 
# ── Database ─────────────────────────
DB_HOST=mysql
DB_DATABASE=laratermio
DB_USERNAME=laratermio
DB_PASSWORD=
 
# ── Mail (Resend) ─────────────────────
RESEND_API_KEY=re_...
MAIL_FROM_ADDRESS=[email protected]
 
# ── Admin (created on first seed) ─────
# Contact form messages are delivered here
ADMIN_EMAIL=[email protected]
ADMIN_NAME="Your Name"

Admin at localhost/admin — default password is password, forced change on first login.


testing
Run the suite
laratermio — bash
$ sail composer run test        # pint + phpstan + pest
$ sail artisan test --compact     # just pest
$ sail composer run types:check  # larastan only
 
# or directly:
$ sail bin phpstan analyse --memory-limit 1G