Project Structure
Project Structure
Alkademi LMS Open Source uses a Nuxt Layers based modular monolith structure. The application is still one codebase and one build, but features are separated into cores/ and plugins/.
lms-opensource/
|-- app/ # Global components, layouts, composables, and Nuxt plugins
| |-- components/ # AppHeader, AppSidebar, and other global components
| |-- composables/ # App composables, including the sidebar generator
| |-- layouts/ # Default and landing layouts
| `-- plugins/ # App-level Nuxt plugins, including the plugin registry
|-- cores/ # Built-in LMS features
| |-- kelas/
| | |-- components/
| | |-- pages/
| | |-- server/api/
| | |-- stores/
| | |-- types/
| | |-- core.config.ts
| | `-- nuxt.config.ts
| |-- assignment/
| |-- form/
| |-- program/
| |-- pustaka/
| |-- studio/
| `-- uikit/
|-- plugins/ # Custom plugins or extensions
| `-- custom-class/
| |-- components/
| |-- pages/
| |-- server/api/
| |-- plugin.config.ts
| |-- sidebar.ts
| `-- nuxt.config.ts
|-- shared/ # Shared types and utilities
| |-- types/
| `-- utils/layers.ts
|-- web/ # Landing/public site layer
|-- public/ # Static assets
|-- nuxt.config.ts # Main layer composition
`-- package.json
Core Folders
Each core feature is an independent Nuxt Layer. An active core should have:
nuxt.config.ts: allows the folder to be included in theextendsarray.core.config.ts: definesenabledand theroutesused by the sidebar.pages/: feature pages. For examplecores/kelas/pages/dashboard/kelas/index.vue.components/,stores/,server/api/, andtypes/: used as needed by the feature.
Example core.config.ts:
import type { FeatureConfig } from '../../shared/types/feature'
export default {
enabled: true,
routes: [
{
key: 'kelas',
path: '/dashboard/kelas',
icon: 'i-heroicons-academic-cap',
label: 'Kelas'
}
]
} satisfies FeatureConfig
Plugin Folders
Plugins are also Nuxt Layers, but they use plugin.config.ts. When enabled: true, a plugin will:
- be included in the Nuxt Layer composition;
- be registered in the runtime plugin registry;
- add sidebar routes from the
routesfield; - replace selected cores through the
replacesfield; - optionally enrich the sidebar through
sidebar.ts.
Minimal plugin structure:
plugins/my-plugin/
|-- pages/
| `-- dashboard/my-plugin/index.vue
|-- plugin.config.ts
`-- nuxt.config.ts
Shared Types and Discovery
The contracts for cores, plugins, and sidebars live in shared/types/. Layer auto-discovery lives in shared/utils/layers.ts; it reads core.config.ts and plugin.config.ts to decide which layers are active.
Next, let's dive deeper into the Layer Architecture.
Installation
Follow the steps below to install Alkademi LMS Open Source in your local environment.
Architecture: Nuxt Layers
Alkademi LMS Open Source is built as a modular monolith. Every feature still runs inside one Nuxt application, but each domain feature is isolated as a Nuxt Layer so it can be maintained, replaced, or extended more easily.
