Ghost Money 尋找未申領的獎學金與其他機會
Ghost Money
Ghost Money 根據用戶的個人資料,以可讀規則配對獎學金、競賽、研究職位等機會,並按截止日期排序。資格判斷在瀏覽器中進行,Qwen2.5-1.5B-Instruct 在本機為熱門結果撰寫建議;資料不會離開用戶的裝置。工具列出 38 項機會,並提供獎勵、截止日期、配對原因及官方連結。
This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
Ghost Money is a séance for the opportunities nobody told you about.
Every year, scholarships, hackathon prizes, paid fellowships, conference travel grants and research placements go unclaimed. They are not secret. They are just buried across hundreds of pages, with different rules, different deadlines and different eligibility. They haunt your profile without you ever knowing.
You describe yourself once: country of citizenship, where you are in your studies, your field, and optionally your age and household income. You press Summon the ghosts, and the app calls up everything you appear to qualify for, sorted by how soon it closes:
- 🎓 Scholarships
- ⚡ Hackathons and 🏆 competitions
- 🌱 Open source programs
- 🧭 Fellowships
- ✈️ tech conferences
- 🔬 Research placements
- 💼 Internships and externships
- 🧾 Part-time jobs and 📚 tutoring
Every result shows the reward, a deadline countdown, why you matched, what you need to do, and a link to the official page. A running total shows the listed prize pools and stipends you are eligible for.
How I read the theme: the ghost in the machine is the forgotten thing that is still there, still real, still waiting for someone to notice it. Here, that is money and chances left unclaimed. The interface is a candlelit séance, and the button really does say "Summon the ghosts". It is spooky on the outside and practical on the inside.
Demo
Code
To run it:
pip install -r requirements.txt, then uvicorn main:app --reload, then open http://127.0.0.1:8000. You can also just open static/index.html in a browser: the matching works without the server, and only the AI advice needs it.
How I Built It
Open-weight model: Qwen2.5-1.5B-Instruct, loaded from Hugging Face with the transformers library and run locally. You can swap in any other model with the GHOST_MODEL environment variable.
Stack: FastAPI, Hugging Face Transformers, and plain HTML, CSS and JavaScript.
Your profile (never leaves your machine)
|
v
Eligibility rules, running in the browser
country, level, field, age, income, deadlines
|
v
Your matches, sorted by deadline
|
v
Local Qwen writes one line of advice per top match
|
v
Guardrail: any line with a number that is not in the listing is discarded
The design choice I care about most is the split between rules and the model:
- Eligibility is plain code, not AI. Whether you qualify for something is a yes or no question with real consequences, so it is decided by readable rules (country lists, level, field, age limits, income caps). Every match comes with the reasons it matched, and cases the rules cannot settle, such as a missing age, show as a warning instead of a guess.
- The model only does what it is good at. Qwen writes a short, practical sentence of advice for each top result, such as what to start with and how to prioritise.
- The model cannot invent facts. It sees only the listing fields (name, reward, deadline, days left, first requirements) and your study level and field. If its answer contains any number that is not in that data, the line is thrown away and the rule-based advice is shown instead.
-
Everything degrades gracefully. If the model is still downloading, switched off (
GHOST_LLM=0), or the server is not running, the page still works with rule-based advice. The status badge at the top tells you which mode you are in.
Each of the 38 entries carries a source note and a last-checked date. Where a date is an estimate the card says so with a "~" and a note.
Why Does Open Innovation Matter?
The inputs to this app are about as personal as data gets: where you are a citizen, how much your household earns, how old you are, what you study. People in exactly the situations this app is meant for are the ones with the most reason to be careful about who sees that.
- Your profile stays with you. With a closed API, the same advice would mean sending your income and citizenship to a third party. With an open-weight model running locally, nothing leaves the machine. The matching runs in your browser, and the model runs on your own computer.
- It costs nothing to run. There is no per-token bill, no subscription and no API key. That matters for a tool aimed at people looking for money.
- You can inspect all of it. The eligibility rules are readable code, the prompt is visible, and the guardrail that rejects invented numbers is a few lines you can check. Nobody has to trust a black box about whether they qualify for a scholarship.
- You can change it. Want a bigger model, or one that fits an older laptop? Set one environment variable. Want to add your own country's grants? Add an entry to the list.
- It will not disappear. It is not tied to a service that can change its pricing or shut down. A static page and a model on your disk keep working with the lights off.
The Spirit of It
Most unclaimed opportunities are not lost because people are unqualified. They are lost because nobody told them they existed. I built Ghost Money for the person who has never been told, who does not have a mentor pointing at a deadline, and who should not have to give up their private details to find out what they are owed.
Prize Categories
來源:DEV Community · dev.to