Kamus, Tesaurus, dan Glosarium Bahasa Indonesia — versi modern.
Monorepo dengan 2 aplikasi utama:
- backend/ — API Server (Express.js + PostgreSQL)
- frontend/ — Situs publik + panel redaksi terintegrasi (
/redaksi/*)
- Node.js 18+
- Express.js
- PostgreSQL (Native driver)
- JWT Authentication
- Winston logging
- React 19
- Vite 6
- TailwindCSS
- React Router 7
- React Query 5
- Vitest (Frontend)
- Jest (Backend)
- Node.js 18+
- PostgreSQL 14+
- Redis (optional, untuk caching)
# Install dependencies untuk semua workspace
npm install
# Install dependencies per workspace
npm install --prefix backend
npm install --prefix frontend# Jalankan semua services sekaligus
npm run dev
# Atau jalankan terpisah
npm run dev:backend # Backend di http://localhost:3000
npm run dev:public # Public di http://localhost:5173# Cara paling sederhana (seperti target di Render single-service)
npm install
npm start
# Build frontend SSR lalu jalankan backend dalam mode production
npm run sim:production
# Atau pisahkan langkah build dan start
npm run sim:production:build
npm run sim:production:startnpm start akan mengecek artefak SSR frontend (frontend/dist). Jika belum ada, build SSR dijalankan otomatis sebelum server backend mode production dinyalakan.
# Frontend static build
npm run build:public
# Backend tidak memerlukan langkah build terpisah
# (langsung dijalankan dengan Node.js)SEO publik digenerate otomatis oleh backend (bukan file statis di frontend/public):
GET /robots.txtGET /sitemap.xml
Generator sitemap mengambil path statis + path dinamis kategori kamus/glosarium. Path statis mencakup halaman utama termasuk gim/susun-kata/harian, gim/susun-kata/bebas, dan sumber.
- Pencarian kamus (prefix-first + fallback contains)
- Frasa pencarian populer di beranda (kamus, tesaurus, glosarium, makna, rima)
- Detail entri: makna, contoh, subentri, tesaurus, glosarium
- Login Google + RBAC untuk redaksi
- Panel redaksi terintegrasi di frontend (
/redaksi/*) - Gim Susun Kata dengan 2 mode:
harian(kata harian 5 huruf, klasemen harian pemenang)bebas(kata acak 4-6 huruf, klasemen harian berbasis rata-rata pemenang)
- Sidebar komentar pada halaman detail kamus per
indeks:- pengguna login dapat melihat komentar terbaca dan mengirim komentar
- pengguna belum login melihat teaser jumlah komentar aktif
- moderasi komentar dilakukan dari halaman redaksi
Komentar
- URL publik mode terpisah:
/gim/susun-kata/hariandan/gim/susun-kata/bebas. - URL lama
/gim/susun-katadiarahkan ke mode harian. - Mode harian menggunakan kata yang sama untuk semua pemain pada tanggal yang sama (zona Asia/Jakarta).
- Mode bebas memilih kata dasar acak 4-6 huruf per sesi.
- Klasemen harian menampilkan pemenang (
menang=true) untuk hari berjalan. - Klasemen bebas juga per hari, menampilkan pemenang dengan format:
rata_poin; rata_detik; total_main. - Tabel yang dipakai:
susun_kata,susun_kata_skor,susun_kata_bebas.
- Kamus: pencarian entri, jelajah kategori (abjad, kelas kata, bentuk/unsur terikat, ekspresi, ragam, bahasa, bidang), hasil berpaginasi, tautan ke detail entri.
- Tesaurus: pencarian sinonim/antonim, tampilan relasi kata, contoh kata saat belum melakukan pencarian.
- Glosarium: pencarian istilah teknis, jelajah berdasarkan bidang dan sumber, detail istilah, tautan silang ke entri kamus.
- Makna: kamus terbalik (mencari kata berdasarkan isi makna).
- Rima: pencarian rima akhir dan rima awal (aliterasi), masing-masing dengan navigasi cursor.
- Gim: Susun Kata mode harian dan bebas.
- Redaksi: tampil hanya untuk akun dengan akses redaksi.
- Masuk/Keluar: autentikasi Google OAuth untuk pengguna.
- Beranda (
/): hero + kotak pencarian utama. - Pencarian Populer (
/api/publik/pencarian/populer?tanggal=YYYY-MM-DD): 1 frasa teratas per domain berdasarkan tanggal browser pengguna; jika tanggal belum ada, otomatis mundur ke tanggal sebelumnya yang tersedia. - Kebijakan Privasi (
/kebijakan-privasi). - Footer: tombol versi
Kateglo <versi>(modal Riwayat dan Tugas) + toggle tema terang/gelap.
- Dasbor: ringkasan statistik (entri, tesaurus, glosarium, komentar, label, pengguna) dan navigasi cepat.
- Kamus: daftar/cari/filter entri; tambah/sunting/hapus entri; kelola makna dan contoh.
- Tesaurus: daftar/cari/filter status; tambah/sunting/hapus entri tesaurus.
- Glosarium: daftar/cari/filter (bidang, sumber, status); tambah/sunting/hapus istilah.
- Bidang: kelola master bidang glosarium.
- Sumber: kelola master sumber glosarium.
- Komentar: moderasi komentar kamus (isi dan status aktif).
- Label: kelola label (kategori, kode, nama, urutan, status).
- Peran: kelola peran dan pemetaan izin per peran.
- Izin: kelola izin dan pemetaan peran yang memiliki izin.
- Pengguna: kelola pengguna (profil dasar, peran, status aktif).
Project ini siap di-deploy sebagai 1 Web Service (SSR + API) dari root repo.
- Gunakan blueprint render.yaml
- Build:
npm ci --include=dev && npm run sim:production:build - Start:
npm run sim:production:start - Health check:
/health
Jika sebelumnya masih memakai pola 2 service (kateglo-api + static frontend), migrasikan domain utama ke service tunggal ini.
# Validasi lint + test per workspace
Set-Location backend; npm run lint; npm run test
Set-Location frontend; npm run lint; npm run testkateglo2/
├── backend/ # Express.js API (Port 3000)
│ ├── routes/
│ │ ├── publik/ # Public routes
│ │ └── redaksi/ # Admin routes (protected)
│ ├── models/ # Database models (fat model)
│ ├── services/ # Business logic
│ ├── middleware/ # Auth, validation, limiter
│ └── db/ # PostgreSQL connection
│
├── frontend/ # Public website + redaksi (Port 5173)
│ ├── src/
│ │ ├── halaman/ # Halaman publik + redaksi
│ │ ├── komponen/ # Reusable components
│ │ ├── api/ # API client
│ │ └── utils/ # Utilities frontend
│ └── public/
│
├── _docs/ # Documentation + SQL migrations + struktur data
└── _kode/ # Reference code (not committed)
NODE_ENV=development
PORT=3000
DATABASE_URL=postgresql://user:password@localhost:5432/kateglo
JWT_SECRET=your-secret-key
CORS_ORIGIN=http://localhost:5173
POPULAR_SEARCH_CACHE_TTL_SECONDS=300
VITE_API_URL=http://localhost:3000
GPL-3.0 - Kode sumber aplikasi
- Ivan Lanin - Creator & Lead Developer
- Romi Hardiyanto
- Arthur Purnama
- Pusat Bahasa Kemdikbud
- Komunitas Bahtera
- Website: https://kateglo.org
- GitHub: https://github.com/ivanlanin/kateglo2