Alkademi Logo
Getting Started

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/.

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 the extends array.
  • core.config.ts: defines enabled and the routes used by the sidebar.
  • pages/: feature pages. For example cores/kelas/pages/dashboard/kelas/index.vue.
  • components/, stores/, server/api/, and types/: 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 routes field;
  • replace selected cores through the replaces field;
  • 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.

Copyright © 2026