Open source for the Odia language — a growing constellation of tools, libraries,
and resources making Odia a first-class citizen in modern AI and software.
OpenOdia is the hub for Odia language open-source. Built and maintained by Soumendra Kumar Sahoo, it spans three pillars:
- @openodia on YouTube — tutorials, talks, and demos in Odia & English
- OpenOdia · PyPI — a Python package of practical tools for Odia language processing
- Awesome-Odia-AI — a curated, live directory of 60+ Odia datasets, models, and tools
This repository is the web frontend that brings everything together.
Everything open source in the Odia language. No AI gatekeeping. If it's Odia, open source, and useful — it belongs.
| Category | Examples |
|---|---|
| 🎯 Language tools | Transliterators, spell checkers, grammar tools, Unicode converters, OCR |
| 🖋 Fonts & typography | Open-source Odia fonts, IMEs, keyboard layouts |
| 📚 Datasets | Parallel corpora, monolingual texts, speech data, dictionaries |
| 🧠 Models (open weight) | STT, TTS, embedding, LLM fine-tunes for Odia |
| 🐍 Libraries | Python/JS/Rust packages for Odia text processing, dates, numerals |
| 🎮 Applications | Games, apps, utilities built for or in Odia |
| 📖 Educational | Language learning tools, interactive tutorials, grammar references |
| 🔧 Infrastructure | Odia localization tools, CI/CD for Odia projects, evaluation benchmarks |
| Layer | Technology |
|---|---|
| Framework | TanStack Start |
| Routing | TanStack Router |
| Data | TanStack Query |
| UI | React 19, Tailwind CSS 4, Radix UI, Framer Motion |
| Icons | Lucide React |
| Deployment | Cloudflare Workers |
| Package mgr | Bun |
- Bun
- Node.js 22+
git clone https://github.com/soumendrak/openodia-hub.git
cd openodia-hub
bun install
bun run devThe dev server starts at http://localhost:9090.
| Command | Purpose |
|---|---|
bun run dev |
Start Vite dev server |
bun run build |
Production build |
bun run build:dev |
Development-mode build |
bun run preview |
Preview production build |
bun run lint |
Run ESLint |
bun run format |
Format with Prettier |
bun run test |
Run Vitest tests |
These three pages share the same architecture — fetch data from an API, render filterable/searchable card grids with "Load more" pagination.
flowchart TD
A[Page Load] --> B[TanStack Query fetches /api/*]
B --> C{Loading?}
C -->|Yes| D[Show skeleton cards]
C -->|No| E[Render Hero + Search + Chips]
E --> F[User types in search]
E --> G[User clicks filter chip]
F --> H[filtered = useMemo over all items]
G --> H
H --> I[Render card grid with framer-motion animations]
I --> J{More items?}
J -->|Yes| K[Show Load More button]
J -->|No| L[Done]
K --> M[Bump shownCount by 30]
M --> I
style A stroke:#00d4ff
style B stroke:#00d4ff
style E stroke:#ff2d95
style I stroke:#f59e0b
| Page | Data source | Filter axes |
|---|---|---|
/tools |
/api/awesome + /api/repos |
Type (All/Tools/Repos) + Category |
/models |
/api/models (Hugging Face filter=or) |
Task type chips |
/datasets |
/api/datasets (Hugging Face language:or) |
Task type chips |
Both pages aggregate content from multiple sources with search and filtering, but differ in layout. Events adds a sticky timeline sidebar with scrollspy for year/month navigation.
flowchart TD
A[Page Load] --> B{Tutorials or Events?}
B -->|Tutorials| C[useQuery: /api/videos]
B -->|Events| D[Static events + useInfiniteQuery: /api/events]
C --> E[Group by channel → VideoCards + Playlists]
D --> F[Merge static + live events, compute status by IST]
F --> G[Render Upcoming section + Timeline sidebar]
G --> H[Render Past Events grouped by Year → Month]
H --> I[ScrollSpy on sidebar updates active section]
I --> J{Load More?}
J -->|Yes| K[fetchNextPage, append to list]
K --> H
style A stroke:#00d4ff
style C stroke:#ff2d95
style D stroke:#ff2d95
style G stroke:#f59e0b
Static layout page with scroll-triggered Reveal animations: pillars + get involved sections, ContributorGrid + ContributorLeaderboard.
In-browser Python execution via Pyodide WebAssembly. Loads openodia + dependencies, runs user code client-side.
flowchart TD
A[Page Load] --> B[Inject Pyodide script from CDN]
B --> C[Init Python runtime ~10MB WASM]
C --> D[loadPackage: numpy, pygments, micropip]
D --> E[micropip.install: openodia, rich, faker, deep-translator]
E --> F[Status: ready]
F --> G[User writes code or picks sample]
G --> H[Click Run]
H --> I[pyodide.runPythonAsync code]
I --> J[batched stdout → output panel]
G --> K[Click Format]
K --> L[black.format_str → update editor]
style A stroke:#00d4ff
style C stroke:#ff2d95
style I stroke:#f59e0b
| Source | What | Cache |
|---|---|---|
| Hugging Face API | Odia models & datasets | 1 hour |
| GitHub REST API | Repos from 5 Odia orgs | 30 min |
| GitHub Raw | Awesome-Odia-AI README | 1 hour |
| PyPI JSON API | openodia package info | 1 hour |
| YouTube RSS | Video feeds from 4 channels | 1 hour |
| GDG Bevy (SSR scrape) | Community events | D1-backed, daily sync |
| Cloudflare KV | Contributor data | Synced daily via GitHub Action |
bun run build
npx wrangler deployCI/CD via GitHub Actions: lint → test → build → deploy on push to main.
See CONTRIBUTING.md for setup, conventions, and where to help.
Quick checklist before opening a PR:
bun run lint
bun run build
bun run testMIT © Soumendra Kumar Sahoo