TL;DR: I built PackagePal — paste in any package from any language, pick your target language, and AI instantly finds the equivalent. No more Googling "what's the Node.js version of Python's requests?"
The Problem That Drove Me Crazy
You know that moment when you're migrating a project — or just jumping between ecosystems — and you hit a wall trying to find the right package?
I do. Every time.
# You're used to this in Python
import requests
response = requests.get("https://api.example.com/data")
And you move to Node.js and think: "Okay, what do I use here? axios? node-fetch? got? undici?"
So you Google it. You find a Stack Overflow thread from 2019. Half the answers recommend packages that are now deprecated. You open 6 tabs. 20 minutes later you're still not sure which one is the current best choice.
This wasn't a once-in-a-while thing for me. It happened constantly — switching between Python, JavaScript, Go, and Ruby on different projects. I was wasting real hours on a problem that felt completely solvable.
So I built PackagePal.
What PackagePal Does
PackagePal uses AI to understand what a package actually does — its purpose, not just its name — and finds the best equivalent in whatever language you're moving to.
The key insight: this isn't a lookup table. A simple mapping of requests → axios misses context. What if you're using requests for its session management? Or its retry logic? PackagePal surfaces options and explains why each one is a good match.
Example searches people use it for:
- Python's
pandas→ JavaScript - Ruby's
devise→ Node.js - Go's
cobra→ Python - JavaScript's
lodash→ Go
Just type the package, pick the target language, and get results in seconds.
👉 Try it: packagepal.dev
How I Built It
Tech Stack
- 🤖 AI: Gemini Pro — handles the semantic understanding of what a package does and why an alternative matches
- ⚛️ Frontend: React + TypeScript
- ⚙️ Backend: Node.js + TypeScript on Google Cloud
- ⚡ Caching: Redis — so repeat searches (e.g., "requests → Node.js" gets searched constantly) are instant
The Architecture Decision That Mattered Most
Early on I tried a pure lookup-table approach: maintain a database of known equivalents. It fell apart immediately. There are thousands of packages across dozens of ecosystems, and the "best" equivalent changes as the ecosystem evolves.
The AI approach was the right call. Instead of asking "what package has a similar name?", Gemini gets asked "what does this package do, and what package in the target language serves the same purpose best?" The results are dramatically better.
The Redis caching layer was a fun addition — popular searches like requests → Node.js or lodash → Python get cached so users get sub-100ms responses for anything that's been searched before.
The Hardest Part
Honestly? Prompt engineering. Getting Gemini to return structured, consistent results that I could reliably parse and display took a lot of iteration. The model would sometimes return one suggestion, sometimes five, in varying formats. I eventually settled on a structured output format with explicit instructions for how many alternatives to return and what information to include for each.
What I Learned
1. Semantic search beats keyword search for this use case
A mapping table would need constant manual maintenance. AI handles edge cases, niche packages, and new packages automatically.
2. Caching is underrated for AI apps
AI inference isn't free. For a tool where the same queries come up repeatedly, Redis made the product both faster and cheaper to run.
3. Ship early
I spent too long polishing before launching. The feedback I got in the first week of real users pointed to things I never would have caught in isolation.
What's Next
- More languages — currently covers the most popular ones; expanding to Rust, Swift, Kotlin, and more
- Version context — surfacing whether a recommended package is actively maintained
- Reverse search — "I found this package, what does it do?"
- VS Code extension — hover over an import and see cross-language equivalents inline
Try It & Let Me Know What You Think
PackagePal is live at packagepal.dev. It's free to use.
If you try it, I'd genuinely love to hear:
- Did it find the right equivalent for your use case?
- What languages or packages should I prioritize next?
- Any features you'd want?
Drop a comment below or reach out directly. I read everything.
Built by Sagar Kashyap. If you found this useful, sharing it with a dev friend who migrates between stacks would mean a lot 🙏
Top comments (0)