🌱 Cultus Youth
Every scholarship, internship, competition and hackathon for students, in one bilingual place, sorted by deadline, with an assistant that finds the right one for you.
🌟 Inspiration
Good opportunities are posted every day, but they get buried in Telegram chats, feeds and screenshots. Many students miss a deadline not because they were not qualified, but because they never saw the post in time. Searching through scattered channels takes almost as long as applying.
That inspired Cultus Youth: a hub that collects opportunities from our Telegram channel, checks them, and puts each one's deadline and apply link in one searchable place. The name comes from the Latin word for cultivation: growing young people through what they apply for and win.
💡 What It Does
Cultus Youth is a free, bilingual (Arabic and English) website with an opportunity assistant.
- Opportunities page: search by keyword, filter by type (internship, scholarship, competition, hackathon, CTF, workshop), format (remote or onsite) and track (web, mobile, cybersecurity, data, AI, competitive programming, research, languages). Sort by upcoming deadline or newest post, and hide expired items.
- Home page: live counts of open opportunities and those closing within 7 days, plus a "Closing soon" strip.
- Assistant chatbot: a student writes what they study or want ("Flutter internship", "أمن سيبراني عن بعد"), and the assistant returns the best open matches, soonest deadline first, each with an apply link.
- Deadline urgency: cards show "Closes in 3 days" and are colored by how urgent they are.
- Arabic and English: full RTL support, Arabic copy, and light and dark themes.
- Suggest an opportunity: anyone can send one by email; every suggestion is reviewed before it goes live.
🛠 How We Built It
The project has two parts: a static website and a Python scraper that you run on your own computer.
Website (HTML, CSS, vanilla JS)
- No framework, no server and no build step. It can be hosted free on GitHub Pages, Vercel, Netlify or Cloudflare Pages.
- Shared modules for language and theme (
common.js), all UI text in English and Arabic (i18n.js), pure helper functions (utils.js) and the chatbot logic (matcher.js). - Opportunities are read from a single
opportunities.jsonfile, so publishing means committing that file.
Chatbot (runs in the browser)
- A keyword lexicon in English and Arabic maps a message to tracks, types and modes.
- Results are scored (tag matches weigh more than words found in the title), only open opportunities are returned, and short Latin words must match as whole words.
- Nothing is sent to a server, so there is no API key to leak and no user data to store.
Telegram scraper (Python)
- Reads the channel with Telethon (topic mode, search mode) or the public preview page (channel mode).
- Extracts the deadline, apply link, title and labels from each post:
- Arabic-Indic digits, Arabic and English month names, and
dd/mm/yyyyordd-mmformats. - The date on or right after a line with a deadline word ("آخر موعد", "deadline", "apply by").
- The apply link is preferred from a line with an "apply" word, and Telegram and social links are skipped.
- Arabic-Indic digits, Arabic and English month names, and
- Optional free LLM titles (Pollinations without a key, or Groq) with a grounding check, and a heuristic fallback when the model is off or fails. The LLM never touches the deadline or the link.
- Nothing reaches the website until a human approves it: a review email (Gmail SMTP with an app password), then
--reviewto approve, reject or edit one by one, or--approveand--rejectby id.
Security
- Scraped text is rendered with
textContentonly, never parsed as HTML. - Only
httpandhttpslinks are ever used as hrefs, on both the Python and JS sides. - Control and bidi-override characters are stripped from scraped text.
- A Content-Security-Policy limits scripts to the site itself.
- The AI title prompt treats the post as data inside
<post>tags, and output that is not grounded in the post is rejected, which blocks prompt injection. - Secrets, session files and pending items are blocked by
.gitignore. - Email subjects are fixed, so scraped text never reaches mail headers.
Tests
node --testfor deadline math, sorting, URL safety and the matcher in English and Arabic.pytestfor deadline parsing, titles, link choice, sanitization, the approval flow and AI title handling.
🧩 Challenges We Ran Into
- Messy Telegram posts. Deadlines appear as "١٥ أكتوبر ٢٠٢٦", "20/11/2026" or "آخر موعد ٣١-١٢". Handling Arabic digits, month names, day-first dates and posts from December with January deadlines took careful rules and tests.
- Picking the right link. Posts contain Telegram, social and apply links together, so the scraper has to find the one that actually applies.
- Useful titles from noisy text. Headers like "🔥 فرصة جديدة!" say nothing, so the title logic skips them and an optional LLM can improve them safely.
- Trusting scraped content. The text comes from the internet, so it is treated as untrusted at every step.
- Small matcher bugs. For example, "training" contains "ai", so short Latin keywords now require a whole-word match.
- Free-tier limits. AI titles are rate limited, so the scraper only calls the model for posts that survive the filters.
🏆 Accomplishments We're Proud Of
- A full pipeline from Telegram post to approved, published opportunity, with no paid service and no backend.
- A human-in-the-loop approval flow, so a wrong date or link never goes live unchecked.
- An assistant that works in both Arabic and English with no server and no stored user data.
- A bilingual, RTL-ready, accessible interface with light and dark modes and reduced-motion support.
- Security built in from the start, with tests covering both the Python and JavaScript sides.
📚 What I Learned
- Parsing real-world Arabic text is its own problem: digits, months, bidi characters and informal phrasing all need handling.
- Treat every scraped string as hostile and every LLM output as a suggestion that must be validated.
- A rule-based assistant can be fast, private and good enough, and AI is best used for small, checkable jobs like titles.
- Keeping the human approval step makes automation trustworthy.
🔮 What's Next
- Personalized matching: let students save their field and interests locally in their browser, and rank opportunities for them.
- Deadline reminders on Telegram or email for saved opportunities.
- Smarter extraction: eligibility, country, funding and required documents from each post.
- Scheduled scraping so approved updates publish automatically after review.
- Better filters: by country, level and funding.
- A growing community: more sources beyond one channel, and student-submitted opportunities with a review queue.
🚀 Why Cultus Youth Matters
Students should spend their time applying, not hunting. By putting every opportunity, its deadline and its apply link in one place, in Arabic and English, Cultus Youth helps young people in Egypt and the region find what they can apply for and grow through what they win.
Built With
- ai
- backend
- css3
- html5
- javascript
- llm
- python
Log in or sign up for Devpost to join the conversation.