Inspiration
The idea came from a simple frustration: the people best qualified to teach a skill are rarely the ones selling a $1,200 Udemy course.
Every team has a Python expert who could teach their designer to automate their workflow in an afternoon. Every startup has a marketer who could teach the engineers how to actually talk to customers. That knowledge exists, it's just siloed, and there's no mechanism to exchange it fairly. We also noticed that the skills gap problem is mathematically interesting. If NNN people each have a unique skill, and everyone wants to learn one other person's skill, a pure barter system fails. You need a credit economy to let value flow through the network. This is the same insight behind time-banking, but applied to professional skills at scale.
What it does
SkillSwap AI Development: runs locally via two terminal commands Production path: Vercel (frontend) + Render (backend) + Neon (PostgreSQL) — all free tiers AI: Ollama runs on the server machine; switchable to any OpenAI-compatible endpoint without code changes by swapping the base URL
How we built it
Python (FastAPI, SQLAlchemy, Pydantic) powers a backend with JWT auth and local AI via Ollama (Llama 3.2), while a React 18 + Vite + Tailwind frontend uses axios and React Router, integrates Jitsi Meet for video, and deploys on Vercel (frontend) and Render (backend) with SQLite in development and PostgreSQL in production.
Challenges we ran into
I ran into many challenges, from the frontend to the backend.
- Python 3.14 compatibility. Our target user had Python 3.14 installed — the bleeding edge release. Several of our dependencies either hadn't published wheels for it yet or had breaking API changes. We went through three rounds of dependency fixes before the install was clean.
- Avoiding a double /api/ prefix. We set axios.defaults.baseURL = '/api' globally, which meant calls like axios.get('/api/courses/my-courses') were hitting /api/api/courses/my-courses. The 404 was subtle because the error message didn't show the doubled path. We added a regex scanner across all frontend files to catch this pattern.
- Making the AI fallback invisible. When Ollama isn't running, the curriculum generator falls back to a structured template. We needed the fallback output to look as good as the real AI output so the demo works regardless of whether the judge's machine has Ollama installed. Route ordering in FastAPI. FastAPI matches routes top-to-bottom. A generic GET /api/sessions/{id} defined before GET /api/sessions/my-sessions would swallow the specific route, treating "my-sessions" as an ID. We learned to always define specific routes before parameterized ones.
Accomplishments that we're proud of
Everything. This is my first Hackathon, so its very cool.
What we learned
- Pydantic version compatibility is a real hazard. Pydantic v2 requires compiling pydantic-core from Rust source. On machines without a Rust toolchain (which is most), the install silently fails or produces cryptic errors. We learned to pin to Pydantic v1 and use --prefer-binary pip flags to always pull pre-built wheels.
- passlib is broken on Python 3.14. The bcrypt module dropped its about attribute in a recent release, which broke passlib's version detection. The fix was to drop passlib entirely and call bcrypt directly — fewer abstraction layers, same security.
- localhost is not always 127.0.0.1. Modern macOS and Node 18+ resolve localhost to ::1 (IPv6) first. If your server binds to 0.0.0.0 (IPv4 only), the proxy connection times out with ETIMEDOUT. Explicitly binding to 127.0.0.1 on both the server and Vite proxy config fixed this completely.
- Local LLMs are surprisingly capable for structured tasks. Llama 3.2:3B at 3 billion parameters generates valid, useful curriculum JSON reliably when the prompt is specific about output format. For open-ended generation it sometimes drifts, but with a tight schema and a fallback, it works well enough for a production demo.
What's next for SkillSwap AI
SkillSwap AI has the potential to become a real business. Adding more features, finding an audience, and just tweaking some things to change the model from a hackathon project to a real industry level product is possible.
Built With
- auth
- bcrypt;
- fastapi
- javascript
- jitsi
- jwt
- llama
- ollama
- postgresql
- pydantic;
- python
- python-jose
- react
- react-18
- sqlalchemy
- sqlite
- tailwind-css
- vercel
- vite
Log in or sign up for Devpost to join the conversation.