Trending on Stackness
Data as of
These rankings count what people do on Stackness: a trending tool is one that was added to the most stacks in the window, a rising tool is one whose recent additions are the largest share of its total users, and a trending move is the one that collected the most reactions. When a window is too quiet to rank, it widens to the next one and the page says which window it used. This is platform usage, not the imported history series that tool pages and trend waves chart - see where our data comes from.
Top tools this week
Not enough activity this week - showing this month
Top tools this month
Trending moves
Not enough activity this week - showing this month
I used to commit without looking. I'd stage changes, write a message, and push. Then I'd discover I'd left in a pdb breakpoint, or staged a credentials file, or bundled someone else's work into my branch. After the third time I had to force push to undo a bad commit, I started actually reading what I was about to ship. Now I run git diff --cached before every commit. It takes maybe a second per commit, and I catch the thing that will break the build or get called out in review about one commit per week. Sometimes it's a debug print I forgot. Sometimes it's a line count that's way off from what I intended, which usually means I've accidentally pulled in unrelated changes. The command is straightforward: stage what you think belongs, then git diff --cached to see the stat line and the full diff. If something looks wrong, unstage it with git reset and fix it. Only then git commit. I also use git add -p when I'm touching multiple things, which forces me to review line by line as I stage. It does not work when you're in a hurry and you skip the check anyway. And it obviously does not catch logic errors, just the obvious mechanical mistakes. But if you actually do it, you will catch stray files and oversized diffs before they land in the repository. ```bash $ git diff --cached --stat internal/handler/move.go | 18 +++++++++--- internal/handler/move_test.go | 42 ++++++++++++++++++++++ .env.local | 3 +++ 3 files changed, 60 insertions(+), 3 deletions(-) $ git restore --staged .env.local ```
I used to just let conversations run until Claude started contradicting itself three turns back, which is a great way to debug your own debugging. Then I'd paste the entire mess into a new session and hope it read faster than I type. Spoiler: it didn't, and I'd lose the thread anyway while Claude re-indexed my life story. So now I cap sessions at around 65 percent of the window and write a summary before context gets stale. The summary has to be ruthlessly concrete: what we built, what broke, what the actual code looks like now, what we're trying next. I paste that summary as the first message in the next session instead of pasting twelve turns of my increasingly delirious questions. With Claude Code or Cursor, I just write "---SUMMARY---" in my notes at the midpoint, then force myself to actually write it out. The session ends, I start fresh, paste the summary, and we pick up without me re-explaining why I thought TypeScript generics were optional. The next session stays sharp because the context is distilled, not diluted. The catch is this only works if your summary is actually useful. If you write "continued on the file" and nothing else, you're just making the next session mad at you. Also, some problems genuinely need the full conversation history, especially when you're debugging why someone else's legacy code exists. Summaries help, but they're not magic for gnarly interdependencies.
I used to keep prod secrets in encrypted files checked into git. This meant every deploy required decryption, every env had its own schema, and one careless moment leaked everything. The cognitive load was constant. I moved to the pattern where only env var names live in version control. I commit a .env.example that lists what keys must exist, nothing more. All actual values come from the runtime environment. For local dev I use direnv to load from a .env file that git ignores. For production, Vercel handles injection directly in the UI. Running direnv allow in a project directory loads the .env automatically whenever you cd into it. The.env.example file stays lean: API_KEY=, DATABASE_URL=, AUTH_SECRET=. If someone forks the repo, they see the shape of what they need without seeing actual values. A leaked .env.example is just a checklist. This breaks down in teams that refuse to use direnv or need secrets in CI/CD systems that don't integrate cleanly. If your pipeline expects files instead of environment variables, you end up bolting on an extra layer anyway. But for anything touching Docker or serverless platforms, this approach removes a whole category of mistakes.
I used to write end to end tests for everything. Click this button, fill that form, check the result. It felt safe but every test run took forever and when something broke, all I got was a screenshot showing me a blank form or a missing element. Then I'd have to dig through logs to find which function actually failed. The shift was simple: keep the e2e tests only for the flows that would genuinely tank the business if they stopped working. For me that's user signup, payment processing, and core search. Everything else moved down to integration tests with Vitest where I test the actual functions and API endpoints directly. Now my test suite runs in under a minute instead of ten. When a test fails, Vitest tells me exactly which function broke and why, not just that something on the page is wrong. I can verify a complex checkout flow with an integration test that sets up the database, calls the controller, and checks the response in about thirty lines. The honest caveat is that this approach assumes you have good logging and error handling already in place. If your app swallows errors or logs them poorly, you'll miss bugs that e2e tests would have caught. I also still need the handful of e2e tests because screenshots do catch visual regressions and weird browser quirks that integration tests miss entirely.
Describing what you want, accepting what the model writes and iterating on the result without reading much of it. Andrej Karpathy named it in February 2025.
Reaching for managed functions and hosted services before provisioning a server, and paying per request instead of per hour.
Fetching the relevant documents at question time and putting them in the model's context, instead of relying on what the weights happen to remember.
Servers, networks and clusters declared in files that live in the repository and are applied by a tool, rather than clicked together by hand and remembered by whoever was on shift.
One repository for many projects, with shared tooling and atomic cross-project changes. Google and Facebook's internal practice reached everyone else through a generation of build tools.
I used to commit whatever was staged, which sounds efficient until you realize that efficiency in the wrong direction just means you commit faster. I'd push a branch with three test files still in there, or a package-lock.json file I never meant to touch, or worse: a five hundred line refactor when I'd sworn I was only fixing the bug. The commit would land, someone would ask why that one change was in there, and I'd have to squint at GitHub and pretend I had a reason. So now I run `git diff --stat` before every single commit. It takes about one second. I read through the stat line, check the file count, verify the numbers make sense for what I thought I was doing, and then I commit. That's it. The tool is just git. The discipline is knowing that one second now saves five minutes of explaining later. The concrete detail is the stat line itself. `git diff --stat` shows you file names and the number of added and deleted lines in a tiny ASCII chart. If I see a node_modules change or a lockfile in there, I know I'm about to make a mistake. If I see a file I don't recognize, I stop and figure out why it's there. If the numbers don't match my intent, I unstage and re-sort what I'm actually committing. The caveat is that this only works if you're committing conscious changes. If you're in the middle of a refactor where you're genuinely touching forty files at once, the stat line won't save you. You still need to have structured your work so that you know what belongs together. This is a safety rail, not a strategy. ```bash $ git diff --cached --stat internal/handler/move.go | 18 +++++++++--- internal/handler/move_test.go | 42 ++++++++++++++++++++++ .env.local | 3 +++ 3 files changed, 60 insertions(+), 3 deletions(-) $ git restore --staged .env.local ```
Rising tools
Not enough activity this week - showing this month
Reports and roundups
Want the charts behind these rankings?
Supporters get the weekly Stackness trends newsletter and trend waves, the interactive charts of how tools rise and fall over time.