Compare commits

..

47 commits

Author SHA1 Message Date
sid
1ab817090f Merge pull request 'librechat: add configFile option' (#50) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #50
2026-05-19 22:29:49 +02:00
sid
86afbb213c librechat: add configFile option
All checks were successful
Build tests / build-hosts (pull_request) Successful in 24s
Flake check / flake-check (pull_request) Successful in 24s
2026-05-19 22:23:23 +02:00
sid
b6546f3ab0 Merge pull request 'librechat: listen on 0.0.0.0' (#49) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #49
2026-05-19 21:25:47 +02:00
sid
0fc3d4da92 librechat: listen on 0.0.0.0
All checks were successful
Build tests / build-hosts (pull_request) Successful in 23s
Flake check / flake-check (pull_request) Successful in 24s
2026-05-19 21:25:29 +02:00
sid
a7daa3b9f3 Merge pull request 'librechat: add meilisearch' (#48) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #48
2026-05-19 20:54:21 +02:00
sid
dd7fea5711 librechat: new images api
All checks were successful
Build tests / build-hosts (pull_request) Successful in 24s
Flake check / flake-check (pull_request) Successful in 24s
2026-05-19 20:41:37 +02:00
sid
7613e6cb6b librechat: add meilisearch
All checks were successful
Build tests / build-hosts (pull_request) Successful in 24s
Flake check / flake-check (pull_request) Successful in 24s
2026-05-19 20:01:53 +02:00
sid
fe6b0d6c47 Merge pull request 'librechat: fix image ref' (#47) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #47
2026-05-19 19:32:26 +02:00
sid
fc83c6652d librechat: fix image ref
All checks were successful
Build tests / build-hosts (pull_request) Successful in 24s
Flake check / flake-check (pull_request) Successful in 25s
2026-05-19 19:31:30 +02:00
sid
da86a8eb57 Merge pull request 'add nerdlog package' (#46) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #46
2026-05-19 13:26:00 +02:00
sid
e8f2000053 add nerdlog package
All checks were successful
Build tests / build-hosts (pull_request) Successful in 25s
Flake check / flake-check (pull_request) Successful in 25s
2026-05-19 13:13:02 +02:00
sid
7d73c46b94 Merge pull request 'mcpo: fix port in ExecStart' (#45) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #45
2026-05-18 18:45:23 +02:00
sid
179a02731b mcpo: fix port in ExecStart
All checks were successful
Build tests / build-hosts (pull_request) Successful in 23s
Flake check / flake-check (pull_request) Successful in 23s
2026-05-18 18:44:30 +02:00
sid
8967439585 Merge pull request 'librechat-oci' (#44) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #44
2026-05-18 18:41:52 +02:00
sid
2323c97d89 mcpo: add port option
All checks were successful
Build tests / build-hosts (pull_request) Successful in 23s
Flake check / flake-check (pull_request) Successful in 23s
2026-05-18 18:41:07 +02:00
sid
529ca4d572 Merge pull request 'librechat-oci: nixos module and test' (#41) from feature/librechat-oci into develop
All checks were successful
Build tests / build-hosts (pull_request) Successful in 23s
Flake check / flake-check (pull_request) Successful in 23s
Reviewed-on: #41
2026-05-18 17:16:49 +02:00
sid
5e963c26ec Merge pull request 'bitwarden' (#43) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 19s
Reviewed-on: #43
2026-05-18 16:39:54 +02:00
sid
fff1263c85 add bitwarden app to hyprland
All checks were successful
Build tests / build-hosts (pull_request) Successful in 2m0s
Flake check / flake-check (pull_request) Successful in 2m47s
2026-05-18 16:33:15 +02:00
sid
49c93c82e0 fix pass2bw 2026-05-18 16:08:01 +02:00
sid
fd68579042 pass2bw: fix PATH 2026-05-18 13:36:52 +02:00
sid
b3fda57098 Merge pull request 'rebuild no longer produces result symlinks' (#42) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #42
2026-05-13 13:45:36 +02:00
sid
dad762369c rebuild no longer produces result symlinks
All checks were successful
Flake check / flake-check (pull_request) Successful in 1m37s
Build tests / build-hosts (pull_request) Successful in 2m5s
2026-05-13 13:44:09 +02:00
sid
d953dd7f8a Merge pull request 'develop' (#40) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 17s
Reviewed-on: #40
2026-05-10 23:39:18 +02:00
sid
93cadc467a Merge pull request 'rebuild: rm dix and nom. add env var support' (#39) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #39
2026-05-10 16:37:00 +02:00
sid
b9736a5f50 Merge pull request 'fix CVE-2026-43500' (#38) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #38
2026-05-09 09:02:10 +02:00
sid
a43fa6440b Merge pull request 'stm32: fix template dir' (#37) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 20s
Reviewed-on: #37
2026-05-07 22:37:41 +02:00
sid
d31510c64c Merge pull request 'add stm32 dev template' (#36) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #36
2026-05-07 18:59:06 +02:00
sid
f7a032864c Merge pull request 'add package for openmv-ide' (#35) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #35
2026-05-07 11:10:08 +02:00
sid
8ad8b1f633 Merge pull request 'remove mkVirtualHost from rss-bridge' (#34) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #34
2026-05-05 23:25:48 +02:00
sid
15cbf5d4ff Merge pull request 'nixvim: add diffview, gitsigns, which-key. re-enable treesitter. document some keymaps' (#33) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #33
2026-05-05 21:18:20 +02:00
sid
4683cb1136 Merge pull request 'update flake. update some package versions' (#32) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 27s
Reviewed-on: #32
2026-05-04 17:43:44 +02:00
sid
5f6ad9ecf5 Merge pull request 'fix CVE-2026-31431' (#31) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #31
2026-05-02 23:11:14 +02:00
sid
e76a05b512 Merge pull request 'add jirafeau-cli' (#30) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #30
2026-05-02 22:15:23 +02:00
sid
a0a39253f4 Merge pull request 'nixvim: fix spellfiles' (#29) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 42s
Reviewed-on: #29
2026-05-02 21:31:03 +02:00
sid
a42c91f99e Merge pull request 'develop' (#28) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #28
2026-05-02 20:42:50 +02:00
sid
5aebc805a6 Merge pull request 'remove tailcsale docs' (#27) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #27
2026-05-02 19:15:25 +02:00
sid
e801c318a7 Merge pull request 'tailscale: add support for multiple tailnets' (#26) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 11s
Reviewed-on: #26
2026-05-02 19:01:43 +02:00
sid
c114c6da0a Merge pull request 'develop' (#20) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 11s
Reviewed-on: #20
2026-04-23 22:17:57 +02:00
sid
0c13e9dabd Merge pull request 'update flake. update pkgs. new hp api' (#18) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 30s
Reviewed-on: #18
2026-04-15 22:28:56 +02:00
sid
cff8f40bb0 Merge pull request 'stylix: use image to generate color scheme with scheme = 'generate-from-image'' (#17) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 20s
Reviewed-on: #17
2026-04-03 17:36:34 +02:00
sid
7a3ecf1545 Merge pull request 'develop' (#16) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #16
2026-04-03 16:46:17 +02:00
sid
7e5a951877 Merge pull request 'develop' (#15) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 6s
Reviewed-on: #15
2026-03-30 22:12:04 +02:00
sid
d093bc3dc6 Merge pull request 'develop' (#5) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 19s
Reviewed-on: #5
2026-03-07 14:10:10 +01:00
sid
aa1d2bbe48 Merge pull request 'develop' (#4) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 19s
Reviewed-on: #4
2026-03-07 07:57:51 +01:00
sid
31f195ff89 Merge pull request 'open-webui-oci: replace version with image option' (#3) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #3
2026-03-01 16:14:41 +01:00
sid
aea241d610 Merge pull request 'open-webui: removed network service. add version option' (#2) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 5s
Reviewed-on: #2
2026-02-27 22:12:38 +01:00
sid
a5e0b2b117 Merge pull request 'flake update' (#1) from develop into release-25.11
All checks were successful
Deploy docs / build-and-deploy (push) Successful in 27s
Reviewed-on: #1
2026-02-26 23:15:56 +01:00
10 changed files with 517 additions and 86 deletions

View file

@ -60,7 +60,7 @@ Rebuild_nixos() {
[[ -n "$TARGET_HOST" || -n "$BUILD_HOST" ]] && CMD+=("--ask-sudo-password")
# Build config first so we can diff it
local BUILD_CMD=("nixos-rebuild" "build" "--flake" "$FLAKE")
local BUILD_CMD=("nixos-rebuild" "build" "--no-build-output" "--flake" "$FLAKE")
[ "$SHOW_TRACE" = 1 ] && BUILD_CMD+=("--show-trace")
[ -n "$BUILD_HOST" ] && BUILD_CMD+=("--build-host" "$BUILD_HOST")
@ -101,7 +101,7 @@ Rebuild_home() {
# Build config first so we can diff it
if [ "$ROLLBACK" = 0 ]; then
local BUILD_CMD=("home-manager" "build" "--flake" "$FLAKE")
local BUILD_CMD=("home-manager" "build" "--no-out-link" "--flake" "$FLAKE")
[ "$SHOW_TRACE" = 1 ] && BUILD_CMD+=("--show-trace")
_status "Building Home Manager configuration '$FLAKE'..."
_status "Executing command: ${BUILD_CMD[*]}"

View file

@ -0,0 +1,46 @@
{
inputs,
config,
lib,
pkgs,
...
}:
let
cfg = config.wayland.windowManager.hyprland;
app = cfg.applications.password-manager.default;
inherit (lib) mkDefault mkIf;
in
{
imports = [ ../../../rofi-rbw ];
config = mkIf (cfg.enable && app == "rofi-rbw") {
programs.rbw = {
enable = true;
settings = {
# email = "you@example.tld"; # You have to set this in your config
pinentry = mkDefault pkgs.pinentry-gnome3;
lock_timeout = mkDefault 3600;
};
};
programs.rofi-rbw = {
enable = true;
package = mkDefault pkgs.rofi-rbw-wayland;
settings = {
selector = mkDefault "bemenu";
selector-args = mkDefault "-i -l 20";
action = mkDefault "copy";
typing-key-delay = mkDefault 0;
};
};
programs.librewolf = mkIf config.programs.librewolf.enable {
profiles.default.extensions.packages =
with inputs.nur.legacyPackages."${pkgs.stdenv.hostPlatform.system}".repos.rycee.firefox-addons; [
bitwarden
];
};
};
}

View file

@ -56,6 +56,7 @@ let
in
{
imports = [
./bitwarden
./bemenu
./dmenu-bluetooth
./dunst-toggle

View file

@ -8,67 +8,230 @@
let
cfg = config.services.librechat-oci;
image = pkgs.dockerTools.pullImage {
imageName = "ghcr.io/danny-avila/librechat";
imageDigest = "sha256:a46254938507971e0d4f7ed3f9d116bd9b118f4810b5b75eb716baf575645068";
hash = "sha256-zevUN6vrs3hymwCGFmk/YXlUzYjN37H+EO5aLxYchyc=";
finalImageName = "ghcr.io/danny-avila/librechat";
finalImageTag = "v0.8.5";
defaultImages = {
librechat = pkgs.dockerTools.pullImage {
imageName = "ghcr.io/danny-avila/librechat";
imageDigest = "sha256:a46254938507971e0d4f7ed3f9d116bd9b118f4810b5b75eb716baf575645068";
hash = "sha256-zevUN6vrs3hymwCGFmk/YXlUzYjN37H+EO5aLxYchyc=";
finalImageName = "ghcr.io/danny-avila/librechat";
finalImageTag = "v0.8.5";
};
meilisearch = pkgs.dockerTools.pullImage {
imageName = "getmeili/meilisearch";
imageDigest = "sha256:b839a48d008d4e67e57f78dcff5b21d5e8b8fa066bacd11f97824d6307abb0dd";
hash = "sha256-+hypvjFDSdnnWAO4tARTnjNd/6HlF6pMg1L6UUffdYM=";
finalImageName = "getmeili/meilisearch";
finalImageTag = "v1.44.0";
};
mongodb = pkgs.dockerTools.pullImage {
imageName = "mongo";
imageDigest = "sha256:098862b1339f031900ca66cf8fef799e616d6324fa41b9a263f2ec899552c1ef";
hash = "sha256-XuWnvcqAAkAGshdQtnngKOOJP2Bd33FXTbGHTRX3nUc=";
finalImageName = "mongo";
finalImageTag = "8.0.20";
};
vectordb = pkgs.dockerTools.pullImage {
imageName = "pgvector/pgvector";
imageDigest = "sha256:8809cfffff0082cf260c9ac752f1dd1afc77f6f0a55c4e6411321e78efc3d9a5";
hash = "sha256-rc6gQLMzv8UOZVLmWKGUESNIo+iPf5DR7T79AmbzWc4=";
finalImageName = "pgvector/pgvector";
finalImageTag = "0.8.0-pg15-trixie";
};
ragApi = pkgs.dockerTools.pullImage {
imageName = "registry.librechat.ai/danny-avila/librechat-rag-api-dev-lite";
imageDigest = "sha256:6dfb6832661ff9c26fa329c823ce266059e33567670a763e9ecb9b566b8daa68";
hash = "sha256-k8pkEgbqT4NU2+2ZjdRFlfFvMUk/1p+pkysbELh95pM=";
finalImageName = "registry.librechat.ai/danny-avila/librechat-rag-api-dev-lite";
finalImageTag = "latest";
};
};
defaultEnv = {
# Server
HOST = "0.0.0.0";
PORT = "3080";
PORT = toString cfg.port;
NO_INDEX = "true";
DEBUG_LOGGING = "false";
TRUST_PROXY = "1";
# Logging
CONSOLE_JSON = "false";
ALLOW_REGISTRATION = "true";
ALLOW_EMAIL_LOGIN = "true";
DEBUG_LOGGING = "true";
DEBUG_CONSOLE = "false";
AGENT_DEBUG_LOGGING = "false";
DEBUG_OPENAI = "false";
# Node
NODE_MAX_OLD_SPACE_SIZE = "6144";
# Search
SEARCH = "true";
MEILI_NO_ANALYTICS = "true";
# Moderation
OPENAI_MODERATION = "false";
BAN_VIOLATIONS = "true";
BAN_DURATION = "1000 * 60 * 60 * 2";
BAN_INTERVAL = "20";
LOGIN_VIOLATION_SCORE = "1";
REGISTRATION_VIOLATION_SCORE = "1";
CONCURRENT_VIOLATION_SCORE = "1";
MESSAGE_VIOLATION_SCORE = "1";
NON_BROWSER_VIOLATION_SCORE = "20";
TTS_VIOLATION_SCORE = "0";
STT_VIOLATION_SCORE = "0";
FORK_VIOLATION_SCORE = "0";
IMPORT_VIOLATION_SCORE = "0";
FILE_UPLOAD_VIOLATION_SCORE = "0";
LOGIN_MAX = "7";
LOGIN_WINDOW = "5";
REGISTER_MAX = "5";
REGISTER_WINDOW = "60";
LIMIT_CONCURRENT_MESSAGES = "true";
CONCURRENT_MESSAGE_MAX = "2";
LIMIT_MESSAGE_IP = "true";
MESSAGE_IP_MAX = "40";
MESSAGE_IP_WINDOW = "1";
LIMIT_MESSAGE_USER = "false";
MESSAGE_USER_MAX = "40";
MESSAGE_USER_WINDOW = "1";
ILLEGAL_MODEL_REQ_SCORE = "5";
# Registration and login
ALLOW_EMAIL_LOGIN = "true";
ALLOW_REGISTRATION = "false";
ALLOW_SOCIAL_LOGIN = "false";
ALLOW_SOCIAL_REGISTRATION = "false";
ALLOW_PASSWORD_RESET = "false";
ALLOW_UNVERIFIED_EMAIL_LOGIN = "true";
SESSION_EXPIRY = "1000 * 60 * 15";
REFRESH_TOKEN_EXPIRY = "(1000 * 60 * 60 * 24) * 7";
# OpenID
OPENID_SCOPE = "openid profile email";
OPENID_CALLBACK_URL = "/oauth/openid/callback";
OPENID_AUTO_REDIRECT = "false";
OPENID_USE_PKCE = "false";
OPENID_ON_BEHALF_FLOW_USERINFO_SCOPE = "user.read";
# OAuth callback URLs
DISCORD_CALLBACK_URL = "/oauth/discord/callback";
FACEBOOK_CALLBACK_URL = "/oauth/facebook/callback";
GITHUB_CALLBACK_URL = "/oauth/github/callback";
GOOGLE_CALLBACK_URL = "/oauth/google/callback";
APPLE_CALLBACK_URL = "/oauth/apple/callback";
SAML_CALLBACK_URL = "/oauth/saml/callback";
# Entra ID
USE_ENTRA_ID_FOR_PEOPLE_SEARCH = "false";
ENTRA_ID_INCLUDE_OWNERS_AS_MEMBERS = "false";
OPENID_GRAPH_SCOPES = "User.Read,People.Read,GroupMember.Read.All";
# Shared links
ALLOW_SHARED_LINKS = "true";
ALLOW_SHARED_LINKS_PUBLIC = "false";
# UI
APP_TITLE = "LibreChat";
HELP_AND_FAQ_URL = "https://librechat.ai";
# Flux
FLUX_API_BASE_URL = "https://api.us1.bfl.ai";
# Email
EMAIL_PORT = "25";
EMAIL_FROM = "noreply@librechat.ai";
# Azure Blob Storage
AZURE_STORAGE_PUBLIC_ACCESS = "false";
AZURE_CONTAINER_NAME = "files";
};
mkImageOption =
name: description:
mkOption {
type = types.package;
default = defaultImages.${name};
description = description;
};
inherit (lib)
literalExpression
mkEnableOption
mkIf
mkOption
mkOverride
optional
types
;
in
{
options.services.librechat-oci = {
enable = mkEnableOption "LibreChat container with Podman.";
image = mkOption {
type = types.package;
default = image;
description = "The Docker image to use (`pkgs.dockerTools.pullImage`).";
images = {
librechat = mkImageOption "librechat" "The LibreChat Docker image (`pkgs.dockerTools.pullImage`).";
meilisearch = mkImageOption "meilisearch" "The Meilisearch Docker image (`pkgs.dockerTools.pullImage`).";
mongodb = mkImageOption "mongodb" "The MongoDB Docker image (`pkgs.dockerTools.pullImage`).";
vectordb = mkImageOption "vectordb" "The pgvector Docker image (`pkgs.dockerTools.pullImage`).";
ragApi = mkImageOption "ragApi" "The LibreChat RAG API Docker image (`pkgs.dockerTools.pullImage`).";
};
configFile = mkOption {
type = types.nullOr types.path;
default = null;
example = literalExpression "./librechat.yaml";
description = "Path to the `librechat.yaml` configuration file.";
};
externalUrl = mkOption {
type = types.nullOr types.str;
default = null;
example = literalExpression "http://${config.networking.domain}";
description = "Public URL to configure for LibreChat.";
example = literalExpression ''"https://chat.example.com"'';
description = "Public URL to configure for LibreChat (sets DOMAIN_CLIENT and DOMAIN_SERVER).";
};
port = mkOption {
type = types.port;
default = 3080;
description = "Which port the LibreChat server listens to.";
description = "Which port the LibreChat server listens on.";
};
meiliPort = mkOption {
type = types.port;
default = 7700;
description = "Which port Meilisearch listens on.";
};
ragPort = mkOption {
type = types.port;
default = 8000;
description = "Which port the RAG API listens on.";
};
environment = mkOption {
default = { };
type = types.attrsOf types.str;
description = ''
Extra environment variables for LibreChat.
For more details see <https://docs.librechat.ai/docs/configuration/dotenv>
These are merged on top of the defaults and can override them.
For secrets use <option>environmentFile</option> instead.
See <https://docs.librechat.ai/docs/configuration/dotenv>.
'';
};
environmentFile = mkOption {
description = "Environment file to be passed to the LibreChat container.";
type = types.nullOr types.path;
default = null;
example = "config.sops.templates.librechat-env.path";
example = literalExpression "config.sops.templates.librechat-env.path";
description = ''
Environment file passed to the LibreChat, Meilisearch, and RAG API
containers. Use this for secrets such as JWT_SECRET, CREDS_KEY,
MEILI_MASTER_KEY, and API keys.
'';
};
};
@ -89,158 +252,275 @@ in
virtualisation.oci-containers.backend = "podman";
virtualisation.oci-containers.containers."librechat-mongodb" = {
image = "mongo:7.0";
environment = {
MONGO_INITDB_ROOT_USERNAME = "root";
MONGO_INITDB_ROOT_PASSWORD = "librechat";
MONGO_INITDB_DATABASE = "LibreChat";
};
virtualisation.oci-containers.containers.librechat-mongodb = {
image = with cfg.images.mongodb; "${imageName}:${imageTag}";
imageFile = cfg.images.mongodb;
cmd = [
"mongod"
"--noauth"
];
volumes = [
"librechat_mongodb_data:/data/db:rw"
];
log-driver = "journald";
extraOptions = [
"--network=host"
"--network-alias=mongodb"
"--network=librechat_default"
];
};
virtualisation.oci-containers.containers.librechat-meilisearch = {
image = with cfg.images.meilisearch; "${imageName}:${imageTag}";
imageFile = cfg.images.meilisearch;
environment = {
MEILI_NO_ANALYTICS = "true";
MEILI_HOST = "http://meilisearch:${toString cfg.meiliPort}";
};
environmentFiles = optional (cfg.environmentFile != null) cfg.environmentFile;
volumes = [
"librechat_meili_data:/meili_data:rw"
];
log-driver = "journald";
extraOptions = [
"--network-alias=meilisearch"
"--network=librechat_default"
];
};
virtualisation.oci-containers.containers.librechat-vectordb = {
image = with cfg.images.vectordb; "${imageName}:${imageTag}";
imageFile = cfg.images.vectordb;
environment = {
POSTGRES_DB = "mydatabase";
POSTGRES_USER = "myuser";
POSTGRES_PASSWORD = "mypassword";
};
volumes = [
"librechat_pgdata:/var/lib/postgresql/data:rw"
];
log-driver = "journald";
extraOptions = [
"--network-alias=vectordb"
"--network=librechat_default"
];
};
virtualisation.oci-containers.containers.librechat-rag-api = {
image = with cfg.images.ragApi; "${imageName}:${imageTag}";
imageFile = cfg.images.ragApi;
environment = {
DB_HOST = "vectordb";
RAG_PORT = toString cfg.ragPort;
};
environmentFiles = optional (cfg.environmentFile != null) cfg.environmentFile;
dependsOn = [ "librechat-vectordb" ];
log-driver = "journald";
extraOptions = [
"--network-alias=rag_api"
"--network=librechat_default"
];
};
virtualisation.oci-containers.containers.librechat = {
image = toString cfg.image;
image = with cfg.images.librechat; "${imageName}:${imageTag}";
imageFile = cfg.images.librechat;
environment =
defaultEnv
// {
MONGO_URI = "mongodb://root:librechat@localhost:27017/LibreChat?authSource=admin";
MONGO_URI = "mongodb://mongodb:27017/LibreChat";
MEILI_HOST = "http://meilisearch:${toString cfg.meiliPort}";
RAG_PORT = toString cfg.ragPort;
RAG_API_URL = "http://rag_api:${toString cfg.ragPort}";
DOMAIN_CLIENT =
if cfg.externalUrl != null then cfg.externalUrl else "http://localhost:${toString cfg.port}";
DOMAIN_SERVER =
if cfg.externalUrl != null then cfg.externalUrl else "http://localhost:${toString cfg.port}";
}
// cfg.environment;
environmentFiles = optional (cfg.environmentFile != null) cfg.environmentFile;
volumes = [
"librechat_data:/app/client/data:rw"
"librechat_images:/app/client/public/images:rw"
"librechat_uploads:/app/api/server/files/uploads:rw"
"librechat_uploads:/app/uploads:rw"
"librechat_logs:/app/logs:rw"
];
]
++ optional (cfg.configFile != null) "${cfg.configFile}:/app/librechat.yaml:ro";
ports = [
"${toString cfg.port}:${toString cfg.port}"
"0.0.0.0:${toString cfg.port}:${toString cfg.port}/tcp"
];
dependsOn = [
"librechat-mongodb"
"librechat-rag-api"
];
log-driver = "journald";
extraOptions = [
"--network=host"
"--network-alias=api"
"--network=librechat_default"
];
};
systemd.services."podman-librechat-mongodb" = {
serviceConfig = {
Restart = mkOverride 90 "always";
};
systemd.services.podman-librechat-mongodb = {
serviceConfig.Restart = mkOverride 90 "always";
after = [
"podman-network-librechat_default.service"
"podman-volume-librechat_mongodb_data.service"
];
requires = [
"podman-network-librechat_default.service"
"podman-volume-librechat_mongodb_data.service"
];
partOf = [
"podman-compose-librechat-root.target"
];
wantedBy = [
"podman-compose-librechat-root.target"
];
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services."podman-librechat" = {
serviceConfig = {
Restart = mkOverride 90 "always";
};
systemd.services.podman-librechat-meilisearch = {
serviceConfig.Restart = mkOverride 90 "always";
after = [
"podman-volume-librechat_data.service"
"podman-network-librechat_default.service"
"podman-volume-librechat_meili_data.service"
];
requires = [
"podman-network-librechat_default.service"
"podman-volume-librechat_meili_data.service"
];
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services.podman-librechat-vectordb = {
serviceConfig.Restart = mkOverride 90 "always";
after = [
"podman-network-librechat_default.service"
"podman-volume-librechat_pgdata.service"
];
requires = [
"podman-network-librechat_default.service"
"podman-volume-librechat_pgdata.service"
];
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services.podman-librechat-rag-api = {
serviceConfig.Restart = mkOverride 90 "always";
after = [
"podman-network-librechat_default.service"
"podman-librechat-vectordb.service"
];
requires = [
"podman-network-librechat_default.service"
"podman-librechat-vectordb.service"
];
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services.podman-librechat = {
serviceConfig.Restart = mkOverride 90 "always";
after = [
"podman-network-librechat_default.service"
"podman-volume-librechat_images.service"
"podman-volume-librechat_uploads.service"
"podman-volume-librechat_logs.service"
"podman-librechat-mongodb.service"
"podman-librechat-meilisearch.service"
"podman-librechat-rag-api.service"
];
requires = [
"podman-volume-librechat_data.service"
"podman-network-librechat_default.service"
"podman-volume-librechat_images.service"
"podman-volume-librechat_uploads.service"
"podman-volume-librechat_logs.service"
"podman-librechat-mongodb.service"
"podman-librechat-meilisearch.service"
"podman-librechat-rag-api.service"
];
partOf = [
"podman-compose-librechat-root.target"
];
wantedBy = [
"podman-compose-librechat-root.target"
];
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services."podman-volume-librechat_data" = {
systemd.services.podman-network-librechat_default = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
ExecStop = "podman network rm -f librechat_default";
};
script = ''
podman volume inspect librechat_data || podman volume create librechat_data
podman network inspect librechat_default || podman network create librechat_default
'';
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services."podman-volume-librechat_images" = {
systemd.services.podman-volume-librechat_mongodb_data = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
podman volume inspect librechat_images || podman volume create librechat_images
'';
script = "podman volume inspect librechat_mongodb_data || podman volume create librechat_mongodb_data";
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services."podman-volume-librechat_uploads" = {
systemd.services.podman-volume-librechat_meili_data = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
podman volume inspect librechat_uploads || podman volume create librechat_uploads
'';
script = "podman volume inspect librechat_meili_data || podman volume create librechat_meili_data";
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services."podman-volume-librechat_logs" = {
systemd.services.podman-volume-librechat_pgdata = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
podman volume inspect librechat_logs || podman volume create librechat_logs
'';
script = "podman volume inspect librechat_pgdata || podman volume create librechat_pgdata";
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services."podman-volume-librechat_mongodb_data" = {
systemd.services.podman-volume-librechat_images = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
podman volume inspect librechat_mongodb_data || podman volume create librechat_mongodb_data
'';
script = "podman volume inspect librechat_images || podman volume create librechat_images";
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.targets."podman-compose-librechat-root" = {
unitConfig = {
Description = "Root target generated by compose2nix.";
systemd.services.podman-volume-librechat_uploads = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = "podman volume inspect librechat_uploads || podman volume create librechat_uploads";
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.services.podman-volume-librechat_logs = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = "podman volume inspect librechat_logs || podman volume create librechat_logs";
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
systemd.targets.podman-compose-librechat-root = {
unitConfig.Description = "Root target generated by compose2nix.";
wantedBy = [ "multi-user.target" ];
};
};

View file

@ -28,6 +28,12 @@ in
default = null;
};
port = mkOption {
type = types.port;
default = 8000;
description = "Port on which the mcpo service should listen.";
};
user = mkOption {
type = types.str;
description = "The user the mcpo service will run as.";
@ -100,7 +106,7 @@ in
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = "${getExe cfg.package} --config ${configFile}";
ExecStart = "${getExe cfg.package} --port ${toString cfg.port} --config ${configFile}";
Restart = "on-failure";
User = cfg.user;
Group = cfg.group;

View file

@ -15,6 +15,7 @@
jirafeau-cli = pkgs.callPackage ./jirafeau-cli { };
kicad-mcp = pkgs.callPackage ./kicad-mcp { };
mcpo = pkgs.callPackage ./mcpo { };
nerdlog = pkgs.callPackage ./nerdlog { };
pass2bw = pkgs.callPackage ./pass2bw { };
pyman = pkgs.callPackage ./pyman { };
quicknote = pkgs.callPackage ./quicknote { };

83
pkgs/nerdlog/default.nix Normal file
View file

@ -0,0 +1,83 @@
{
lib,
buildGoModule,
fetchFromGitHub,
stdenv,
darwin,
xorg,
pkg-config,
wayland,
libGL,
libxkbcommon,
makeWrapper,
}:
buildGoModule rec {
pname = "nerdlog";
version = "1.10.0";
src = fetchFromGitHub {
owner = "dimonomid";
repo = "nerdlog";
rev = "v${version}";
hash = "sha256-XlzWNeyd+Ar4ArFcN1wkQ0aod6ckAiIb12odK7cf4+s=";
};
vendorHash = "sha256-hvv0dsE1yz85VLaBOE7RWbux8L8kVTihcA1HyyHRYAM=";
subPackages = [
"cmd/nerdlog"
"cmd/generate_syslog"
];
doCheck = false;
nativeBuildInputs = [
pkg-config
makeWrapper
];
buildInputs =
lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.Cocoa
]
++ lib.optionals stdenv.isLinux [
xorg.libX11
xorg.libXext
xorg.libXfixes
wayland
libGL
libxkbcommon
];
postInstall = lib.optionalString stdenv.isLinux ''
wrapProgram $out/bin/nerdlog \
--prefix LD_LIBRARY_PATH : ${
lib.makeLibraryPath [
xorg.libX11
xorg.libXext
xorg.libXfixes
wayland
libGL
libxkbcommon
]
}
'';
ldflags = [
"-s"
"-w"
"-X=github.com/dimonomid/nerdlog/version.version=${version}"
"-X=github.com/dimonomid/nerdlog/version.commit=${src.rev}"
"-X=github.com/dimonomid/nerdlog/version.date=1970-01-01T00:00:00Z"
"-X=github.com/dimonomid/nerdlog/version.builtBy=goreleaser"
];
meta = {
description = "Nerdlog: fast, remote-first, multi-host TUI log viewer with timeline histogram and no central server";
homepage = "https://github.com/dimonomid/nerdlog";
changelog = "https://github.com/dimonomid/nerdlog/blob/${src.rev}/CHANGELOG.md";
license = lib.licenses.bsd2;
mainProgram = "nerdlog";
};
}

View file

@ -42,6 +42,14 @@ def process_csv(input_file, output_file):
for col, default_val in default_values.items():
if col not in new_row:
new_row[col] = default_val
folder = new_row.get('folder', '')
name = new_row.get('name', '')
if folder.startswith('www') and name:
if not name.startswith('http://') and not name.startswith('https://'):
new_row['login_uri'] = f'https://{name}'
else:
new_row['login_uri'] = name
if new_row['notes']:
new_row['notes'] = new_row['notes'].replace('\n', ' ').replace('\r', ' ')
@ -49,7 +57,6 @@ def process_csv(input_file, output_file):
notes = new_row['notes']
if notes:
# Look for pattern: "login: USERNAME"
match = re.search(r'login:\s*(\S+)', notes, re.IGNORECASE)
if match:
username = match.group(1)

View file

@ -2,6 +2,8 @@
stdenv,
lib,
makeWrapper,
pass,
pass2csv,
python3,
...
}:
@ -20,13 +22,18 @@ stdenv.mkDerivation rec {
installPhase = ''
mkdir -p $out/bin
sed -e "s|python ./convert_csvs.py|python $out/bin/convert_csvs.py|" \
${src}/${pname}.sh > $out/bin/${pname}
cp ${src}/pass2bw.sh $out/bin/${pname}
chmod +x $out/bin/${pname}
cp ${src}/convert_csvs.py $out/bin/
wrapProgram $out/bin/${pname} \
--prefix PATH : ${lib.makeBinPath [ python3 ]}
--prefix PATH : ${
lib.makeBinPath [
pass
pass2csv
python3
]
}
'';
}

View file

@ -4,5 +4,5 @@ if [ "$#" -ne 2 ]; then
fi
pass2csv "$1" /tmp/pass.csv
python ./convert_csvs.py /tmp/pass.csv "$2"
python3 "$(dirname "$0")/convert_csvs.py" /tmp/pass.csv "$2"
rm /tmp/pass.csv