2025-12-30 15:42:52 +01:00
# Using Modules Guide
How to use NixOS and Home Manager modules from m3ta-nixpkgs.
## Overview
Modules in m3ta-nixpkgs provide reusable configuration for NixOS (system-level) and Home Manager (user-level) settings. All modules use the `m3ta.*` namespace.
## Module Organization
### NixOS Modules
Located in `modules/nixos/` :
```
modules/nixos/
├── default.nix # Aggregates all NixOS modules
├── ports.nix # Port management
└── mem0.nix # Mem0 REST API server
```
### Home Manager Modules
Located in `modules/home-manager/` with categories:
```
modules/home-manager/
├── default.nix # Aggregates all HM modules
├── ports.nix # Port management
├── cli/ # CLI tools
│ ├── default.nix # Aggregates CLI modules
│ └── zellij-ps.nix
└── coding/ # Development tools
├── default.nix # Aggregates coding modules
2026-04-13 16:52:47 +02:00
├── editors.nix
├── opencode.nix # OpenCode non-agent config
└── agents/ # Per-tool agent deployment
├── default.nix
├── opencode.nix
├── claude-code.nix
└── pi.nix
2025-12-30 15:42:52 +01:00
```
## Importing Modules
### NixOS Modules
#### Import All Modules
``` nix
{ config , . . . }: {
imports = [
m3ta-nixpkgs . nixosModules . default
] ;
}
```
#### Import Specific Module
``` nix
{ config , . . . }: {
imports = [
m3ta-nixpkgs . nixosModules . mem0
] ;
}
```
#### Import from Local Path
``` nix
{ config , . . . }: {
imports = [
./modules/nixos/mem0.nix
] ;
}
```
### Home Manager Modules
#### Import All Modules
``` nix
{ config , . . . }: {
imports = [
m3ta-nixpkgs . homeManagerModules . default
] ;
}
```
#### Import Specific Module
``` nix
{ config , . . . }: {
imports = [
m3ta-nixpkgs . homeManagerModules . ports
] ;
}
```
#### Import Category
``` nix
{ config , . . . }: {
imports = [
# Import all CLI modules
m3ta-nixpkgs . homeManagerModules . cli . zellij-ps
] ;
}
```
## Available Modules
### NixOS Modules
#### `m3ta.ports`
Port management across hosts.
``` nix
m3ta . ports = {
enable = true ;
definitions = {
nginx = 80 ;
grafana = 3000 ;
} ;
hostOverrides . laptop = {
nginx = 8080 ;
} ;
currentHost = config . networking . hostName ;
} ;
```
**Documentation ** : [Port Management Guide ](./port-management.md )
#### `m3ta.mem0`
Mem0 REST API server for AI memory.
``` nix
m3ta . mem0 = {
enable = true ;
port = 8000 ;
llm = {
provider = " o p e n a i " ;
apiKeyFile = " / r u n / s e c r e t s / o p e n a i - a p i - k e y " ;
model = " g p t - 4 o - m i n i " ;
} ;
vectorStore = {
provider = " q d r a n t " ;
config = {
host = " l o c a l h o s t " ;
port = 6333 ;
} ;
} ;
} ;
```
**Documentation ** : [mem0 Module ](../modules/nixos/mem0.md )
### Home Manager Modules
#### `m3ta.ports`
Port management (similar to NixOS, with `generateEnvVars` ).
``` nix
m3ta . ports = {
enable = true ;
definitions = {
dev-server = 3000 ;
} ;
generateEnvVars = true ;
currentHost = config . networking . hostName ;
} ;
```
**Documentation ** : [Port Management Guide ](./port-management.md )
2026-01-10 19:12:45 +01:00
#### `cli.zellij-ps`
2025-12-30 15:42:52 +01:00
Zellij project switcher for quickly navigating between project folders.
``` nix
2026-01-10 19:12:45 +01:00
cli . zellij-ps = {
2025-12-30 15:42:52 +01:00
enable = true ;
package = pkgs . zellij-ps ;
} ;
```
**Documentation ** : [zellij-ps Module ](../modules/home-manager/cli/zellij-ps.md )
2026-01-10 19:12:45 +01:00
#### `coding.editors`
2025-12-30 15:42:52 +01:00
Editor configurations.
``` nix
m3ta . coding . editors = {
enable = true ;
neovim . enable = true ;
zed . enable = true ;
} ;
```
**Documentation ** : [Editors Module ](../modules/home-manager/coding/editors.md )
2026-04-13 16:52:47 +02:00
### `coding.opencode`
OpenCode AI coding assistant (non-agent config: theme, formatter, plugins).
``` nix
coding . opencode = {
enable = true ;
ohMyOpencodeSettings = {
agents . sisyphus . model = " a n t h r o p i c / c l a u d e - o p u s - 4 - 5 " ;
} ;
extraSettings = {
provider . anthropic . name = " A n t h r o p i c " ;
} ;
} ;
```
### `coding.agents.opencode`
OpenCode agent deployment from canonical TOML definitions.
``` nix
coding . agents . opencode = {
enable = true ;
agentsInput = inputs . agents ;
modelOverrides = {
chiron = " a n t h r o p i c / c l a u d e - s o n n e t - 4 " ;
} ;
externalSkills = [
{ src = inputs . skills-anthropic ; }
] ;
} ;
```
### `coding.agents.claude-code`
Claude Code agent deployment from canonical TOML definitions.
``` nix
coding . agents . claude-code = {
enable = true ;
agentsInput = inputs . agents ;
} ;
```
### `coding.agents.pi`
Pi agent deployment from canonical TOML definitions.
``` nix
coding . agents . pi = {
enable = true ;
agentsInput = inputs . agents ;
} ;
```
2025-12-30 15:42:52 +01:00
## Common Patterns
### Module Configuration
All modules follow this pattern:
``` nix
{ config , lib , pkgs , . . . }:
with lib ; let
cfg = config . m3ta . myModule ;
in {
options . m3ta . myModule = {
enable = mkEnableOption " d e s c r i p t i o n " ;
# ... other options
} ;
config = mkIf cfg . enable {
# ... configuration
} ;
}
```
### Conditional Configuration
Use `mkIf` to conditionally apply config:
``` nix
config = mkIf cfg . enable {
# Only applied when cfg.enable = true
services . my-service = {
enable = true ;
} ;
}
```
### Multiple Conditions
Use `mkMerge` for multiple conditions:
``` nix
config = mkMerge [
( mkIf cfg . feature1 . enable {
# Applied when feature1 is enabled
} )
( mkIf cfg . feature2 . enable {
# Applied when feature2 is enabled
} )
] ;
```
### Optional Dependencies
``` nix
options . m3ta . myModule = {
enable = mkEnableOption " m y m o d u l e " ;
package = mkOption {
type = types . package ;
default = pkgs . defaultPackage ;
} ;
} ;
config = mkIf cfg . enable {
services . my-service = {
package = cfg . package ;
} ;
} ;
```
## Configuration Examples
### Minimal NixOS Configuration
``` nix
{ pkgs , . . . }: {
imports = [
m3ta-nixpkgs . nixosModules . default
] ;
m3ta . ports = {
enable = true ;
definitions = {
my-service = 8080 ;
} ;
currentHost = " l a p t o p " ;
} ;
services . my-custom-service = {
enable = true ;
port = config . m3ta . ports . get " m y - s e r v i c e " ;
} ;
}
```
### Full NixOS Configuration
``` nix
{ config , pkgs , . . . }: {
imports = [
m3ta-nixpkgs . nixosModules . default
] ;
# Port management
m3ta . ports = {
enable = true ;
definitions = {
nginx = 80 ;
grafana = 3000 ;
prometheus = 9090 ;
mem0 = 8000 ;
} ;
hostOverrides . laptop = {
nginx = 8080 ;
mem0 = 8081 ;
} ;
currentHost = config . networking . hostName ;
} ;
# Mem0 service
m3ta . mem0 = {
enable = true ;
port = config . m3ta . ports . get " m e m 0 " ;
llm = {
provider = " o p e n a i " ;
apiKeyFile = " / r u n / s e c r e t s / o p e n a i - a p i - k e y " ;
} ;
vectorStore = {
provider = " q d r a n t " ;
config = {
host = " l o c a l h o s t " ;
port = 6333 ;
} ;
} ;
} ;
# Nginx
services . nginx = {
enable = true ;
httpConfig = ''
s e r v e r {
l i s t e n ${ toString ( config . m3ta . ports . get " n g i n x " ) } ;
r o o t / v a r / w w w ;
}
'' ;
} ;
# Grafana
services . grafana = {
enable = true ;
settings . server . http_port = config . m3ta . ports . get " g r a f a n a " ;
} ;
}
```
### Minimal Home Manager Configuration
``` nix
{ pkgs , . . . }: {
imports = [
m3ta-nixpkgs . homeManagerModules . default
] ;
m3ta . ports = {
enable = true ;
definitions = {
dev-server = 3000 ;
} ;
currentHost = " d e s k t o p " ;
} ;
home . sessionVariables = {
DEV_PORT = toString ( config . m3ta . ports . get " d e v - s e r v e r " ) ;
} ;
}
```
### Full Home Manager Configuration
``` nix
{ config , pkgs , . . . }: {
imports = [
m3ta-nixpkgs . homeManagerModules . default
] ;
# Port management
m3ta . ports = {
enable = true ;
definitions = {
dev-server = 3000 ;
nextjs = 3001 ;
vite = 5173 ;
} ;
hostOverrides . laptop = {
vite = 5174 ;
} ;
currentHost = config . networking . hostName ;
} ;
# CLI tools
2026-01-10 19:12:45 +01:00
cli . zellij-ps = {
2025-12-30 15:42:52 +01:00
enable = true ;
} ;
# Coding tools
2026-01-10 19:12:45 +01:00
coding . editors = {
2025-12-30 15:42:52 +01:00
enable = true ;
neovim . enable = true ;
} ;
# Packages
home . packages = with pkgs ; [
code2prompt
zellij-ps
] ;
# Environment variables
home . sessionVariables = {
EDITOR = " n v i m " ;
DEV_SERVER_PORT = toString ( config . m3ta . ports . get " d e v - s e r v e r " ) ;
} ;
}
```
## Module Options Reference
### Standard Options
All modules typically include:
| Option | Type | Description |
|---------|-------|-------------|
| `enable` | `boolean` | Enable the module |
| `package` | `package` | Custom package to use |
| `extraConfig` | `attrs` | Additional configuration |
### Port Management Options
| Option | Type | Description |
|---------|-------|-------------|
| `definitions` | `attrsOf int` | Default port definitions |
| `hostOverrides` | `attrsOf attrs` | Host-specific overrides |
| `currentHost` | `string` | Current hostname |
| `generateEnvVars` | `boolean` | Generate environment variables (HM only) |
## Combining with Other Flakes
### Using Multiple Module Sources
``` nix
{ config , . . . }: {
imports = [
# m3ta-nixpkgs modules
m3ta-nixpkgs . nixosModules . default
# Other flake modules
inputs . impermanence . nixosModules . impermanence
inputs . sops-nix . nixosModules . sops
] ;
# Configure all modules
m3ta . ports = {
enable = true ;
definitions = { nginx = 80 ; } ;
currentHost = config . networking . hostName ;
} ;
environment . persistence = {
" / p e r s i s t " = {
directories = [ " / v a r / l i b / m e m 0 " ] ;
} ;
} ;
}
```
### Using with Secrets
``` nix
{ config , . . . }: {
imports = [
m3ta-nixpkgs . nixosModules . default
inputs . sops-nix . nixosModules . sops
] ;
sops . secrets = {
openai-api-key = { } ;
} ;
m3ta . mem0 = {
enable = true ;
llm = {
apiKeyFile = config . sops . secrets . openai-api-key . path ;
} ;
} ;
}
```
## Troubleshooting
### Module Not Found
Error: `error: The option 'm3ta.mymodule' does not exist`
**Solutions ** :
1. Make sure you imported the module:
``` nix
imports = [
m3ta-nixpkgs . nixosModules . default
] ;
```
2. Check module name is correct
``` nix
# Correct
m3ta . mem0 . enable = true ;
# Wrong
m3ta . mymodule . enable = true ; # Doesn't exist
```
### Option Type Mismatch
Error: `type mismatch at 'm3ta.mymodule.enable', expected a boolean but got a list`
**Solution ** : Check option types in documentation
``` nix
# Correct
m3ta . mymodule . enable = true ;
# Wrong
m3ta . mymodule . enable = [ true ] ; # Should be boolean
```
### Port Not Defined
Error: `Service "foo" not defined`
**Solution ** : Add to port definitions
``` nix
m3ta . ports = {
definitions = {
foo = 8080 ; # Add this
} ;
} ;
```
## Best Practices
### Use Namespaces
Always use the `m3ta.*` namespace:
``` nix
# Good
m3ta . mem0 . enable = true ;
# Bad (potential conflicts)
mem0 . enable = true ;
```
### Document Your Configuration
Add comments explaining module usage:
``` nix
# Port management for multi-host setup
m3ta . ports = {
enable = true ;
definitions = {
nginx = 80 ;
grafana = 3000 ;
} ;
hostOverrides . laptop = {
nginx = 8080 ; # Use different port on laptop
} ;
currentHost = config . networking . hostName ;
} ;
# Mem0 AI memory service
m3ta . mem0 = {
enable = true ;
port = config . m3ta . ports . get " m e m 0 " ;
} ;
```
### Test Configuration
``` bash
# Test NixOS configuration without applying
sudo nixos-rebuild test --flake .#hostname
# Check configuration
nix flake check
# Show all options
nix eval .#nixosConfigurations.hostname.config.m3ta --apply builtins.attrNames
```
## Next Steps
- [Port Management ](./port-management.md ) - Detailed port management guide
- [Adding Packages ](./adding-packages.md ) - How to add new packages
2026-04-22 18:50:31 +02:00
- [Adding Modules ](./adding-modules.md ) - How to add new NixOS or Home Manager modules
- [Templates ](../templates.md ) - Boilerplate for new packages and modules
2025-12-30 15:42:52 +01:00
- [Architecture ](../ARCHITECTURE.md ) - Understanding module structure
- [Contributing ](../CONTRIBUTING.md ) - Code style and guidelines