dictionary.mikasjames.com
Introduction
Like many in the diaspora (big word), I want to connect more deeply with my heritage. Ilokano (or Ilocano) is spoken by roughly 8–10 million people across Northern Luzon and communities worldwide. It is the language of my grandmother, my grandfather, and many relatives who carry it in their hearts.
As I set out on my own journey to learn Ilokano so I could speak with my family, I encountered a common barrier: most digital resources for the language are either outdated print scans, clunky websites, or mobile apps heavily crowded with ads.
I wanted to build a simple utility to help me study. Something fast, modern, and capable of working offline when traveling.
The result is IloCo.. A fully client-side, offline-capable progressive web app featuring over 6,500 Ilokano-to-English entries and reverse English-to-Ilokano search.
Sourcing and Credits: Honoring the Data
It is important to clarify that I did not write or compile this linguistic data myself. I am a developer and a language learner, not a lexicographer.
The underlying dictionary dataset is sourced and structured from open linguistic databases and public domain materials, primarily built upon historical educational works such as Ernesto Constantino’s Ilokano Dictionary (published in 1971 by the University of Hawaii Press).
My goal with IloCo. was not to claim ownership of this data, but rather to take an existing, valuable academic resource and package it into a highly accessible, responsive, and modern digital format.
Features
IloCo. focus on the core utilities of a practical dictionary:
- Two-way search — Type an Ilokano word to see its English definition, or search English terms to find matching Ilokano entries.
- Relevance ranking — Results are prioritized by match quality (exact Ilokano matches first, then partial matches, followed by English definition matches).
- Rich entries — Where available in the source data, entries include part of speech, definitions, example sentences, conjugation patterns, variations, and cross-references.
- Interlinked navigation — Related terms, variations, and synonyms are rendered as clickable badges to make browsing intuitive.
- Dark mode — Adapts to system preferences with an optional manual toggle.
- Shareable URLs — Lookups are encoded directly in the URL (
?word=ABAGA), allowing specific definitions to be bookmarked or shared. - Fully responsive — Optimized to work comfortably on both mobile devices and desktops.

Tech Stack & Architecture
To keep the application entirely free to host and resilient against downtime, I chose a static, serverless architecture.
| Layer | Choice |
|---|---|
| Frontend | Svelte 5 with runes |
| Language | TypeScript |
| Styling | Tailwind CSS v4 + shadcn-svelte |
| Icons | Lucide Svelte |
| Data | 27 flat JSON files + precomputed search index |
| Deployment | GitHub Pages (fully static) |
| CI/CD | GitHub Actions |
| PWA | Custom service worker + Web App Manifest |
Because there is no backend database, the entire application consists of static files. The dictionary data is split into 27 JSON files in the source folder, one for each letter of the alphabet, accompanied by a pre-computed search index that maps words to their respective files.
This approach offers several practical benefits:
- Zero operational cost — Hosted entirely on GitHub Pages.
- Longevity — Without a database to maintain or an API server to pay for, the app will continue to run indefinitely.
- Offline access — The service worker caches assets and queried files locally, allowing the app to work even without an internet connection.
Implementation Details
Lazy-Loaded Definitions
To avoid loading a single, heavy 6,500-entry file into the browser memory on initial load, I implemented dynamic imports. When the app first loads, it only downloads a lightweight search index (~320KB). When a user selects a specific word, the app dynamically imports only the JSON file corresponding to that word's starting letter:
const module = await import(`../lib/${letter}.json`);
This keeps the initial bundle size minimal and ensures memory usage remains proportional to what is actually being viewed.
Relevance-Ranked Search
The search utility parses queries and scores results based on a straightforward 4-tier hierarchy:
- Exact Ilokano match
- Ilokano starts with the term
- Ilokano contains the term
- English definition contains the term
Input is debounced by 300ms to keep the interface smooth during typing, and results are capped at 20 to prevent layout clutter.
Offline-First PWA
By registering a custom service worker, the application implements a caching strategy that stores static assets (CSS, JS, fonts) locally. If a user has searched for a word before, the cached letter file is served instantly, allowing learners to look up words in transit or in areas with poor network reception.
Moving Forward
While IloCo. is fully functional for my current study needs, there are several additions I hope to introduce as I continue learning:
- User-Contributed Corrections — A straightforward, non-database mechanism (such as pre-filled GitHub Issue templates or simple forms) for native speakers to suggest definition edits or regional variations.
- Grammar Guides — Quick references for common Ilokano affixes to help learners understand verb conjugations.
Try It Out
If you are also trying to learn Ilokano to speak with your family, or if you are a native speaker looking for a simple reference tool, I hope this project is of some help. Suggestions and contributions to the codebase are always welcome. HMU 😉
