27d92a238ba9b9df117680c2080e082a2732bfc5
m3ta-nixpkgs
My personal Nix repository containing custom packages, overlays, NixOS modules, and Home Manager modules.
Features
- 🎁 Custom Packages: Collection of personal Nix packages
- 🔄 Overlays: Package modifications and enhancements
- ⚙️ NixOS Modules: System-level configuration modules
- 🏠 Home Manager Modules: User-level configuration modules
- 📚 Library Functions: Helper utilities for configuration management
- ❄️ Flakes Only: Modern Nix flakes support (no channels)
Repository Structure
m3ta-nixpkgs/
├── flake.nix # Main flake configuration
├── pkgs/ # Custom packages
│ ├── default.nix # Package registry
│ ├── code2prompt/
│ ├── hyprpaper-random/
│ ├── launch-webapp/
│ ├── msty-studio/
│ ├── pomodoro-timer/
│ ├── tuxedo-backlight/
│ └── zellij-ps/
├── overlays/ # Overlays
│ ├── default.nix
│ └── mods/ # Package modifications
│ ├── default.nix
│ └── n8n.nix
├── modules/
│ ├── nixos/ # NixOS modules
│ │ ├── default.nix
│ │ └── ports.nix # Port management module
│ └── home-manager/ # Home Manager modules
│ ├── default.nix
│ ├── ports.nix # Port management module
│ └── zellij-ps.nix
├── lib/ # Library functions
│ ├── default.nix # Library entry point
│ └── ports.nix # Port management utilities
├── examples/ # Usage examples
│ ├── home-manager-standalone.nix
│ └── nixos-configuration.nix
└── templates/ # Templates for new packages/modules
Usage
Adding to Your Flake
Add this repository to your flake inputs:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
m3ta-nixpkgs.url = "git+https://code.m3ta.dev/m3tam3re/nixpkgs";
};
}
Using Packages in NixOS Configuration
Method 1: Using the Overlay
{
nixpkgs.overlays = [
inputs.m3ta-nixpkgs.overlays.default
];
environment.systemPackages = with pkgs; [
code2prompt
hyprpaper-random
msty-studio
# ... any other custom packages
];
}
Method 2: Direct Package Reference
{
environment.systemPackages = [
inputs.m3ta-nixpkgs.packages.${system}.code2prompt
inputs.m3ta-nixpkgs.packages.${system}.hyprpaper-random
];
}
Using in Home Manager
With Overlay
{
nixpkgs.overlays = [
inputs.m3ta-nixpkgs.overlays.default
];
home.packages = with pkgs; [
zellij-ps
pomodoro-timer
];
}
With Home Manager Modules
{
imports = [
inputs.m3ta-nixpkgs.homeManagerModules.default
# Or specific modules:
# inputs.m3ta-nixpkgs.homeManagerModules.zellij-ps
];
# Module-specific configuration here
}
Using NixOS Modules
{
imports = [
inputs.m3ta-nixpkgs.nixosModules.default
# Or specific modules:
# inputs.m3ta-nixpkgs.nixosModules.ports
];
# Configure the ports module (if enabled)
m3ta.ports = {
enable = true;
definitions = {
nginx = 80;
ssh = 22;
};
};
}
Building Packages Directly
# Build a specific package
nix build git+https://code.m3ta.dev/m3tam3re/nixpkgs#code2prompt
# Run a package without installing
nix run git+https://code.m3ta.dev/m3tam3re/nixpkgs#zellij-ps
# Install to your profile
nix profile install git+https://code.m3ta.dev/m3tam3re/nixpkgs#msty-studio
# List all available packages
nix flake show git+https://code.m3ta.dev/m3tam3re/nixpkgs
Development
Setting Up Development Environment
# Clone the repository
git clone https://code.m3ta.dev/m3tam3re/nixpkgs
cd m3ta-nixpkgs
# Enter development shell
nix develop
# Check flake validity
nix flake check
# Format code
nix fmt
Adding a New Package
- Create a new directory under
pkgs/
:
mkdir pkgs/my-package
- Create
pkgs/my-package/default.nix
:
{
lib,
stdenv,
fetchFromGitHub,
}:
stdenv.mkDerivation rec {
pname = "my-package";
version = "1.0.0";
src = fetchFromGitHub {
owner = "owner";
repo = "repo";
rev = "v${version}";
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
};
meta = with lib; {
description = "Description of my package";
homepage = "https://github.com/owner/repo";
license = licenses.mit;
maintainers = with maintainers; [ ];
platforms = platforms.linux;
};
}
- Add to
pkgs/default.nix
:
{
# ... existing packages ...
my-package = pkgs.callPackage ./my-package {};
}
Adding a New NixOS Module
- Create
modules/nixos/my-module.nix
- Add import to
modules/nixos/default.nix
- Update
flake.nix
to expose it:
nixosModules = {
default = ./modules/nixos;
my-module = ./modules/nixos/my-module.nix;
};
Adding a New Home Manager Module
- Create
modules/home-manager/my-module.nix
- Add to
modules/home-manager/default.nix
- Update
flake.nix
to expose it:
homeManagerModules = {
default = import ./modules/home-manager;
my-module = import ./modules/home-manager/my-module.nix;
};
Port Management Module
NEW! Centrally manage service ports across your NixOS systems and Home Manager configurations with automatic host-specific overrides.
Features
- ✅ Centralized Configuration: Define all ports in one place
- ✅ Host-Specific Overrides: Different ports for different machines (laptop, server, desktop)
- ✅ Type Safety: Full NixOS/Home Manager type system integration
- ✅ Auto-Generated Files: JSON exports and environment variables
- ✅ Easy Integration: Works with any service configuration
- ✅ Conflict Prevention: Avoid port conflicts across different hosts
Quick Start - NixOS Module
{
imports = [ inputs.m3ta-nixpkgs.nixosModules.default ];
m3ta.ports = {
enable = true;
definitions = {
nginx = 80;
grafana = 3000;
ssh = 22;
prometheus = 9090;
};
hostOverrides = {
laptop = {
nginx = 8080; # Use non-privileged port
ssh = 2222;
};
};
# Automatically uses system hostname
currentHost = config.networking.hostName;
};
# Use ports in your configuration
services.nginx.defaultHTTPListenPort = config.m3ta.ports.get "nginx";
services.openssh.ports = [ (config.m3ta.ports.get "ssh") ];
# Firewall with dynamic ports
networking.firewall.allowedTCPPorts = [
(config.m3ta.ports.get "ssh")
(config.m3ta.ports.get "nginx")
];
}
Quick Start - Home Manager Module
{
imports = [ inputs.m3ta-nixpkgs.homeManagerModules.default ];
m3ta.ports = {
enable = true;
definitions = {
vite-dev = 5173;
jupyter = 8888;
local-api = 8000;
};
hostOverrides = {
laptop = {
vite-dev = 5174;
jupyter = 9999;
};
};
currentHost = "laptop";
# Auto-generate PORT_* environment variables
generateEnvVars = true;
};
# Use ports in your configuration
programs.bash.shellAliases = {
dev = "PORT=${toString (config.m3ta.ports.get "vite-dev")} npm run dev";
jupyter = "jupyter lab --port=${toString (config.m3ta.ports.get "jupyter")}";
};
home.sessionVariables = {
DEV_SERVER = "http://localhost:${toString (config.m3ta.ports.get "vite-dev")}";
};
}
Available Module Functions
config.m3ta.ports.get "service"
- Get port for service on current hostconfig.m3ta.ports.getForHost "host" "service"
- Get port for specific hostconfig.m3ta.ports.all
- All ports for current host (merged defaults + overrides)config.m3ta.ports.allForHost "host"
- All ports for specific hostconfig.m3ta.ports.services
- List all defined service names
Auto-Generated Files
NixOS: /etc/m3ta/ports.json
Home Manager: ~/.config/m3ta/ports.json
These files contain all port configuration for easy inspection and external tool integration.
Using the Library Directly
For advanced use cases, you can use the underlying library functions without the module:
{
outputs = { nixpkgs, m3ta-nixpkgs, ... }: {
nixosConfigurations.laptop = nixpkgs.lib.nixosSystem {
modules = [
({ inputs, system, config, ... }: let
m3taLib = inputs.m3ta-nixpkgs.lib.${system};
myPorts = {
ports = { nginx = 80; grafana = 3000; };
hostPorts = { laptop = { nginx = 8080; }; };
};
portHelpers = m3taLib.ports.mkPortHelpers myPorts;
hostname = config.networking.hostName;
in {
services.nginx.port = portHelpers.getPort "nginx" hostname;
})
];
};
};
}
Documentation
See library documentation:
lib/ports.nix
- Library source code with inline documentation
Example configurations:
examples/nixos-configuration.nix
- NixOS configuration exampleexamples/home-manager-standalone.nix
- Home Manager configuration example
Available Packages
Package | Description |
---|---|
code2prompt |
Convert code to prompts |
hyprpaper-random |
Random wallpaper setter for Hyprpaper |
launch-webapp |
Launch web applications |
msty-studio |
Msty Studio application |
pomodoro-timer |
Pomodoro timer utility |
tuxedo-backlight |
Backlight control for Tuxedo laptops |
zellij-ps |
Process viewer for Zellij |
License
Individual packages may have their own licenses. Check each package's meta.license
attribute.
Maintainer
Description
Languages
Nix
100%