DEV Community

Cover image for I Was Tired of My Terminal Being Dumb — So I Built Termim
Md Mim Akhtar
Md Mim Akhtar

Posted on

I Was Tired of My Terminal Being Dumb — So I Built Termim

Project-aware history and pattern learning

Ever tried to find a command in your terminal history by pressing ↑ the up arrow key repeatedly?

If you use the terminal a lot, you’ve probably faced this:

You know you’ve run a command before…
But now you’re stuck doing:

Ctrl + R → type → scroll → scroll → wrong command → repeat

And somehow, it still pulls results from a completely different project.

That’s when it hit me:

Shell history isn’t broken because it’s slow.
It’s broken because it has zero context.

So I built something to fix that.

Meet Termim

Termim GitHub
Termim = your terminal remembers per project.

Instead of one global history mess, Termim gives you:

  • Project-specific history
  • Behavior-based suggestions
  • Fast navigation without friction

No noise. Just relevant commands.

The Real Problem

Your terminal history today:

  • mixes all projects together
  • has no idea where you are
  • treats everything as equal

So when you search, you get:

  • commands from last week
  • commands from another repo
  • commands that don’t even apply anymore

It’s not helpful—it’s overwhelming.

What Termim Changes

1. Project-Aware History

When you’re inside a project:

  • you only see commands from that project
  • no cross-project pollution
  • no accidental mistakes

Your (arrow up) key finally makes sense again.

2. It Learns How You Work

Termim doesn’t just store commands—it tracks patterns.

Example:
git add .
→ git commit
→ git push

Over time, it learns these flows using weighted transitions.

So instead of searching, you just… move forward.

3. Navigation That Feels Natural

↑ → project history → global history
↓ → back into project → predictions

No new mental model.

Just better behavior.

4. Built for Speed

No DB. No daemon. No bloat.

  • ~15ms latency
  • zero dependency core
  • works across Bash, Zsh, Fish, PowerShell

It feels like part of your shell, not an add-on.

Why I Didn’t Just Use Existing Tools

I tried tools like Atuin, McFly, etc.

They’re good—but:

  • they still feel global
  • context is “soft”, not enforced
  • some rely on background services

I wanted something stricter and simpler:

When I’m in a project, my terminal should behave like it knows it.

Small Details That Matter

A few things I cared a lot about:

  • Hard context isolation (no leaking commands)
  • Success-only learning (ignore failed commands)
  • Privacy-first (everything local, secrets redacted)
  • Deterministic behavior (no randomness in navigation)

What It’s Not

Termim is NOT:

  • an AI copilot
  • a cloud product
  • a heavy productivity suite

It’s intentionally minimal.

It solves one problem well:

making terminal history actually useful.

Who This Is For

If you:

  • jump between multiple repos daily
  • live inside your terminal
  • rely on command recall a lot

You’ll feel the difference immediately.

Final Thought

We’ve accepted bad terminal history for years.

Termim is just a small attempt to fix that.

Not by adding more features... but by adding context.

Termim on GitHub: Termim

If you want to try it or give feedback, I’d genuinely appreciate it 🙌

Top comments (20)

Collapse
 
itskondrat profile image
Mykola Kondratiuk

shell history without context is basically a log file you search by muscle memory. multi-project setups are where this breaks hardest - same command, completely different meaning depending on directory.

Collapse
 
itsmimakhtar profile image
Md Mim Akhtar

Hi Mykola!

You're right. The "muscle memory" search works fine until you have 5 projects all using npm run dev or make build.

Standard history doesn't know the difference between your Production API and your Side Project, which is how "Environment Bleeding" happens. Termim was built specifically to turn that "log file" into a contextual memory... so your Up-Arrow actually knows where you are standing.

Collapse
 
itskondrat profile image
Mykola Kondratiuk

contextual terminal history solves part of it. the harder case is when you're intentionally cross-pollinating - running a prod command to compare output against staging, or testing from project B while in project A's shell. path-based context breaks there because intent doesn't match working directory. curious how Termim handles that edge.

Thread Thread
 
itsmimakhtar profile image
Md Mim Akhtar

Good point.

Termim handles this specifically with The Escape Path. So when you press [Up Arrow], Termim prioritizes your local directory's history first.

But if you keep pressing up and exhaust that local context, Termim seamlessly "escapes" the boundary and hands off to your shell's native global history.

So it optimizes for the 90% local case, but never locks you out of your global history when your intent shifts...

Thread Thread
 
itskondrat profile image
Mykola Kondratiuk

