GardenBunga: Efficient Hybrid Sequence Modeling for Indonesian Speech Synthesis via Multilingual Knowledge Transfer
This repository contains the Gardenbunga frontend application built with React, TypeScript, Vite, Tailwind CSS, and shadcn/ui components.
| Name | NRP | Campus |
|---|---|---|
| Muhammad Dzaky Haidar | 5054251039 | Sepuluh Nopember Institute of Technology |
| Benedictus Ryu Gunawan | 5054251001 | Sepuluh Nopember Institute of Technology |
| Muhammad Irzam Hafis Fabiansyah | 5054251024 | Sepuluh Nopember Institute of Technology |
This repo available on, https://masterzaff.github.io/gardenbunga/
This app is a content-focused frontend that combines rich typography, motion, and mathematical rendering (KaTeX) inside a single-page React application.
- Runtime: React 18 + TypeScript
- Build tool: Vite 5
- Router: react-router-dom 6
- Styling: Tailwind CSS + CSS variables + shadcn/ui + Radix UI
- Testing: Vitest + Testing Library + jsdom
- Linting: ESLint 9 + typescript-eslint
- Utility libraries: class-variance-authority, clsx, tailwind-merge, zod
- Node.js 18.18+ (Node.js 20+ recommended)
- npm 9+ (or Bun if preferred)
Install dependencies:
npm installStart development server:
npm run devDefault dev URL:
Build for production:
npm run buildPreview production build locally:
npm run previewOptional Bun workflow:
bun install
bun run devnpm run dev: start local Vite servernpm run build: build production assets todist/npm run build:dev: development-mode buildnpm run preview: serve built assets locallynpm run lint: run ESLint checksnpm run test: run Vitest in CI modenpm run test:watch: run Vitest in watch mode
src/main.tsx: application bootstrap and global CSS importssrc/App.tsx: routing and route compositionsrc/pages/: route-level pages (Index,NotFound)src/components/: app-specific reusable componentssrc/components/ui/: shadcn/ui primitivessrc/hooks/: reusable hookssrc/lib/: shared utilities (for examplecninutils.ts)src/test/: test setup and examplespublic/: static assets copied as-is
- Use functional React components and hooks.
- Keep components focused: UI primitives in
src/components/ui/, page sections insrc/components/. - Use TypeScript interfaces/props types for all component APIs.
- Use import alias
@/for files undersrc/. - Use
cn(...)fromsrc/lib/utils.tsto merge class names. - Keep side effects in
useEffectwith proper cleanup. - When adding routes, update
src/App.tsxand keep the catch-all route last. - Prefer composition over very large components.
- Use Tailwind utility classes first, then shared CSS layers in
src/index.csswhen needed. - Keep all theme values in CSS custom properties (
:rootand.dark). - Reuse existing semantic tokens:
--primary,--accent,--border, and related foreground tokens. - Keep motion effects meaningful and lightweight to avoid jank on low-end devices.
- Preserve typography hierarchy already established by heading and body font definitions.
Run all checks locally before opening a PR:
npm run lint
npm run test
npm run buildPR checklist:
- Lint passes with no new warnings that impact behavior.
- Tests pass, and new logic has tests where practical.
- Production build completes.
- UI changes are validated on desktop and mobile breakpoints.
- No secrets or private keys committed.
This project uses a production base path in vite.config.ts:
- Production base URL:
/gardenbunga/
If deploying under a different subpath or domain root, update the base setting accordingly.
Target notebook: https://www.kaggle.com/code/xzaps0/infero-full
Use this flow to activate the inference server and connect it to this frontend.
- Open the notebook while logged in to Kaggle.
- If editing is blocked, click Copy & Edit.
- In notebook settings, enable Internet and choose the required accelerator (GPU/CPU) based on model size.
- Run all setup/import cells first so dependencies and model weights are loaded.
- Run the server start cell (look for commands using
uvicorn,FastAPI,flask, orgradio.launch). - Ensure the server binds to
0.0.0.0and uses a fixed port (commonly7860or8000).
Example server patterns:
uvicorn app:app --host 0.0.0.0 --port 8000demo.launch(server_name="0.0.0.0", server_port=7860, share=True)- If the notebook uses a tunnel (for example ngrok), configure the token in Kaggle Secrets and run the tunnel cell to get a public URL.
- Confirm server readiness by checking notebook logs and opening a health endpoint (for example
/healthor/docs) when available. - Point this frontend to the inference URL via environment variable (recommended pattern):
VITE_INFERENCE_API_BASE=https://your-public-inference-url- Restart local frontend after updating environment values.
- If the notebook URL returns 404, verify the notebook is public and the slug is correct.
- If requests fail after inactivity, Kaggle runtime may have stopped; restart runtime and rerun server cells.
- If you get connection refused, confirm the server process is still running and bound to
0.0.0.0.
- Never commit
.envfiles containing secrets. - Use Kaggle Secrets for tokens (for example tunnel/auth tokens).
- Keep API keys outside source control and inject at runtime.