the escape path solves the exhaust case cleanly. gap I keep hitting is intent mismatch - in project A but want project B's prod command intentionally, not as a fallback. directory-first still bakes in an assumption that breaks there.

Thread Thread
 
itsmimakhtar profile image
Md Mim Akhtar • Edited

You’re right... I was confused first, but now I've got it clear.

I actually just pushed an update (v1.1.3) to solve this exact "intent mismatch." The Ctrl+P search palette is now Layered (Local > Global).

It still prioritizes the current directory at the top to keep the noise out, but it now falls back to the global history for the rest of the searchable results. Now you can grab that Docker command from Project B while sitting in Project A without having to fight the directory filter.

Isolation for the noise, global for the search. And cheers for the sharp feedback!

Thread Thread
 
itskondrat profile image
Mykola Kondratiuk

layered fallback is the right call. Local > Global maps to how engineers actually think about scope — current project wins, full history still accessible. shipping v1.1.3 in the same feedback window is the part that usually gets dropped; most tooling updates land two sprints after the conversation closes.

Thread Thread
 
itsmimakhtar profile image
Md Mim Akhtar

I really appreciate the sharp feedback. Cheers, Mykola!

I’ve actually featured our technical deep dive on the new 'Community Perspectives' page on the Termim site. It serves as a great case study for why 'Context-First' is the right path, but why global fallbacks are necessary for real-world flow.

Thanks for pushing the logic forward!

Thread Thread
 
itskondrat profile image
Mykola Kondratiuk

cool, didn't know termim had a community perspectives page. makes sense though - context-first tradeoffs are exactly the kind of thing that needs real examples to land, not just theory.

Thread Thread
 
itsmimakhtar profile image
Md Mim Akhtar

Just published it recently along with the v1.1.3 update.

Thread Thread
 
itskondrat profile image
Mykola Kondratiuk

ah, good to know - will actually dig into it now instead of just scanning the release notes

Collapse
 
pengeszikra profile image
Peter Vivo • Edited
zoxide
alias h="history | rg"
# rg = rip-grep
# set history size to 100k
Enter fullscreen mode Exit fullscreen mode
Collapse
 
itsmimakhtar profile image
Md Mim Akhtar

Main difference with Termim is it’s not search-first, it’s context-first. So ideally you don’t even reach for history | rg.

Collapse
 
yogionbioinformatics profile image
Yogindra Raghav

@itsmimakhtar

Really cool stuff!
Do you mind jumping into a bit more detail about this vs Atuin?

Is there maybe any simple GIF or even you just listing out a few independent examples of this vs Atuin.

I'm really trying to give this a shot before using atuin so I would appreciate any insight!

Collapse
 
itsmimakhtar profile image
Md Mim Akhtar

Hi Raghav! Sorry for the late response. Thansk for asking the question.

Atuin is no doubt a powerful sync engine with a database, whereas Termim is a lightweight context engine designed for a different workflow:

Zero-Daemon: Termim is a sub ~5ms binary with no background services. It works with your native shell rather than replacing it with a full-screen UI.
Directory-First by Default: When you hit Up Arrow, Termim gives you the last command ran in this specific folder instantly. No searching required.
Predictive Intent: Hitting Down Arrow on a blank prompt suggests your "Next Move" (e.g., git push after git commit) using behavioral Markov models.
Privacy Sieve: It redacts secrets (API keys, JWTs) in-memory before they touch your history files.

In short: Atuin is for Global Sync; Termim is for Local Context & Flow.

It takes 3 seconds to install... give it a spin and see if the "context-switching" feel works for you...

Give it a try... Would love your feedback/suggestion...

Collapse
 
yogionbioinformatics profile image
Yogindra Raghav

Thanks so much for the info!

Collapse
 
d3d_snx_acb3b4176ee27d6eb profile image
d3d snx

Interesting stuff! As someone who has started spending more of my time in the terminal this is genuinely something that I could benefit from using! Thanks for sharing!

Collapse
 
itsmimakhtar profile image
Md Mim Akhtar

Most welcome. Do give it a try and share your feedback/suggestion. Appreciate your interest 🤍

Collapse
 
ezejah_chimkamma_06758a9b profile image
Ezejah Chimkamma

This is such a clean idea.

Terminal history always felt “off” but I never framed it as a context problem until now.

Project-aware commands + behavior learning is a real upgrade

Collapse
 
itsmimakhtar profile image
Md Mim Akhtar

Yeah that's what Termim aims to do 💯