Compare commits
34 Commits
c53b82f0a1
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 9f9073ee40 | |||
| d756e966b1 | |||
| fa4591c6b3 | |||
| 329703abf0 | |||
| 43cdb7c747 | |||
| 5dd038586f | |||
| 532bc09e26 | |||
| 2bd9ebc5da | |||
| c3145fcd9a | |||
| 76b3df02be | |||
| 1b7ad9651e | |||
| 3b908a7d9c | |||
| bbb8cae22d | |||
| 08bbe87cc5 | |||
| c459e69000 | |||
| 6c37e18206 | |||
| 0e5c5afa53 | |||
| 20ef9d0988 | |||
| 77320e4528 | |||
| 42faba76ea | |||
| b40e86300c | |||
| 2d583d8537 | |||
| 65f162bd32 | |||
| 16f0ee56a9 | |||
| adcf4f0cc5 | |||
| c767eaf030 | |||
| 751e8a67e7 | |||
| 78f039c980 | |||
| bd2f28ff81 | |||
| 5af65cd11d | |||
| d96fbf176d | |||
| 01eeb9a57c | |||
| b0e4aa4667 | |||
| 0b1dadb0bb |
0
.sidecar/shells.json.lock
Normal file
0
.sidecar/shells.json.lock
Normal file
@@ -1,75 +0,0 @@
|
||||
# Personal AI Agent: "About Me" Profile Generator
|
||||
|
||||
**Project Goal**
|
||||
Build a showcase AI system that scans and summarizes your professional/personal work from self-hosted services (primarily Gitea for code/repos, plus Flatnotes/Trillium/HedgeDoc for notes/ideas/projects). The agent answers employer-style questions dynamically (e.g., "Summarize Giordano's coding projects and skills") with RAG-grounded responses, links, and image embeds where relevant.
|
||||
|
||||
Emphasize broad AI toolchain integration for skill development and portfolio impact: agentic workflows, RAG pipelines, orchestration, multi-LLM support. No frontend focus — terminal/API-triggered queries only.
|
||||
|
||||
**Key Features**
|
||||
- Periodic/full scanning of services to extract text, summaries, code snippets, links, images.
|
||||
- Populate & query a local vector DB (RAG) for semantic search.
|
||||
- Agent reasons, retrieves, generates responses with evidence (links/images).
|
||||
- Multi-LLM fallback (DeepSeek primary, Gemini/OpenCode trigger).
|
||||
- Scheduled/automated updates via pipelines.
|
||||
- Local/Docker deployment for privacy & control.
|
||||
|
||||
**Tools & Stack Overview**
|
||||
|
||||
| Category | Tool(s) | Purpose & Why Chosen | Integration Role |
|
||||
|-----------------------|----------------------------------|--------------------------------------------------------------------------------------|------------------|
|
||||
| Core Framework | LangChain / LangGraph | Build agent, tools, chains, RAG logic. Modular, industry-standard for LLM apps. | Heart of agent & retrieval |
|
||||
| Crawling/Extraction | Selenium / Playwright + Firecrawl (via LangChain loaders) | Handle auth/dynamic pages (Gitea login/nav), structured extraction (Markdown/JSON). | Scan web views & APIs |
|
||||
| Vector Database | Chroma | Local, lightweight RAG store. Easy Docker setup, native LangChain integration. | Store embeddings for fast semantic search |
|
||||
| LLM(s) | DeepSeek (via API) + Gemini / OpenCode | DeepSeek: cheap, strong reasoning (primary). Gemini/OpenCode: terminal trigger/fallback. | Reasoning & generation |
|
||||
| Data Pipeline / Scheduling | Apache Airflow (Docker) | Industry-best for ETL/ETL-like scans (DAGs). Local install via official Compose. | Schedule periodic scans/updates to Chroma |
|
||||
| Visual Prototyping | Flowise | No-code visual builder on LangChain. Quick agent/RAG prototyping & debugging. | Experiment with chains before code |
|
||||
| Script/Workflow Orchestration | Windmill | Turn Python/LangChain scripts into reusable, scheduled flows. Dev-first, high growth.| Reactive workflows (e.g., on-commit triggers) |
|
||||
| Event-Driven Automation | Activepieces | Connect services event-based (e.g., Gitea webhook → re-scan). AI-focused pieces. | Glue for reactive triggers |
|
||||
|
||||
**High-Level Architecture & Flow**
|
||||
|
||||
1. **Ingestion Pipeline (Airflow + Crawlers)**
|
||||
- Airflow DAG runs on schedule (daily/weekly) or manually.
|
||||
- Task 1: LangChain agent uses Selenium/Playwright tool to browse/authenticate to services (e.g., Gitea repos, Flatnotes/Trillium pages).
|
||||
- Task 2: Firecrawl loader extracts structured content (text, code blocks, links, image URLs).
|
||||
- Task 3: LangChain chunks, embeds (DeepSeek embeddings), upserts to Chroma vector DB.
|
||||
- Optional: Activepieces listens for events (e.g., Gitea push webhook) → triggers partial re-scan.
|
||||
|
||||
2. **Agent Runtime (LangChain/LangGraph + DeepSeek)**
|
||||
- Core agent (ReAct-style): Receives query (e.g., via terminal/OpenCode: "opencode query 'Giordano's top projects'").
|
||||
- Tools: Retrieve from Chroma (RAG), fetch specific pages/images if needed.
|
||||
- LLM: DeepSeek for cost-effective reasoning/summarization. Fallback to Gemini if complex.
|
||||
- Output: Natural response with summaries, links (e.g., Gitea repo URLs), embedded image previews (from scanned pages).
|
||||
|
||||
3. **Prototyping & Orchestration Layer**
|
||||
- Use Flowise to visually build/test agent chains/RAG flows before committing to code.
|
||||
- Windmill wraps scripts (e.g., scan script) as jobs/APIs.
|
||||
- Activepieces adds event-driven glue (e.g., new note in Trillium → notify/update DB).
|
||||
|
||||
**Deployment & Running Locally**
|
||||
- Everything in Docker Compose: Airflow (official image), Chroma, Python services (LangChain agent), optional Flowise/Windmill containers.
|
||||
- Secrets: Env vars for API keys (DeepSeek, service auth).
|
||||
- Trigger: Terminal via OpenCode/Gemini CLI → calls agent endpoint/script.
|
||||
- Scale: Start simple (manual scans), add Airflow scheduling later.
|
||||
|
||||
**Skill Showcase & Portfolio Value**
|
||||
- Demonstrates: Agentic AI, RAG pipelines, web crawling with auth, multi-tool orchestration, cost-optimized LLMs, local/self-hosted infra.
|
||||
- Broad coverage: LangChain ecosystem + industry ETL (Airflow) + modern AI workflow tools (Flowise/Windmill/Activepieces).
|
||||
- Low cost: DeepSeek keeps API bills minimal (often <$5/month even with frequent scans/queries).
|
||||
|
||||
**Next Steps (Implementation Phases)**
|
||||
1. Setup local Docker env + Chroma + DeepSeek API key.
|
||||
2. Build basic crawler tools (Selenium + Firecrawl) for Gitea/Flatnotes.
|
||||
3. Prototype agent in Flowise, then code in LangChain.
|
||||
4. Add Airflow DAG for scheduled ingestion.
|
||||
5. Integrate Windmill/Activepieces for extras.
|
||||
6. Test queries, refine summaries/links/images.
|
||||
|
||||
This setup positions you strongly for AI engineering roles while building real, integrated skills.
|
||||
|
||||
** Extra tools to add.
|
||||
- AutoMaker
|
||||
- AutoCoder - These assist in set and forget long review AI
|
||||
- OpenRouter - Single access point for any CLI with useage fee.
|
||||
- Aider - CLI code and file editing with OpenROuter for any model
|
||||
- Goose - integrates with system and MCP servers like ClawBot
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
# Phase 2: Software Migration Plan & Mapping
|
||||
|
||||
**Objective:** To create a clear mapping from currently installed software (via APT and Snap) to their equivalents in the NixOS ecosystem. This list will directly inform the creation of the `configuration.nix` file.
|
||||
|
||||
## Analysis Summary
|
||||
|
||||
The reconnaissance scan revealed a large number of installed packages. The following is a high-level summary and a plan for the most critical software components identified.
|
||||
|
||||
**Instructions:** Review this list. Add any missing critical applications. The "NixOS Package Name" column should be filled in by searching for the application on [NixOS Search](https://search.nixos.org/packages).
|
||||
|
||||
---
|
||||
|
||||
### Tier 1: Critical Applications & Services
|
||||
|
||||
These are essential for your daily workflow and server functions.
|
||||
|
||||
| Application Name | Installed Via | Notes | NixOS Package Name / Module |
|
||||
| ----------------------- | ------------- | ----------------------------------------------- | -------------------------------- |
|
||||
| Docker | `apt` | Core virtualization tool. | `virtualisation.docker.enable = true;` |
|
||||
| Docker Compose | `apt` | Used for multi-container Docker apps. | `docker-compose` |
|
||||
| Firefox | `snap` | Primary web browser. | `firefox` |
|
||||
| Thunderbird | `snap` | Email client. | `thunderbird` |
|
||||
| Kitty | `apt` | Terminal emulator. | `kitty` |
|
||||
| Neovim (from dotfiles) | Manual/Git | Primary text editor. | `neovim` |
|
||||
| Snapcast (Server/Client)| `apt`? | Need to locate config files (`/etc/snap*`). | `snapcast-server`, `snapcast-client` |
|
||||
| Gitea (mentioned) | Docker/Manual | Git service. | `gitea` or managed via Docker |
|
||||
| Nushell | `snap` | Shell. | `nushell` |
|
||||
| --- | --- | --- | --- |
|
||||
|
||||
|
||||
### Tier 2: Development & CLI Tools
|
||||
|
||||
Essential tools for your development and command-line environment.
|
||||
|
||||
| Tool Name | Installed Via | Notes | NixOS Package Name |
|
||||
| ----------------------- | ------------- | ----------------------------------------------- | -------------------------------- |
|
||||
| Git | `apt` | Version control. | `git` |
|
||||
| Rust (cargo, rustc) | `apt` | Rust programming language toolchain. | `rustc`, `cargo` |
|
||||
| Node.js | `apt` | JavaScript runtime. | `nodejs` (specify version) |
|
||||
| Python 3 | `apt` | Python programming language. | `python3` |
|
||||
| build-essential / gcc | `apt` | C/C++ compiler and core build tools. | `gcc`, `gnumake` |
|
||||
| btop | `apt` | Resource monitor. | `btop` |
|
||||
| eza / bat / fzf | `apt` | Modern CLI tools. | `eza`, `bat`, `fzf` |
|
||||
| --- | --- | --- | --- |
|
||||
|
||||
|
||||
### Tier 3: Desktop & GUI Applications
|
||||
|
||||
Standard desktop applications.
|
||||
|
||||
| Application Name | Installed Via | Notes | NixOS Package Name |
|
||||
| ----------------------- | ------------- | ----------------------------------------------- | -------------------------------- |
|
||||
| LibreOffice | `apt` | Office suite. | `libreoffice` |
|
||||
| Flameshot | `apt` | Screenshot tool. | `flameshot` |
|
||||
| GIMP / Inkscape (if any)| `apt`? | Graphics editors. | `gimp`, `inkscape` |
|
||||
| GNOME Apps (various) | `apt` | Calculator, Clocks, etc. | Handled by `services.xserver.desktopManager.gnome.enable = true;` |
|
||||
| --- | --- | --- | --- |
|
||||
|
||||
## Plan for Other Packages
|
||||
|
||||
- **System Libraries:** The vast majority of packages listed in the log are system libraries (files ending in `...:amd64`, `...-dev`, `lib...`). These will be managed automatically by NixOS as dependencies for the applications you choose to install. You do not need to list them manually.
|
||||
- **Snap Packages:** All applications installed via `snap` will need to be replaced with their NixOS/Flathub equivalents. NixOS does not support Snap out of the box.
|
||||
- **De-duplication:** Many packages are related (e.g., `g++`, `gcc`, `cpp`). In NixOS, installing the `gcc` package will provide the necessary toolchain.
|
||||
|
||||
**Next Step:** Use this document as a worksheet to build the `environment.systemPackages` list in the `configuration.nix.template` file.
|
||||
@@ -1,67 +0,0 @@
|
||||
# Phase 2: Software Migration Plan & Mapping (Filled)
|
||||
|
||||
**Objective:** To create a clear mapping from currently installed software (via APT and Snap) to their equivalents in the NixOS ecosystem. This list will directly inform the creation of the `configuration.nix` file.
|
||||
|
||||
## Analysis Summary
|
||||
|
||||
The following tables are based on the `logs/01_system_recon.log` file.
|
||||
|
||||
---
|
||||
|
||||
### Tier 1: Critical Applications & Services
|
||||
|
||||
These are essential for your daily workflow and server functions.
|
||||
|
||||
| Application Name | Installed Via | Notes | NixOS Package Name / Module |
|
||||
| ----------------------- | ------------- | ----------------------------------------------- | -------------------------------- |
|
||||
| Firefox | `snap` | Primary web browser. | `firefox` |
|
||||
| Thunderbird | `snap` | Email client. | `thunderbird` |
|
||||
| Kitty | `apt` | Terminal emulator. | `kitty` |
|
||||
| Neovim | `apt` | Primary text editor. | `neovim` |
|
||||
| Nushell | `snap` | Shell. | `nushell` |
|
||||
| VS Code | `snap` | Code editor. | `vscode` |
|
||||
| Telegram Desktop | `snap` | Messaging app. | `telegram-desktop` |
|
||||
| --- | --- | --- | --- |
|
||||
|
||||
|
||||
### Tier 2: Development & CLI Tools
|
||||
|
||||
Essential tools for your development and command-line environment.
|
||||
|
||||
| Tool Name | Installed Via | Notes | NixOS Package Name |
|
||||
| ----------------------- | ------------- | ----------------------------------------------- | -------------------------------- |
|
||||
| Git | `apt` | Version control. | `git` |
|
||||
| Rust (cargo, rustc) | `apt` | Rust programming language toolchain. | `rustc`, `cargo` |
|
||||
| Node.js | `apt` | JavaScript runtime. | `nodejs` (specify version) |
|
||||
| Python 3 | `apt` | Python programming language. | `python3` |
|
||||
| build-essential / gcc | `apt` | C/C++ compiler and core build tools. | `gcc`, `gnumake` |
|
||||
| btop | `apt` | Resource monitor. | `btop` |
|
||||
| eza | `apt` | Modern `ls` replacement. | `eza` |
|
||||
| bat | `apt` | Modern `cat` replacement. | `bat` |
|
||||
| fzf | `apt` | Command-line fuzzy finder. | `fzf` |
|
||||
| ripgrep | `apt` | Fast search tool. | `ripgrep` |
|
||||
| zoxide | `apt` | Smarter `cd` command. | `zoxide` |
|
||||
| --- | --- | --- | --- |
|
||||
|
||||
|
||||
### Tier 3: Desktop & GUI Applications
|
||||
|
||||
Standard desktop applications.
|
||||
|
||||
| Application Name | Installed Via | Notes | NixOS Package Name |
|
||||
| ----------------------- | ------------- | ----------------------------------------------- | -------------------------------- |
|
||||
| LibreOffice | `apt` | Office suite. | `libreoffice` |
|
||||
| Flameshot | `apt` | Screenshot tool. | `flameshot` |
|
||||
| VLC | `apt` | Media player. | `vlc` |
|
||||
| Spotify | `snap` | Music player. | `spotify` |
|
||||
| Timeshift | `apt` | System restore utility. | `timeshift` |
|
||||
| GNOME Apps (various) | `apt` | Calculator, Clocks, etc. | Handled by `services.xserver.desktopManager.gnome.enable = true;` |
|
||||
| --- | --- | --- | --- |
|
||||
|
||||
## Plan for Other Packages
|
||||
|
||||
- **System Libraries:** The vast majority of packages listed in the log are system libraries (files ending in `...:amd64`, `...-dev`, `lib...`). These will be managed automatically by NixOS as dependencies for the applications you choose to install. You do not need to list them manually.
|
||||
- **Snap Packages:** All applications installed via `snap` will need to be replaced with their NixOS/Flathub equivalents. NixOS does not support Snap out of the box. The list above includes the most important ones.
|
||||
- **De-duplication:** Many packages are related (e.g., `g++`, `gcc`, `cpp`). In NixOS, installing the `gcc` package will provide the necessary toolchain.
|
||||
|
||||
**Next Step:** Use this document as a worksheet to build the `environment.systemPackages` list in the `configuration.nix` file.
|
||||
@@ -1,18 +0,0 @@
|
||||
# Application Data Notes for NixOS Migration
|
||||
|
||||
This document outlines considerations for application-specific data that may need special handling during the NixOS migration.
|
||||
|
||||
## Important Considerations:
|
||||
|
||||
* **GPG Keys:** Your GnuPG keys are critical for cryptographic operations (e.g., signing Git commits, encrypting files). These are typically stored in `~/.gnupg/`. It is paramount to ensure these keys are backed up securely.
|
||||
* **Action:** Verify that your `~/.gnupg/` directory is either included in a secure backup separate from `/data` (e.g., an encrypted archive) or that you have a recovery method (e.g., revoked subkeys, passphrase-protected master key backup) that is outside of this system.
|
||||
|
||||
* **SSH Keys:** Your SSH keys (typically in `~/.ssh/`) are used for secure remote access (e.g., to Gitea, other servers). While you've indicated dotfiles will be managed, SSH private keys should *never* be committed directly to a public repository.
|
||||
* **Action:** Confirm that you have a secure backup of your `~/.ssh/` directory, especially your private keys, in a location separate from `/data` (e.g., an encrypted USB stick, a secure password manager). These keys should be restored to the new NixOS system as part of your `home-manager` setup or manually.
|
||||
|
||||
## Exclusions (No Action Required):
|
||||
|
||||
* **Thunderbird Email:** You have confirmed that Thunderbird uses Gmail in the cloud. No local migration of email data is required.
|
||||
* **Google Chrome / Mozilla Firefox Profiles:** You have confirmed that browser data (bookmarks, passwords, extensions) are synced via your accounts. No local migration of browser profiles is required.
|
||||
|
||||
This document serves as a reminder to address these specific local application data points when configuring your new NixOS environment.
|
||||
@@ -1,176 +0,0 @@
|
||||
# NixOS Install Guide (wipe NVMe, install from flake on Integral300)
|
||||
|
||||
This guide assumes:
|
||||
- You are currently on Ubuntu
|
||||
- You will WIPE the entire NVMe: /dev/nvme0n1
|
||||
- You will install NixOS with:
|
||||
- UEFI + systemd-boot
|
||||
- Btrfs with subvolumes (@ and @home)
|
||||
- No encryption
|
||||
- zram swap (configured in NixOS config)
|
||||
- Your config repo is a flake with output: `#sam-4screen-desktop`
|
||||
- Integral300 (ext4) is available and will be mounted on NixOS at: /data
|
||||
- UUID: 27febd74-20aa-4a3a-92c1-6fdd1ad7e88e
|
||||
- Dotfiles will live on the installed system at:
|
||||
- `~/dotfiles` (NOT on /data)
|
||||
|
||||
Important constraints:
|
||||
- `hosts/sam-4screen-desktop/hardware-configuration.nix` is currently a placeholder.
|
||||
You MUST generate and copy the real one during install before running nixos-install.
|
||||
|
||||
---
|
||||
|
||||
## A) On Ubuntu: prepare and push the config repo to Gitea
|
||||
|
||||
1) Go to your repo folder (example):
|
||||
- If your repo is on Integral300 already:
|
||||
- `cd /media/sam/Integral300/<your-repo-folder>`
|
||||
- Otherwise clone it to Integral300:
|
||||
- `cd /media/sam/Integral300`
|
||||
- `git clone ssh://git@<your-gitea-host>:<port>/<owner>/<repo>.git nixos-config`
|
||||
- `cd nixos-config`
|
||||
|
||||
2) Ensure the flake evaluates:
|
||||
- `nix --version`
|
||||
- `nix flake show`
|
||||
|
||||
3) Commit your changes:
|
||||
- `git status`
|
||||
- `git add -A`
|
||||
- `git commit -m "chore: prep install guide + HM config"`
|
||||
|
||||
4) Push to Gitea:
|
||||
- `git push`
|
||||
|
||||
If you don’t have `flake.lock` yet, you can create it:
|
||||
- `nix flake lock`
|
||||
Then commit/push it too.
|
||||
|
||||
---
|
||||
|
||||
## B) Boot NixOS installer (ISO)
|
||||
|
||||
1) Boot the NixOS ISO (graphical or minimal).
|
||||
2) Open a terminal.
|
||||
|
||||
---
|
||||
|
||||
## C) Wipe / partition / format / mount (CLI method)
|
||||
|
||||
WARNING: This wipes the whole NVMe. Double-check the disk is correct.
|
||||
|
||||
### 1) Identify disks
|
||||
- `lsblk -f`
|
||||
Confirm:
|
||||
- NVMe target: /dev/nvme0n1 (about 953G)
|
||||
- Integral300 disk by UUID is present: 27febd74-20aa-4a3a-92c1-6fdd1ad7e88e
|
||||
|
||||
### 2) Wipe and create partitions
|
||||
This creates:
|
||||
- p1 = EFI (1GiB)
|
||||
- p2 = Btrfs (rest)
|
||||
|
||||
Commands:
|
||||
- `sudo wipefs -a /dev/nvme0n1 || true`
|
||||
- `sudo sgdisk --zap-all /dev/nvme0n1`
|
||||
|
||||
- `sudo sgdisk -n 1:1MiB:+1GiB -t 1:EF00 -c 1:EFI /dev/nvme0n1`
|
||||
- `sudo sgdisk -n 2:0:0 -t 2:8300 -c 2:NIXOS /dev/nvme0n1`
|
||||
|
||||
Verify:
|
||||
- `sudo fdisk -l /dev/nvme0n1`
|
||||
|
||||
### 3) Format
|
||||
- `sudo mkfs.fat -F32 -n EFI /dev/nvme0n1p1`
|
||||
- `sudo mkfs.btrfs -L nixos /dev/nvme0n1p2`
|
||||
|
||||
### 4) Create Btrfs subvolumes
|
||||
- `sudo mount /dev/nvme0n1p2 /mnt`
|
||||
- `sudo btrfs subvolume create /mnt/@`
|
||||
- `sudo btrfs subvolume create /mnt/@home`
|
||||
- `sudo umount /mnt`
|
||||
|
||||
### 5) Mount target layout for install
|
||||
- `sudo mount -o subvol=@,compress=zstd,noatime /dev/nvme0n1p2 /mnt`
|
||||
- `sudo mkdir -p /mnt/home`
|
||||
- `sudo mount -o subvol=@home,compress=zstd,noatime /dev/nvme0n1p2 /mnt/home`
|
||||
|
||||
Mount EFI at /mnt/boot (systemd-boot expects /boot):
|
||||
- `sudo mkdir -p /mnt/boot`
|
||||
- `sudo mount /dev/nvme0n1p1 /mnt/boot`
|
||||
|
||||
### 6) Mount Integral300 so we can access the flake repo (offline-friendly)
|
||||
- `sudo mkdir -p /mnt/data`
|
||||
- `sudo mount /dev/disk/by-uuid/27febd74-20aa-4a3a-92c1-6fdd1ad7e88e /mnt/data`
|
||||
|
||||
---
|
||||
|
||||
## D) Generate hardware-configuration.nix (REQUIRED)
|
||||
|
||||
1) Generate:
|
||||
- `sudo nixos-generate-config --root /mnt`
|
||||
|
||||
2) Copy the generated hardware config into your repo (overwrite placeholder):
|
||||
- If your repo is at `/mnt/data/nixos-config`:
|
||||
- `sudo cp /mnt/etc/nixos/hardware-configuration.nix /mnt/data/nixos-config/hosts/sam-4screen-desktop/hardware-configuration.nix`
|
||||
|
||||
If your repo folder name is different, adjust accordingly.
|
||||
|
||||
Optional sanity check:
|
||||
- `sed -n '1,200p' /mnt/data/nixos-config/hosts/sam-4screen-desktop/hardware-configuration.nix`
|
||||
|
||||
---
|
||||
|
||||
## E) Install NixOS using the flake
|
||||
|
||||
From the installer environment, run:
|
||||
- `sudo nixos-install --flake /mnt/data/nixos-config#sam-4screen-desktop`
|
||||
|
||||
Notes:
|
||||
- The installer may ask you to set a root password. Do so.
|
||||
- If you prefer not setting root password and using only your user + sudo, say so and we can adjust.
|
||||
|
||||
After install:
|
||||
- `sudo reboot`
|
||||
|
||||
---
|
||||
|
||||
## F) First boot checklist (post-install)
|
||||
|
||||
1) Connect to Wi-Fi:
|
||||
- `nmtui` (recommended)
|
||||
- Connect to SSID: "Aussie Broadband 8729"
|
||||
|
||||
2) Verify static IP:
|
||||
- `ip a show wlp4s2`
|
||||
If it got DHCP, force one reconnect:
|
||||
- `nmcli networking off; nmcli networking on`
|
||||
or:
|
||||
- `nmcli connection down "<connection name>"; nmcli connection up "<connection name>"`
|
||||
|
||||
3) Verify SSH works (from another machine):
|
||||
- `ssh sam@192.168.20.27`
|
||||
|
||||
4) Verify /data mounted (this is for your storage drive and for accessing the config repo if you keep it there):
|
||||
- `mount | grep ' /data '`
|
||||
|
||||
5) Put dotfiles onto the system at ~/dotfiles
|
||||
|
||||
Option A (recommended): clone dotfiles repo:
|
||||
- `git clone <your-dotfiles-repo-url> ~/dotfiles`
|
||||
|
||||
Option B: copy from Integral300 if they currently only live there:
|
||||
- `cp -a /data/home_sam_ubuntu/dotfiles ~/dotfiles`
|
||||
|
||||
6) Verify dotfiles exist:
|
||||
- `ls -la ~/dotfiles`
|
||||
|
||||
---
|
||||
|
||||
## G) After install: commit the new hardware-configuration.nix
|
||||
Back on your running system (or from Ubuntu before wiping, if you mounted and copied it there):
|
||||
- `cd /data/nixos-config` (or wherever your repo is)
|
||||
- `git status`
|
||||
- `git add hosts/sam-4screen-desktop/hardware-configuration.nix`
|
||||
- `git commit -m "feat: add generated hardware-configuration for sam-4screen-desktop"`
|
||||
- `git push`
|
||||
@@ -1,99 +0,0 @@
|
||||
# NixOS Build Spec (sam-4screen-desktop)
|
||||
|
||||
## Disk / Boot (WIPE ENTIRE NVMe DISK)
|
||||
|
||||
Target disk: /dev/nvme0n1
|
||||
- Size: 953.87 GiB (1024209543168 bytes), 2000409264 sectors
|
||||
- Model: PM951 NVMe SAMSUNG 1024GB
|
||||
- NVMe serial: S2FZNXAH301424
|
||||
- NVMe WWID: nvme.144d-2020202020205332465a4e584148333031343234-504d393531204e564d652053414d53554e4720313032344742-00000001
|
||||
- Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
|
||||
DECISION (CONFIRMED):
|
||||
- Do NOT keep Windows.
|
||||
- Wipe the entire /dev/nvme0n1 (all existing partitions will be deleted/overwritten).
|
||||
|
||||
Installer safety:
|
||||
- Install target is NVMe only. Do not select /dev/sdX devices in the installer.
|
||||
- Device names like /dev/sdb, /dev/sdc can change across boots; always rely on UUID/label when mounting non-target disks.
|
||||
|
||||
Verification commands (run before wiping, if you want one last check):
|
||||
- `lsblk -o NAME,SIZE,TYPE,FSTYPE,LABEL,UUID,MOUNTPOINTS`
|
||||
- `sudo fdisk -l /dev/nvme0n1`
|
||||
|
||||
Boot method:
|
||||
- UEFI
|
||||
- Bootloader: systemd-boot
|
||||
|
||||
Filesystem / layout:
|
||||
- Root filesystem: Btrfs (with subvolumes)
|
||||
- Encryption: none
|
||||
- Swap: zram
|
||||
- Hibernate: no
|
||||
- /home: Btrfs subvolume
|
||||
|
||||
Partitioning approach:
|
||||
- Manual in the installer (no disko)
|
||||
|
||||
Recommended layout:
|
||||
- New GPT on /dev/nvme0n1
|
||||
- EFI System Partition (vfat), mounted at /boot
|
||||
- Btrfs partition for the rest
|
||||
- Subvolume @ mounted at /
|
||||
- Subvolume @home mounted at /home
|
||||
|
||||
IMPORTANT:
|
||||
- `hosts/sam-4screen-desktop/hardware-configuration.nix` is currently a placeholder.
|
||||
- During install after mounting to /mnt:
|
||||
1) Run: `nixos-generate-config --root /mnt`
|
||||
2) Copy: `/mnt/etc/nixos/hardware-configuration.nix` into:
|
||||
`hosts/sam-4screen-desktop/hardware-configuration.nix`
|
||||
|
||||
## Other attached disks (DO NOT FORMAT)
|
||||
- /dev/sda (240GB) model: Patriot Burst El (KEEP)
|
||||
- /dev/sda1: Microsoft reserved partition (~15MiB)
|
||||
- /dev/sda2: NTFS label "Back Up" (keep)
|
||||
- TempBackup (ext4) UUID=4f9c4bd5-fea5-408f-9370-731fc095da3f (~465GiB/500GB) (KEEP)
|
||||
- Model: WD5000BEVT-22ZAT
|
||||
- Serial: WD-WXNY08ND2684
|
||||
- NOTE: device name may appear as /dev/sdX depending on boot/USB order; identify by UUID/label/model.
|
||||
- Integral300 (ext4) UUID=27febd74-20aa-4a3a-92c1-6fdd1ad7e88e (~298GiB/320GB)
|
||||
- Mount at /data
|
||||
- NOTE: device name may change; config always uses /dev/disk/by-uuid.
|
||||
- XPSystemDrive (ext4) UUID=82c994f1-9adb-49e4-ba1e-5b6e5ccbd49b (~149GiB/160GB) (KEEP)
|
||||
- Model: HTS541616J9SA00 (Hitachi)
|
||||
- NOTE: device name may appear as /dev/sdX depending on boot/USB order; identify by UUID/label/model.
|
||||
|
||||
## Networking
|
||||
- Use NetworkManager
|
||||
|
||||
Static IPv4 policy (CONFIRMED):
|
||||
- Static IPv4 should be applied to Wi-Fi SSID:
|
||||
- SSID / connection id: "Aussie Broadband 8729"
|
||||
- Interface: wlp4s2
|
||||
- IP: 192.168.20.27/24
|
||||
- Gateway: 192.168.20.1
|
||||
- DNS: 192.168.20.35, 192.168.20.13
|
||||
- Wired enp0s31f6: no static IP required for now
|
||||
|
||||
Secrets policy:
|
||||
- Do not commit Wi-Fi PSKs to git.
|
||||
- Static IP enforcement is implemented via a NetworkManager dispatcher script.
|
||||
|
||||
## Data drive mount
|
||||
- Integral300 ext4 UUID=27febd74-20aa-4a3a-92c1-6fdd1ad7e88e
|
||||
- Mountpoint on NixOS: /data (preferred)
|
||||
|
||||
## Dotfiles policy
|
||||
- Dotfiles live on the installed system at: ~/dotfiles
|
||||
- Do not depend on /data for dotfiles.
|
||||
|
||||
## Desktop
|
||||
- Primary compositor: Niri
|
||||
- Display/login manager: greetd + tuigreet
|
||||
- Session start command: `niri --session` (do not use `niri-session`)
|
||||
- GPU: Intel HD 630 + NVIDIA Quadro P620
|
||||
- Display appears to be driven by NVIDIA Quadro P620 (observed `/dev/fb0` on Ubuntu scan). Treat NVIDIA as primary unless proven otherwise.
|
||||
|
||||
## Secrets policy
|
||||
- No API keys or WiFi PSKs committed to git
|
||||
@@ -1,184 +0,0 @@
|
||||
# Software Inventory (Source of Truth)
|
||||
|
||||
This document is the canonical software list for the NixOS migration.
|
||||
It consolidates prior notes and recon logs into a deduplicated plan.
|
||||
|
||||
Legend:
|
||||
- **NOW (Base boot / day-1)** = required for first successful NixOS boot and daily workflow basics
|
||||
- **SOON** = useful early, but not required to boot and log in
|
||||
- **LATER** = intentionally deferred until after a stable base system
|
||||
- **DEFER (Docker later)** = explicitly not installed on base system (will be deployed as containers later)
|
||||
|
||||
---
|
||||
|
||||
## 1) NOW (Base boot / day-1)
|
||||
|
||||
### Desktop / session (Wayland)
|
||||
- **niri** (primary compositor)
|
||||
- **greetd + tuigreet** (display/login manager)
|
||||
- **xwayland** (X11 compatibility where needed)
|
||||
- **xdg-desktop-portal** + **xdg-desktop-portal-gtk** + **xdg-desktop-portal-gnome** (portals baseline; improves screencast/screen share odds)
|
||||
- Clipboard:
|
||||
- **wl-clipboard**
|
||||
- Screenshots (Wayland):
|
||||
- **grim**
|
||||
- **slurp**
|
||||
|
||||
### Core system services
|
||||
- **NetworkManager**
|
||||
- Static IPv4 is enforced on Wi-Fi SSID: **"Aussie Broadband 8729"**
|
||||
- Interface: **wlp4s2**
|
||||
- IP: **192.168.20.27/24**
|
||||
- Gateway: **192.168.20.1**
|
||||
- DNS: **192.168.20.35**, **192.168.20.13**
|
||||
- Wired **enp0s31f6**: no static IP required for now (DHCP/unused)
|
||||
- **OpenSSH server** (sshd)
|
||||
- **PipeWire audio** (Pulse + ALSA) + **WirePlumber**
|
||||
- **Firewall** (NixOS default; open SSH port only)
|
||||
|
||||
### Terminal / shell
|
||||
- **kitty**
|
||||
- **zsh**
|
||||
- **oh-my-zsh**
|
||||
- **powerlevel10k**
|
||||
- Integrations enabled:
|
||||
- **atuin**
|
||||
- **fzf**
|
||||
- **zoxide**
|
||||
|
||||
### Core CLI tools (daily essentials)
|
||||
- **git**
|
||||
- **neovim**
|
||||
- Search/file tools:
|
||||
- **ripgrep (rg)**
|
||||
- **fd**
|
||||
- Modern replacements:
|
||||
- **bat**
|
||||
- **eza**
|
||||
- Convenience:
|
||||
- **curl**
|
||||
- **wget**
|
||||
|
||||
---
|
||||
|
||||
## 2) SOON (after base boot is stable)
|
||||
|
||||
These are commonly used, easy wins, but not required for “first login”.
|
||||
|
||||
### Dev tools
|
||||
- Compilers / build:
|
||||
- **gcc**
|
||||
- **gnumake**
|
||||
- **pkg-config**
|
||||
- Language toolchains (pick pinned versions later):
|
||||
- **nodejs**
|
||||
- **python3** (+ `python3Packages.pip` as needed)
|
||||
- **go**
|
||||
- Rust strategy: prefer **rustup** if you need toolchain flexibility, otherwise `rustc`/`cargo` from nixpkgs.
|
||||
|
||||
### CLI utilities commonly used in the previous setup
|
||||
- **jq**
|
||||
- **btop**
|
||||
- **lazygit**
|
||||
- **zellij**
|
||||
- **tealdeer (tldr)**
|
||||
- **navi**
|
||||
- **yazi**
|
||||
- **dua-cli (dua)**
|
||||
- **unzip / zip / p7zip**
|
||||
- Clipboard (X11 fallback / mixed):
|
||||
- **xclip** (optional; Wayland-first systems typically rely on `wl-clipboard`)
|
||||
|
||||
### Apps from Ubuntu recon (snap list) with Nix equivalents
|
||||
From `logs/04_nixos_recon.log` snap list:
|
||||
- `code` → **vscode** (unfree)
|
||||
- `firefox` → **firefox**
|
||||
- `thunderbird` → **thunderbird**
|
||||
- `telegram-desktop` → **telegram-desktop**
|
||||
- `spotify` → **spotify** (unfree)
|
||||
- `nushell` → **nushell**
|
||||
- `mqtt-explorer` → **mqtt-explorer** (verify availability in nixpkgs)
|
||||
- `notepad-plus-plus` → consider **notepadqq** or run via Wine (see “LATER”)
|
||||
|
||||
---
|
||||
|
||||
## 3) LATER (deliberately deferred until base is reliable)
|
||||
|
||||
### Desktop apps / optional GUI
|
||||
- **Google Chrome** (unfree) (install once graphics/session is stable)
|
||||
- **LibreOffice**
|
||||
- **VLC**
|
||||
- **Flameshot**
|
||||
- Note: Flameshot on Wayland can be quirky; ensure portals + permissions work first.
|
||||
- **Timeshift**
|
||||
- Note: NixOS typically prefers rollback/snapshots via filesystem tooling (e.g., Btrfs snapshots). Use only if you explicitly want it.
|
||||
|
||||
### Remote desktop / admin tools
|
||||
- **Tailscale** (client)
|
||||
- **RustDesk** (service/app)
|
||||
|
||||
### Networking / diagnostics tools (as needed)
|
||||
- **nmap**
|
||||
- **arp-scan / arpwatch**
|
||||
- **minicom / screen / cu**
|
||||
- **ethtool**
|
||||
- **tcpdump**
|
||||
|
||||
### Notepad++ situation
|
||||
- `notepad-plus-plus` snap existed on Ubuntu.
|
||||
- NixOS options:
|
||||
- **notepadqq** (native)
|
||||
- **Wine** route (more moving parts)
|
||||
- Keep this until the base system is stable.
|
||||
|
||||
---
|
||||
|
||||
## 4) DEFER (Docker later)
|
||||
|
||||
These are explicitly postponed and should NOT be part of the base NixOS install.
|
||||
|
||||
- **Apprise** — **DEFER (Docker later)**
|
||||
- **Obsidian** — **DEFER (Docker later)**
|
||||
|
||||
---
|
||||
|
||||
## 5) AI / Agentic stack (LATER; not part of base boot)
|
||||
|
||||
From `ai_dev_plan.md` and `software_to_add.md`, intentionally excluded from day-1:
|
||||
|
||||
- Orchestration / pipelines:
|
||||
- **Airflow**
|
||||
- **Windmill**
|
||||
- **Activepieces**
|
||||
- Prototyping:
|
||||
- **Flowise**
|
||||
- RAG / DB:
|
||||
- **Chroma**
|
||||
- Crawling:
|
||||
- **Selenium / Playwright**
|
||||
- **Firecrawl**
|
||||
- Agent frameworks:
|
||||
- **LangChain / LangGraph**
|
||||
- CLI AI tools:
|
||||
- **Aider**
|
||||
- **OpenCode**
|
||||
- **Gemini CLI**
|
||||
- **Goose / MCP tooling**
|
||||
- Model routing:
|
||||
- **OpenRouter**
|
||||
|
||||
Plan: bring these up later via Docker Compose on top of a stable NixOS base.
|
||||
|
||||
---
|
||||
|
||||
## 6) Notes / policies
|
||||
|
||||
### Secrets policy (hard requirement)
|
||||
- Do **not** commit API keys, tokens, WiFi PSKs, certificates, or private keys into git.
|
||||
- Prefer:
|
||||
- `~/.config/environment.d/*.conf` (local-only)
|
||||
- a secrets manager (e.g. **sops-nix**) once the base system is stable
|
||||
|
||||
### Graphics strategy note (pending confirmation)
|
||||
- Hardware includes Intel HD 630 + NVIDIA Quadro P620.
|
||||
- Final graphics configuration will depend on which GPU is actually driving the 4 monitors.
|
||||
48
flake.lock
generated
Normal file
48
flake.lock
generated
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"nodes": {
|
||||
"home-manager": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1770491427,
|
||||
"narHash": "sha256-8b+0vixdqGnIIcgsPhjdX7EGPdzcVQqYxF+ujjex654=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "cbd8a72e5fe6af19d40e2741dc440d9227836860",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1770197578,
|
||||
"narHash": "sha256-AYqlWrX09+HvGs8zM6ebZ1pwUqjkfpnv8mewYwAo+iM=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "00c21e4c93d963c50d4c0c89bfa84ed6e0694df2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"home-manager": "home-manager",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
description = "sam-4screen-desktop NixOS + Home Manager flake";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/release-24.05";
|
||||
url = "github:nix-community/home-manager";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
91
home/sam/bin/task-due-notify.sh
Executable file
91
home/sam/bin/task-due-notify.sh
Executable file
@@ -0,0 +1,91 @@
|
||||
#!/nix/store/x12lw455sq6qy2wcya85d7rb88ybc3df-bash-interactive-5.3p9/bin/bash
|
||||
|
||||
# Simple Taskwarrior Notification Script
|
||||
# Just checks: if time_until_due <= reminder_time, send notification
|
||||
|
||||
NTFY_URL="https://ntfy.lab.audasmedia.com.au/tasks"
|
||||
NOW=$(date -u +%s)
|
||||
|
||||
# Auto-add +notify to tasks with due dates or remind tags
|
||||
task status:pending '( due.any: or tags.has:remindMins or tags.has:remindHours or tags.has:remindDays or tags.has:remindWeeks or tags.has:remindMonths )' -notify export 2>/dev/null | \
|
||||
/nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.[].uuid' 2>/dev/null | \
|
||||
while read -r uuid; do
|
||||
/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" modify +notify 2>/dev/null
|
||||
done
|
||||
|
||||
# Process tasks with +notify
|
||||
task status:pending +notify export 2>/dev/null | \
|
||||
/nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -c '.[] | select(.due) | {uuid: .uuid, description: .description, due: .due, tags: .tags}' 2>/dev/null | \
|
||||
while read -r task_json; do
|
||||
|
||||
uuid=$(echo "$task_json" | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.uuid')
|
||||
desc=$(echo "$task_json" | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.description')
|
||||
due_date=$(echo "$task_json" | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.due')
|
||||
tags=$(echo "$task_json" | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.tags[]? // empty' 2>/dev/null)
|
||||
|
||||
# Convert due date (UTC) to epoch
|
||||
formatted_date=$(echo "$due_date" | /nix/store/ryz8kcrm2bxpccllfqlb7qldsfnqp5c2-gnused-4.9/bin/sed 's/T/ /; s/Z$//; s/^\(....\)\(..\)\(..\)/\1-\2-\3/; s/ \(..\)\(..\)\(..\)$/ \1:\2:\3/')
|
||||
due_epoch=$(/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin/date -d "$formatted_date UTC" +%s 2>/dev/null || echo 0)
|
||||
|
||||
if [ "$due_epoch" = "0" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
time_until_due=$((due_epoch - NOW))
|
||||
|
||||
# Check reminder tags
|
||||
echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep -E '^remind(Mins|Hours|Days|Weeks|Months)' 2>/dev/null | \
|
||||
while read -r remind_tag; do
|
||||
|
||||
# Parse: remindMins2, remindHours1, etc
|
||||
if [[ "$remind_tag" =~ ^remind(Mins|Hours|Days|Weeks|Months)([0-9]+)$ ]]; then
|
||||
unit="${BASH_REMATCH[1]}"
|
||||
num="${BASH_REMATCH[2]}"
|
||||
|
||||
# Convert to seconds
|
||||
case "$unit" in
|
||||
Mins) remind_secs=$((num * 60)); time_str="$num minutes" ;;
|
||||
Hours) remind_secs=$((num * 3600)); time_str="$num hours" ;;
|
||||
Days) remind_secs=$((num * 86400)); time_str="$num days" ;;
|
||||
Weeks) remind_secs=$((num * 604800)); time_str="$num weeks" ;;
|
||||
Months) remind_secs=$((num * 2592000)); time_str="$num months" ;;
|
||||
esac
|
||||
|
||||
# SIMPLE: If time until due <= reminder time AND still in future, send it
|
||||
if [ $time_until_due -le $remind_secs ] && [ $time_until_due -gt 0 ]; then
|
||||
/nix/store/xgdl4gzjzwj7ixs83f17sqppd08lfd03-libnotify-0.8.7/bin/notify-send -u normal "Reminder" "🔔 $desc - Due in $time_str"
|
||||
/nix/store/jqfr3p49g3lch84y45jfzw9fshlv8jyp-curl-8.17.0-bin/bin/curl -s -d "Reminder: $desc - Due in $time_str" "$NTFY_URL" >/dev/null 2>&1 &
|
||||
/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" modify -"$remind_tag" 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Check if task is due (overdue)
|
||||
if [ $time_until_due -le 0 ] && ! echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep -q "^notified$"; then
|
||||
/nix/store/xgdl4gzjzwj7ixs83f17sqppd08lfd03-libnotify-0.8.7/bin/notify-send -u critical "Task Due" "⚠️ $desc"
|
||||
/nix/store/jqfr3p49g3lch84y45jfzw9fshlv8jyp-curl-8.17.0-bin/bin/curl -s -d "Task due: $desc" "$NTFY_URL" >/dev/null 2>&1 &
|
||||
/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" modify +notified 2>/dev/null
|
||||
fi
|
||||
done
|
||||
|
||||
# Cleanup: Remove notification tags from completed/deleted tasks
|
||||
task '( status:completed or status:deleted )' '( +notify or +notified or tags.has:remindMins or tags.has:remindHours or tags.has:remindDays or tags.has:remindWeeks or tags.has:remindMonths )' export 2>/dev/null | \
|
||||
/nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.[].uuid' 2>/dev/null | \
|
||||
while read -r uuid; do
|
||||
tags=$(/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" export 2>/dev/null | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.[0].tags[]? // empty' 2>/dev/null)
|
||||
|
||||
remove_args=""
|
||||
echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep -q "^notify$" && remove_args="$remove_args -notify"
|
||||
echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep -q "^notified$" && remove_args="$remove_args -notified"
|
||||
|
||||
remind_tags=$(echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep "^remind(Mins|Hours|Days|Weeks|Months)" 2>/dev/null || true)
|
||||
if [ -n "$remind_tags" ]; then
|
||||
while read -r tag; do
|
||||
remove_args="$remove_args -$tag"
|
||||
done <<< "$remind_tags"
|
||||
fi
|
||||
|
||||
if [ -n "$remove_args" ]; then
|
||||
/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" modify $remove_args 2>/dev/null
|
||||
fi
|
||||
done
|
||||
0
home/sam/config/apprise/apprise.yml
Normal file
0
home/sam/config/apprise/apprise.yml
Normal file
291
home/sam/config/atuin/config.toml
Normal file
291
home/sam/config/atuin/config.toml
Normal file
@@ -0,0 +1,291 @@
|
||||
## where to store your database, default is your system data directory
|
||||
## linux/mac: ~/.local/share/atuin/history.db
|
||||
## windows: %USERPROFILE%/.local/share/atuin/history.db
|
||||
# db_path = "~/.history.db"
|
||||
|
||||
## where to store your encryption key, default is your system data directory
|
||||
## linux/mac: ~/.local/share/atuin/key
|
||||
## windows: %USERPROFILE%/.local/share/atuin/key
|
||||
# key_path = "~/.key"
|
||||
|
||||
## where to store your auth session token, default is your system data directory
|
||||
## linux/mac: ~/.local/share/atuin/session
|
||||
## windows: %USERPROFILE%/.local/share/atuin/session
|
||||
# session_path = "~/.session"
|
||||
|
||||
## date format used, either "us" or "uk"
|
||||
# dialect = "us"
|
||||
|
||||
## default timezone to use when displaying time
|
||||
## either "l", "local" to use the system's current local timezone, or an offset
|
||||
## from UTC in the format of "<+|->H[H][:M[M][:S[S]]]"
|
||||
## for example: "+9", "-05", "+03:30", "-01:23:45", etc.
|
||||
# timezone = "local"
|
||||
|
||||
## enable or disable automatic sync
|
||||
# auto_sync = true
|
||||
|
||||
## enable or disable automatic update checks
|
||||
# update_check = true
|
||||
|
||||
## address of the sync server
|
||||
# sync_address = "https://api.atuin.sh"
|
||||
|
||||
## how often to sync history. note that this is only triggered when a command
|
||||
## is ran, so sync intervals may well be longer
|
||||
## set it to 0 to sync after every command
|
||||
# sync_frequency = "10m"
|
||||
|
||||
## which search mode to use
|
||||
## possible values: prefix, fulltext, fuzzy, skim
|
||||
# search_mode = "fuzzy"
|
||||
|
||||
## which filter mode to use by default
|
||||
## possible values: "global", "host", "session", "session-preload", "directory", "workspace"
|
||||
## consider using search.filters to customize the enablement and order of filter modes
|
||||
# filter_mode = "global"
|
||||
|
||||
## With workspace filtering enabled, Atuin will filter for commands executed
|
||||
## in any directory within a git repository tree (default: false).
|
||||
##
|
||||
## To use workspace mode by default when available, set this to true and
|
||||
## set filter_mode to "workspace" or leave it unspecified and
|
||||
## set search.filters to include "workspace" before other filter modes.
|
||||
# workspaces = false
|
||||
|
||||
## which filter mode to use when atuin is invoked from a shell up-key binding
|
||||
## the accepted values are identical to those of "filter_mode"
|
||||
## leave unspecified to use same mode set in "filter_mode"
|
||||
# filter_mode_shell_up_key_binding = "global"
|
||||
|
||||
## which search mode to use when atuin is invoked from a shell up-key binding
|
||||
## the accepted values are identical to those of "search_mode"
|
||||
## leave unspecified to use same mode set in "search_mode"
|
||||
# search_mode_shell_up_key_binding = "fuzzy"
|
||||
|
||||
## which style to use
|
||||
## possible values: auto, full, compact
|
||||
# style = "auto"
|
||||
|
||||
## the maximum number of lines the interface should take up
|
||||
## set it to 0 to always go full screen
|
||||
# inline_height = 0
|
||||
|
||||
## the maximum number of lines the interface should take up
|
||||
## when atuin is invoked from a shell up-key binding
|
||||
## the accepted values are identical to those of "inline_height"
|
||||
# inline_height_shell_up_key_binding = 0
|
||||
|
||||
## Invert the UI - put the search bar at the top , Default to `false`
|
||||
# invert = false
|
||||
|
||||
## enable or disable showing a preview of the selected command
|
||||
## useful when the command is longer than the terminal width and is cut off
|
||||
# show_preview = true
|
||||
|
||||
## what to do when the escape key is pressed when searching
|
||||
## possible values: return-original, return-query
|
||||
# exit_mode = "return-original"
|
||||
|
||||
## possible values: emacs, subl
|
||||
# word_jump_mode = "emacs"
|
||||
|
||||
## characters that count as a part of a word
|
||||
# word_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
|
||||
## number of context lines to show when scrolling by pages
|
||||
# scroll_context_lines = 1
|
||||
|
||||
## use ctrl instead of alt as the shortcut modifier key for numerical UI shortcuts
|
||||
## alt-0 .. alt-9
|
||||
# ctrl_n_shortcuts = false
|
||||
|
||||
## Show numeric shortcuts (1..9) beside list items in the TUI
|
||||
## set to false to hide the moving numbers if you find them distracting
|
||||
# show_numeric_shortcuts = true
|
||||
|
||||
## default history list format - can also be specified with the --format arg
|
||||
# history_format = "{time}\t{command}\t{duration}"
|
||||
|
||||
## prevent commands matching any of these regexes from being written to history.
|
||||
## Note that these regular expressions are unanchored, i.e. if they don't start
|
||||
## with ^ or end with $, they'll match anywhere in the command.
|
||||
## For details on the supported regular expression syntax, see
|
||||
## https://docs.rs/regex/latest/regex/#syntax
|
||||
# history_filter = [
|
||||
# "^secret-cmd",
|
||||
# "^innocuous-cmd .*--secret=.+",
|
||||
# ]
|
||||
|
||||
## prevent commands run with cwd matching any of these regexes from being written
|
||||
## to history. Note that these regular expressions are unanchored, i.e. if they don't
|
||||
## start with ^ or end with $, they'll match anywhere in CWD.
|
||||
## For details on the supported regular expression syntax, see
|
||||
## https://docs.rs/regex/latest/regex/#syntax
|
||||
# cwd_filter = [
|
||||
# "^/very/secret/area",
|
||||
# ]
|
||||
|
||||
## Configure the maximum height of the preview to show.
|
||||
## Useful when you have long scripts in your history that you want to distinguish
|
||||
## by more than the first few lines.
|
||||
# max_preview_height = 4
|
||||
|
||||
## Configure whether or not to show the help row, which includes the current Atuin
|
||||
## version (and whether an update is available), a keymap hint, and the total
|
||||
## amount of commands in your history.
|
||||
# show_help = true
|
||||
|
||||
## Configure whether or not to show tabs for search and inspect
|
||||
# show_tabs = true
|
||||
|
||||
## Configure whether or not the tabs row may be auto-hidden, which includes the current Atuin
|
||||
## tab, such as Search or Inspector, and other tabs you may wish to see. This will
|
||||
## only be hidden if there are fewer than this count of lines available, and does not affect the use
|
||||
## of keyboard shortcuts to switch tab. 0 to never auto-hide, default is 8 (lines).
|
||||
## This is ignored except in `compact` mode.
|
||||
# auto_hide_height = 8
|
||||
|
||||
## Defaults to true. This matches history against a set of default regex, and will not save it if we get a match. Defaults include
|
||||
## 1. AWS key id
|
||||
## 2. Github pat (old and new)
|
||||
## 3. Slack oauth tokens (bot, user)
|
||||
## 4. Slack webhooks
|
||||
## 5. Stripe live/test keys
|
||||
# secrets_filter = true
|
||||
|
||||
## Defaults to true. If enabled, upon hitting enter Atuin will immediately execute the command,
|
||||
## whereas tab will put the command in the prompt for editing.
|
||||
## If set to false, both enter and tab will place the command in the prompt for editing.
|
||||
## This applies for new installs. Old installs will keep the old behaviour unless configured otherwise.
|
||||
enter_accept = true
|
||||
|
||||
## Defaults to false. If enabled, when triggered after &&, || or |, Atuin will complete commands to chain rather than replace the current line.
|
||||
# command_chaining = false
|
||||
|
||||
## Defaults to "emacs". This specifies the keymap on the startup of `atuin
|
||||
## search`. If this is set to "auto", the startup keymap mode in the Atuin
|
||||
## search is automatically selected based on the shell's keymap where the
|
||||
## keybinding is defined. If this is set to "emacs", "vim-insert", or
|
||||
## "vim-normal", the startup keymap mode in the Atuin search is forced to be
|
||||
## the specified one.
|
||||
# keymap_mode = "auto"
|
||||
|
||||
## Cursor style in each keymap mode. If specified, the cursor style is changed
|
||||
## in entering the cursor shape. Available values are "default" and
|
||||
## "{blink,steady}-{block,underline,bar}".
|
||||
# keymap_cursor = { emacs = "blink-block", vim_insert = "blink-block", vim_normal = "steady-block" }
|
||||
|
||||
# network_connect_timeout = 5
|
||||
# network_timeout = 5
|
||||
|
||||
## Timeout (in seconds) for acquiring a local database connection (sqlite)
|
||||
# local_timeout = 5
|
||||
|
||||
## Set this to true and Atuin will minimize motion in the UI - timers will not update live, etc.
|
||||
## Alternatively, set env NO_MOTION=true
|
||||
# prefers_reduced_motion = false
|
||||
|
||||
[stats]
|
||||
## Set commands where we should consider the subcommand for statistics. Eg, kubectl get vs just kubectl
|
||||
# common_subcommands = [
|
||||
# "apt",
|
||||
# "cargo",
|
||||
# "composer",
|
||||
# "dnf",
|
||||
# "docker",
|
||||
# "dotnet",
|
||||
# "git",
|
||||
# "go",
|
||||
# "ip",
|
||||
# "jj",
|
||||
# "kubectl",
|
||||
# "nix",
|
||||
# "nmcli",
|
||||
# "npm",
|
||||
# "pecl",
|
||||
# "pnpm",
|
||||
# "podman",
|
||||
# "port",
|
||||
# "systemctl",
|
||||
# "tmux",
|
||||
# "yarn",
|
||||
# ]
|
||||
|
||||
## Set commands that should be totally stripped and ignored from stats
|
||||
# common_prefix = ["sudo"]
|
||||
|
||||
## Set commands that will be completely ignored from stats
|
||||
# ignored_commands = [
|
||||
# "cd",
|
||||
# "ls",
|
||||
# "vi"
|
||||
# ]
|
||||
|
||||
[keys]
|
||||
# Defaults to true. If disabled, using the up/down key won't exit the TUI when scrolled past the first/last entry.
|
||||
# scroll_exits = true
|
||||
# Defaults to true. The left arrow key will exit the TUI when scrolling before the first character
|
||||
# exit_past_line_start = true
|
||||
# Defaults to true. The right arrow key performs the same functionality as Tab and copies the selected line to the command line to be modified.
|
||||
# accept_past_line_end = true
|
||||
# Defaults to false. The left arrow key performs the same functionality as Tab and copies the selected line to the command line to be modified.
|
||||
# accept_past_line_start = false
|
||||
# Defaults to false. The backspace key performs the same functionality as Tab and copies the selected line to the command line to be modified when at the start of the line.
|
||||
# accept_with_backspace = false
|
||||
|
||||
[sync]
|
||||
# Enable sync v2 by default
|
||||
# This ensures that sync v2 is enabled for new installs only
|
||||
# In a later release it will become the default across the board
|
||||
records = true
|
||||
|
||||
[preview]
|
||||
## which preview strategy to use to calculate the preview height (respects max_preview_height).
|
||||
## possible values: auto, static
|
||||
## auto: length of the selected command.
|
||||
## static: length of the longest command stored in the history.
|
||||
## fixed: use max_preview_height as fixed height.
|
||||
# strategy = "auto"
|
||||
|
||||
[daemon]
|
||||
## Enables using the daemon to sync. Requires the daemon to be running in the background. Start it with `atuin daemon`
|
||||
# enabled = false
|
||||
|
||||
## How often the daemon should sync in seconds
|
||||
# sync_frequency = 300
|
||||
|
||||
## The path to the unix socket used by the daemon (on unix systems)
|
||||
## linux/mac: ~/.local/share/atuin/atuin.sock
|
||||
## windows: Not Supported
|
||||
# socket_path = "~/.local/share/atuin/atuin.sock"
|
||||
|
||||
## Use systemd socket activation rather than opening the given path (the path must still be correct for the client)
|
||||
## linux: false
|
||||
## mac/windows: Not Supported
|
||||
# systemd_socket = false
|
||||
|
||||
## The port that should be used for TCP on non unix systems
|
||||
# tcp_port = 8889
|
||||
|
||||
# [theme]
|
||||
## Color theme to use for rendering in the terminal.
|
||||
## There are some built-in themes, including the base theme ("default"),
|
||||
## "autumn" and "marine". You can add your own themes to the "./themes" subdirectory of your
|
||||
## Atuin config (or ATUIN_THEME_DIR, if provided) as TOML files whose keys should be one or
|
||||
## more of AlertInfo, AlertWarn, AlertError, Annotation, Base, Guidance, Important, and
|
||||
## the string values as lowercase entries from this list:
|
||||
## https://ogeon.github.io/docs/palette/master/palette/named/index.html
|
||||
## If you provide a custom theme file, it should be called "NAME.toml" and the theme below
|
||||
## should be the stem, i.e. `theme = "NAME"` for your chosen NAME.
|
||||
# name = "autumn"
|
||||
|
||||
## Whether the theme manager should output normal or extra information to help fix themes.
|
||||
## Boolean, true or false. If unset, left up to the theme manager.
|
||||
# debug = true
|
||||
|
||||
[search]
|
||||
## The list of enabled filter modes, in order of priority.
|
||||
## The "workspace" mode is skipped when not in a workspace or workspaces = false.
|
||||
## Default filter mode can be overridden with the filter_mode setting.
|
||||
# filters = [ "global", "host", "session", "session-preload", "workspace", "directory" ]
|
||||
245
home/sam/config/btop/btop.conf
Executable file
245
home/sam/config/btop/btop.conf
Executable file
@@ -0,0 +1,245 @@
|
||||
#? Config file for btop v. 1.3.0
|
||||
|
||||
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
|
||||
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
|
||||
color_theme = "Default"
|
||||
|
||||
#* If the theme set background should be shown, set to False if you want terminal background transparency.
|
||||
theme_background = True
|
||||
|
||||
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
|
||||
truecolor = True
|
||||
|
||||
#* Set to true to force tty mode regardless if a real tty has been detected or not.
|
||||
#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
|
||||
force_tty = False
|
||||
|
||||
#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
|
||||
#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
|
||||
#* Use whitespace " " as separator between different presets.
|
||||
#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty"
|
||||
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty"
|
||||
|
||||
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
|
||||
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
|
||||
vim_keys = False
|
||||
|
||||
#* Rounded corners on boxes, is ignored if TTY mode is ON.
|
||||
rounded_corners = True
|
||||
|
||||
#* Default symbols to use for graph creation, "braille", "block" or "tty".
|
||||
#* "braille" offers the highest resolution but might not be included in all fonts.
|
||||
#* "block" has half the resolution of braille but uses more common characters.
|
||||
#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY.
|
||||
#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view.
|
||||
graph_symbol = "braille"
|
||||
|
||||
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
|
||||
graph_symbol_cpu = "default"
|
||||
|
||||
# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty".
|
||||
graph_symbol_gpu = "default"
|
||||
|
||||
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
|
||||
graph_symbol_mem = "default"
|
||||
|
||||
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
|
||||
graph_symbol_net = "default"
|
||||
|
||||
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
|
||||
graph_symbol_proc = "default"
|
||||
|
||||
#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace.
|
||||
shown_boxes = "cpu mem net proc"
|
||||
|
||||
#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
|
||||
update_ms = 2000
|
||||
|
||||
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
|
||||
#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
|
||||
proc_sorting = "cpu lazy"
|
||||
|
||||
#* Reverse sorting order, True or False.
|
||||
proc_reversed = False
|
||||
|
||||
#* Show processes as a tree.
|
||||
proc_tree = False
|
||||
|
||||
#* Use the cpu graph colors in the process list.
|
||||
proc_colors = True
|
||||
|
||||
#* Use a darkening gradient in the process list.
|
||||
proc_gradient = True
|
||||
|
||||
#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
|
||||
proc_per_core = False
|
||||
|
||||
#* Show process memory as bytes instead of percent.
|
||||
proc_mem_bytes = True
|
||||
|
||||
#* Show cpu graph for each process.
|
||||
proc_cpu_graphs = True
|
||||
|
||||
#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
|
||||
proc_info_smaps = False
|
||||
|
||||
#* Show proc box on left side of screen instead of right.
|
||||
proc_left = False
|
||||
|
||||
#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
|
||||
proc_filter_kernel = False
|
||||
|
||||
#* In tree-view, always accumulate child process resources in the parent process.
|
||||
proc_aggregate = False
|
||||
|
||||
#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
|
||||
#* Select from a list of detected attributes from the options menu.
|
||||
cpu_graph_upper = "Auto"
|
||||
|
||||
#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available.
|
||||
#* Select from a list of detected attributes from the options menu.
|
||||
cpu_graph_lower = "Auto"
|
||||
|
||||
#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off".
|
||||
show_gpu_info = "Auto"
|
||||
|
||||
#* Toggles if the lower CPU graph should be inverted.
|
||||
cpu_invert_lower = True
|
||||
|
||||
#* Set to True to completely disable the lower CPU graph.
|
||||
cpu_single_graph = False
|
||||
|
||||
#* Show cpu box at bottom of screen instead of top.
|
||||
cpu_bottom = False
|
||||
|
||||
#* Shows the system uptime in the CPU box.
|
||||
show_uptime = True
|
||||
|
||||
#* Show cpu temperature.
|
||||
check_temp = True
|
||||
|
||||
#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
|
||||
cpu_sensor = "Auto"
|
||||
|
||||
#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
|
||||
show_coretemp = True
|
||||
|
||||
#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
|
||||
#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
|
||||
#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.
|
||||
#* Example: "4:0 5:1 6:3"
|
||||
cpu_core_map = ""
|
||||
|
||||
#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine".
|
||||
temp_scale = "celsius"
|
||||
|
||||
#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
|
||||
base_10_sizes = False
|
||||
|
||||
#* Show CPU frequency.
|
||||
show_cpu_freq = True
|
||||
|
||||
#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
|
||||
#* Special formatting: /host = hostname | /user = username | /uptime = system uptime
|
||||
clock_format = "%X"
|
||||
|
||||
#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
|
||||
background_update = True
|
||||
|
||||
#* Custom cpu model name, empty string to disable.
|
||||
custom_cpu_name = ""
|
||||
|
||||
#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
|
||||
#* Begin line with "exclude=" to change to exclude filter, otherwise defaults to "most include" filter. Example: disks_filter="exclude=/boot /home/user".
|
||||
disks_filter = ""
|
||||
|
||||
#* Show graphs instead of meters for memory values.
|
||||
mem_graphs = True
|
||||
|
||||
#* Show mem box below net box instead of above.
|
||||
mem_below_net = False
|
||||
|
||||
#* Count ZFS ARC in cached and available memory.
|
||||
zfs_arc_cached = True
|
||||
|
||||
#* If swap memory should be shown in memory box.
|
||||
show_swap = True
|
||||
|
||||
#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
|
||||
swap_disk = True
|
||||
|
||||
#* If mem box should be split to also show disks info.
|
||||
show_disks = True
|
||||
|
||||
#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
|
||||
only_physical = True
|
||||
|
||||
#* Read disks list from /etc/fstab. This also disables only_physical.
|
||||
use_fstab = True
|
||||
|
||||
#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
|
||||
zfs_hide_datasets = False
|
||||
|
||||
#* Set to true to show available disk space for privileged users.
|
||||
disk_free_priv = False
|
||||
|
||||
#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
|
||||
show_io_stat = True
|
||||
|
||||
#* Toggles io mode for disks, showing big graphs for disk read/write speeds.
|
||||
io_mode = False
|
||||
|
||||
#* Set to True to show combined read/write io graphs in io mode.
|
||||
io_graph_combined = False
|
||||
|
||||
#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
|
||||
#* Example: "/mnt/media:100 /:20 /boot:1".
|
||||
io_graph_speeds = ""
|
||||
|
||||
#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
|
||||
net_download = 100
|
||||
|
||||
net_upload = 100
|
||||
|
||||
#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
|
||||
net_auto = True
|
||||
|
||||
#* Sync the auto scaling for download and upload to whichever currently has the highest scale.
|
||||
net_sync = True
|
||||
|
||||
#* Starts with the Network Interface specified here.
|
||||
net_iface = ""
|
||||
|
||||
#* Show battery stats in top right if battery is present.
|
||||
show_battery = True
|
||||
|
||||
#* Which battery to use if multiple are present. "Auto" for auto detection.
|
||||
selected_battery = "Auto"
|
||||
|
||||
#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
|
||||
#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
|
||||
log_level = "WARNING"
|
||||
|
||||
#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
|
||||
nvml_measure_pcie_speeds = True
|
||||
|
||||
#* Horizontally mirror the GPU graph.
|
||||
gpu_mirror_graph = True
|
||||
|
||||
#* Custom gpu0 model name, empty string to disable.
|
||||
custom_gpu_name0 = ""
|
||||
|
||||
#* Custom gpu1 model name, empty string to disable.
|
||||
custom_gpu_name1 = ""
|
||||
|
||||
#* Custom gpu2 model name, empty string to disable.
|
||||
custom_gpu_name2 = ""
|
||||
|
||||
#* Custom gpu3 model name, empty string to disable.
|
||||
custom_gpu_name3 = ""
|
||||
|
||||
#* Custom gpu4 model name, empty string to disable.
|
||||
custom_gpu_name4 = ""
|
||||
|
||||
#* Custom gpu5 model name, empty string to disable.
|
||||
custom_gpu_name5 = ""
|
||||
24
home/sam/config/btop/btop.log
Executable file
24
home/sam/config/btop/btop.log
Executable file
@@ -0,0 +1,24 @@
|
||||
|
||||
2025/10/05 (20:52:23) | ===> btop++ v.1.3.0
|
||||
2025/10/05 (20:52:23) | WARNING: NVML: Failed to get maximum GPU power draw, defaulting to 225W: Not Supported
|
||||
2025/10/05 (20:52:23) | WARNING: NVML: Failed to get GPU power usage: Not Supported
|
||||
|
||||
2025/10/06 (10:14:42) | ===> btop++ v.1.3.0
|
||||
2025/10/06 (10:14:42) | WARNING: NVML: Failed to get maximum GPU power draw, defaulting to 225W: Not Supported
|
||||
2025/10/06 (10:14:42) | WARNING: NVML: Failed to get GPU power usage: Not Supported
|
||||
|
||||
2025/10/06 (19:34:16) | ===> btop++ v.1.3.0
|
||||
2025/10/06 (19:34:16) | WARNING: NVML: Failed to get maximum GPU power draw, defaulting to 225W: Not Supported
|
||||
2025/10/06 (19:34:16) | WARNING: NVML: Failed to get GPU power usage: Not Supported
|
||||
|
||||
2025/10/12 (15:41:03) | ===> btop++ v.1.3.0
|
||||
2025/10/12 (15:41:03) | WARNING: NVML: Failed to get maximum GPU power draw, defaulting to 225W: Not Supported
|
||||
2025/10/12 (15:41:03) | WARNING: NVML: Failed to get GPU power usage: Not Supported
|
||||
|
||||
2025/11/22 (19:22:08) | ===> btop++ v.1.3.0
|
||||
2025/11/22 (19:22:08) | WARNING: NVML: Failed to get maximum GPU power draw, defaulting to 225W: Not Supported
|
||||
2025/11/22 (19:22:08) | WARNING: NVML: Failed to get GPU power usage: Not Supported
|
||||
|
||||
2025/12/12 (21:29:18) | ===> btop++ v.1.3.0
|
||||
2025/12/12 (21:29:18) | WARNING: NVML: Failed to get maximum GPU power draw, defaulting to 225W: Not Supported
|
||||
2025/12/12 (21:29:18) | WARNING: NVML: Failed to get GPU power usage: Not Supported
|
||||
27
home/sam/config/gh/config.yml
Executable file
27
home/sam/config/gh/config.yml
Executable file
@@ -0,0 +1,27 @@
|
||||
# The current version of the config schema
|
||||
version: 1
|
||||
# What protocol to use when performing git operations. Supported values: ssh, https
|
||||
git_protocol: https
|
||||
# What editor gh should run when creating issues, pull requests, etc. If blank, will refer to environment.
|
||||
editor:
|
||||
# When to interactively prompt. This is a global config that cannot be overridden by hostname. Supported values: enabled, disabled
|
||||
prompt: enabled
|
||||
# Preference for editor-based interactive prompting. This is a global config that cannot be overridden by hostname. Supported values: enabled, disabled
|
||||
prefer_editor_prompt: disabled
|
||||
# A pager program to send command output to, e.g. "less". If blank, will refer to environment. Set the value to "cat" to disable the pager.
|
||||
pager:
|
||||
# Aliases allow you to create nicknames for gh commands
|
||||
aliases:
|
||||
co: pr checkout
|
||||
# The path to a unix socket through which to send HTTP connections. If blank, HTTP traffic will be handled by net/http.DefaultTransport.
|
||||
http_unix_socket:
|
||||
# What web browser gh should use when opening URLs. If blank, will refer to environment.
|
||||
browser:
|
||||
# Whether to display labels using their RGB hex color codes in terminals that support truecolor. Supported values: enabled, disabled
|
||||
color_labels: disabled
|
||||
# Whether customizable, 4-bit accessible colors should be used. Supported values: enabled, disabled
|
||||
accessible_colors: disabled
|
||||
# Whether an accessible prompter should be used. Supported values: enabled, disabled
|
||||
accessible_prompter: disabled
|
||||
# Whether to use a animated spinner as a progress indicator. If disabled, a textual progress indicator is used instead. Supported values: enabled, disabled
|
||||
spinner: enabled
|
||||
5
home/sam/config/gh/hosts.yml
Executable file
5
home/sam/config/gh/hosts.yml
Executable file
@@ -0,0 +1,5 @@
|
||||
github.com:
|
||||
git_protocol: ssh
|
||||
users:
|
||||
audas:
|
||||
user: audas
|
||||
1
home/sam/config/kitty/kitty.conf
Symbolic link
1
home/sam/config/kitty/kitty.conf
Symbolic link
@@ -0,0 +1 @@
|
||||
/nix/store/gc99q91ai15df90fy326gh4ddjhfbbc5-home-manager-files/.config/kitty/kitty.conf
|
||||
0
home/sam/config/lazygit/config.yml
Executable file
0
home/sam/config/lazygit/config.yml
Executable file
760
home/sam/config/niri/config.kdl
Normal file
760
home/sam/config/niri/config.kdl
Normal file
@@ -0,0 +1,760 @@
|
||||
// This config is in the KDL format: https://kdl.dev
|
||||
// "/-" comments out the following node.
|
||||
// Check the wiki for a full description of the configuration:
|
||||
// https://yalter.github.io/niri/Configuration:-Introduction
|
||||
|
||||
// Input device configuration.
|
||||
// Find the full list of options on the wiki:
|
||||
// https://yalter.github.io/niri/Configuration:-Input
|
||||
input {
|
||||
keyboard {
|
||||
xkb {
|
||||
// You can set rules, model, layout, variant and options.
|
||||
// For more information, see xkeyboard-config(7).
|
||||
|
||||
// For example:
|
||||
// layout "us,ru"
|
||||
// options "grp:win_space_toggle,compose:ralt,ctrl:nocaps"
|
||||
|
||||
// If this section is empty, niri will fetch xkb settings
|
||||
// from org.freedesktop.locale1. You can control these using
|
||||
// localectl set-x11-keymap.
|
||||
}
|
||||
|
||||
// Enable numlock on startup, omitting this setting disables it.
|
||||
numlock
|
||||
}
|
||||
|
||||
// Next sections include libinput settings.
|
||||
// Omitting settings disables them, or leaves them at their default values.
|
||||
// All commented-out settings here are examples, not defaults.
|
||||
touchpad {
|
||||
// off
|
||||
tap
|
||||
// dwt
|
||||
// dwtp
|
||||
// drag false
|
||||
// drag-lock
|
||||
natural-scroll
|
||||
// accel-speed 0.2
|
||||
// accel-profile "flat"
|
||||
// scroll-method "two-finger"
|
||||
// disabled-on-external-mouse
|
||||
}
|
||||
|
||||
mouse {
|
||||
// off
|
||||
// natural-scroll
|
||||
// accel-speed 0.2
|
||||
// accel-profile "flat"
|
||||
// scroll-method "no-scroll"
|
||||
}
|
||||
|
||||
trackpoint {
|
||||
// off
|
||||
// natural-scroll
|
||||
// accel-speed 0.2
|
||||
// accel-profile "flat"
|
||||
// scroll-method "on-button-down"
|
||||
// scroll-button 273
|
||||
// scroll-button-lock
|
||||
// middle-emulation
|
||||
}
|
||||
|
||||
// Uncomment this to make the mouse warp to the center of newly focused windows.
|
||||
// warp-mouse-to-focus
|
||||
|
||||
// Focus windows and outputs automatically when moving the mouse into them.
|
||||
// Setting max-scroll-amount="0%" makes it work only on windows already fully on screen.
|
||||
// focus-follows-mouse max-scroll-amount="0%"
|
||||
}
|
||||
|
||||
// You can configure outputs by their name, which you can find
|
||||
// by running `niri msg outputs` while inside a niri instance.
|
||||
// The built-in laptop monitor is usually called "eDP-1".
|
||||
// Find more information on the wiki:
|
||||
// https://yalter.github.io/niri/Configuration:-Outputs
|
||||
// Remember to uncomment the node by removing "/-"!
|
||||
|
||||
// input {
|
||||
// "*" allow
|
||||
// }
|
||||
// output {
|
||||
// "*" allow
|
||||
// }
|
||||
|
||||
|
||||
environment {
|
||||
MOZ_DBUS_REMOTE "1"
|
||||
}
|
||||
|
||||
output "DP-6" { mode "1680x1050@60"; position x=0 y=230; }
|
||||
output "DP-7" { mode "1680x1050@60"; position x=1680 y=0; transform "90"; }
|
||||
output "DP-4" { mode "1680x1050@60"; position x=2730 y=230; }
|
||||
output "DP-5" { mode "1680x1050@60"; position x=4410 y=0; transform "90";}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Find more information on the wiki:
|
||||
// https://yalter.github.io/niri/Configuration:-Layout
|
||||
layout {
|
||||
// Set gaps around windows in logical pixels.
|
||||
gaps 16
|
||||
|
||||
// When to center a column when changing focus, options are:
|
||||
// - "never", default behavior, focusing an off-screen column will keep at the left
|
||||
// or right edge of the screen.
|
||||
// - "always", the focused column will always be centered.
|
||||
// - "on-overflow", focusing a column will center it if it doesn't fit
|
||||
// together with the previously focused column.
|
||||
center-focused-column "never"
|
||||
|
||||
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
|
||||
preset-column-widths {
|
||||
// Proportion sets the width as a fraction of the output width, taking gaps into account.
|
||||
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
|
||||
// The default preset widths are 1/3, 1/2 and 2/3 of the output.
|
||||
proportion 0.33333
|
||||
proportion 0.5
|
||||
proportion 0.66667
|
||||
|
||||
// Fixed sets the width in logical pixels exactly.
|
||||
// fixed 1920
|
||||
}
|
||||
|
||||
// You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
|
||||
// preset-window-heights { }
|
||||
|
||||
// You can change the default width of the new windows.
|
||||
default-column-width { proportion 1.0; }
|
||||
// If you leave the brackets empty, the windows themselves will decide their initial width.
|
||||
// default-column-width {}
|
||||
|
||||
// By default focus ring and border are rendered as a solid background rectangle
|
||||
// behind windows. That is, they will show up through semitransparent windows.
|
||||
// This is because windows using client-side decorations can have an arbitrary shape.
|
||||
//
|
||||
// If you don't like that, you should uncomment `prefer-no-csd` below.
|
||||
// Niri will draw focus ring and border *around* windows that agree to omit their
|
||||
// client-side decorations.
|
||||
//
|
||||
// Alternatively, you can override it with a window rule called
|
||||
// `draw-border-with-background`.
|
||||
|
||||
// You can change how the focus ring looks.
|
||||
focus-ring {
|
||||
// Uncomment this line to disable the focus ring.
|
||||
// off
|
||||
|
||||
// How many logical pixels the ring extends out from the windows.
|
||||
width 4
|
||||
|
||||
// Colors can be set in a variety of ways:
|
||||
// - CSS named colors: "red"
|
||||
// - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
|
||||
// - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
|
||||
|
||||
// Color of the ring on the active monitor.
|
||||
active-color "#7fc8ff"
|
||||
|
||||
// Color of the ring on inactive monitors.
|
||||
//
|
||||
// The focus ring only draws around the active window, so the only place
|
||||
// where you can see its inactive-color is on other monitors.
|
||||
inactive-color "#505050"
|
||||
|
||||
// You can also use gradients. They take precedence over solid colors.
|
||||
// Gradients are rendered the same as CSS linear-gradient(angle, from, to).
|
||||
// The angle is the same as in linear-gradient, and is optional,
|
||||
// defaulting to 180 (top-to-bottom gradient).
|
||||
// You can use any CSS linear-gradient tool on the web to set these up.
|
||||
// Changing the color space is also supported, check the wiki for more info.
|
||||
//
|
||||
// active-gradient from="#80c8ff" to="#c7ff7f" angle=45
|
||||
|
||||
// You can also color the gradient relative to the entire view
|
||||
// of the workspace, rather than relative to just the window itself.
|
||||
// To do that, set relative-to="workspace-view".
|
||||
//
|
||||
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
|
||||
}
|
||||
|
||||
// You can also add a border. It's similar to the focus ring, but always visible.
|
||||
border {
|
||||
// The settings are the same as for the focus ring.
|
||||
// If you enable the border, you probably want to disable the focus ring.
|
||||
off
|
||||
|
||||
width 4
|
||||
active-color "#ffc87f"
|
||||
inactive-color "#505050"
|
||||
|
||||
// Color of the border around windows that request your attention.
|
||||
urgent-color "#9b0000"
|
||||
|
||||
// Gradients can use a few different interpolation color spaces.
|
||||
// For example, this is a pastel rainbow gradient via in="oklch longer hue".
|
||||
//
|
||||
// active-gradient from="#e5989b" to="#ffb4a2" angle=45 relative-to="workspace-view" in="oklch longer hue"
|
||||
|
||||
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
|
||||
}
|
||||
|
||||
// You can enable drop shadows for windows.
|
||||
shadow {
|
||||
// Uncomment the next line to enable shadows.
|
||||
// on
|
||||
|
||||
// By default, the shadow draws only around its window, and not behind it.
|
||||
// Uncomment this setting to make the shadow draw behind its window.
|
||||
//
|
||||
// Note that niri has no way of knowing about the CSD window corner
|
||||
// radius. It has to assume that windows have square corners, leading to
|
||||
// shadow artifacts inside the CSD rounded corners. This setting fixes
|
||||
// those artifacts.
|
||||
//
|
||||
// However, instead you may want to set prefer-no-csd and/or
|
||||
// geometry-corner-radius. Then, niri will know the corner radius and
|
||||
// draw the shadow correctly, without having to draw it behind the
|
||||
// window. These will also remove client-side shadows if the window
|
||||
// draws any.
|
||||
//
|
||||
// draw-behind-window true
|
||||
|
||||
// You can change how shadows look. The values below are in logical
|
||||
// pixels and match the CSS box-shadow properties.
|
||||
|
||||
// Softness controls the shadow blur radius.
|
||||
softness 30
|
||||
|
||||
// Spread expands the shadow.
|
||||
spread 5
|
||||
|
||||
// Offset moves the shadow relative to the window.
|
||||
offset x=0 y=5
|
||||
|
||||
// You can also change the shadow color and opacity.
|
||||
color "#0007"
|
||||
}
|
||||
|
||||
// Struts shrink the area occupied by windows, similarly to layer-shell panels.
|
||||
// You can think of them as a kind of outer gaps. They are set in logical pixels.
|
||||
// Left and right struts will cause the next window to the side to always be visible.
|
||||
// Top and bottom struts will simply add outer gaps in addition to the area occupied by
|
||||
// layer-shell panels and regular gaps.
|
||||
struts {
|
||||
// left 64
|
||||
// right 64
|
||||
// top 64
|
||||
// bottom 64
|
||||
}
|
||||
}
|
||||
|
||||
// Add lines like this to spawn processes at startup.
|
||||
// Note that running niri as a session supports xdg-desktop-autostart,
|
||||
// which may be more convenient to use.
|
||||
// See the binds section below for more spawn examples.
|
||||
|
||||
// This line starts waybar, a commonly used bar for Wayland compositors.
|
||||
spawn-at-startup "/run/current-system/sw/bin/waybar"
|
||||
|
||||
// DP-6 (2 kitty)
|
||||
spawn-at-startup "kitty" "--directory" "/home/sam/organizer" "--app-id" "kitty-organizer"
|
||||
spawn-at-startup "kitty" "--directory" "/etc/nixos" "--app-id" "kitt-yazi"
|
||||
|
||||
// spawn-sh-at-startup "swaybg -i /home/sam/Downloads/wph-1.jpg -m fill -o DP-6 > /tmp/swaybg-dp6.log 2>&1 &"
|
||||
// spawn-sh-at-startup "sleep 1 && swaybg -i /home/sam/Downloads/wpv-1.jpg -m fill -o DP-7 > /tmp/swaybg-dp7.log 2>&1 &"
|
||||
// spawn-sh-at-startup "sleep 2 && swaybg -i /home/sam/Downloads/wph-2.jpg -m fill -o DP-4 > /tmp/swaybg-dp4.log 2>&1 &"
|
||||
// spawn-sh-at-startup "sleep 3 && swaybg -i /home/sam/Downloads/wpv-2.jpg -m fill -o DP-5 > /tmp/swaybg-dp5.log 2>&1 &"
|
||||
|
||||
spawn-sh-at-startup "swww-daemon"
|
||||
spawn-sh-at-startup "sleep 1 && swww img -o DP-6 /home/sam/Downloads/wph-1.jpg"
|
||||
spawn-sh-at-startup "swww img -o DP-7 /home/sam/Downloads/wpv-1.jpg"
|
||||
spawn-sh-at-startup "swww img -o DP-4 /home/sam/Downloads/wph-2.jpg"
|
||||
spawn-sh-at-startup "swww img -o DP-5 /home/sam/Downloads/wpv-2.jpg"
|
||||
|
||||
|
||||
|
||||
spawn-sh-at-startup "swayimg --fullscreen --class cs-vim /home/sam/Downloads/vim.png &"
|
||||
|
||||
spawn-sh-at-startup "swayimg --fullscreen --class cs-tmux /home/sam/Downloads/tmux.png &"
|
||||
|
||||
// DP-7
|
||||
// spawn-at-startup "env" "MOZ_DBUS_REMOTE=1" "firefox" "--new-instance" "--name" "ff-dp7-x" "--new-window" "https://x.com/"
|
||||
// spawn-sh-at-startup "sleep 2 && MOZ_DBUS_REMOTE=1 firefox --name ff-dp7-youtube --new-window https://www.youtube.com/"
|
||||
// // DP-4
|
||||
// spawn-sh-at-startup "sleep 2 && MOZ_DBUS_REMOTE=1 firefox --name ff-dp4-gitea --new-window https://gitea.lab.audasmedia.com.au/"
|
||||
// spawn-sh-at-startup "sleep 2 && MOZ_DBUS_REMOTE=1 firefox --name ff-dp4-t3 --new-window https://t3.chat/"
|
||||
// spawn-sh-at-startup "sleep 2 && MOZ_DBUS_REMOTE=1 firefox --name ff-dp4-grok --new-window https://grok.com/"
|
||||
// spawn-sh-at-startup "sleep 2 && MOZ_DBUS_REMOTE=1 firefox --name ff-dp4-gemini --new-window https://gemini.google.com/"
|
||||
|
||||
|
||||
// All Firefox instances — separate processes, same profile, unique app-ids
|
||||
|
||||
spawn-sh-at-startup "env MOZ_DBUS_REMOTE=1 firefox -no-remote --name ff-dp7-x --new-window https://x.com/"
|
||||
|
||||
spawn-sh-at-startup "sleep 1.5 && env MOZ_DBUS_REMOTE=1 firefox -no-remote --name ff-dp7-youtube --new-window https://www.youtube.com/"
|
||||
|
||||
spawn-sh-at-startup "sleep 3 && google-chrome --profile-directory=Default -no-default-browser-check --new-window --app=https://gitea.lab.audasmedia.com.au/"
|
||||
|
||||
spawn-sh-at-startup "sleep 4.5 && google-chrome --profile-directory=Default --app=https://t3.chat/"
|
||||
|
||||
spawn-sh-at-startup "sleep 6 && google-chrome --profile-directory=Default --app=https://grok.com/"
|
||||
|
||||
spawn-sh-at-startup "sleep 7.5 && google-chrome --profile-directory=Default --app=https://gemini.google.com/"
|
||||
|
||||
|
||||
// DP-5 (kitty + thunar)
|
||||
spawn-at-startup "kitty" "--directory" "/etc/nixos" "--app-id" "kitty-terminal"
|
||||
spawn-at-startup "thunar" "/home/sam" "--name" "thunar"
|
||||
|
||||
//spawn-at-startup "kitty"
|
||||
// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:
|
||||
// spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"
|
||||
|
||||
hotkey-overlay {
|
||||
// Uncomment this line to disable the "Important Hotkeys" pop-up at startup.
|
||||
// skip-at-startup
|
||||
}
|
||||
|
||||
// Uncomment this line to ask the clients to omit their client-side decorations if possible.
|
||||
// If the client will specifically ask for CSD, the request will be honored.
|
||||
// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
|
||||
// This option will also fix border/focus ring drawing behind some semitransparent windows.
|
||||
// After enabling or disabling this, you need to restart the apps for this to take effect.
|
||||
// prefer-no-csd
|
||||
|
||||
// You can change the path where screenshots are saved.
|
||||
// A ~ at the front will be expanded to the home directory.
|
||||
// The path is formatted with strftime(3) to give you the screenshot date and time.
|
||||
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
|
||||
|
||||
// You can also set this to null to disable saving screenshots to disk.
|
||||
// screenshot-path null
|
||||
|
||||
// Animation settings.
|
||||
// The wiki explains how to configure individual animations:
|
||||
// https://yalter.github.io/niri/Configuration:-Animations
|
||||
animations {
|
||||
// Uncomment to turn off all animations.
|
||||
// off
|
||||
|
||||
// Slow down all animations by this factor. Values below 1 speed them up instead.
|
||||
// slowdown 3.0
|
||||
}
|
||||
|
||||
// Window rules let you adjust behavior for individual windows.
|
||||
// Find more information on the wiki:
|
||||
// https://yalter.github.io/niri/Configuration:-Window-Rules
|
||||
|
||||
// Work around WezTerm's initial configure bug
|
||||
// by setting an empty default-column-width.
|
||||
|
||||
|
||||
|
||||
window-rule {
|
||||
match app-id="cs-vim" // or match title=".*keycodes.*" if no class set
|
||||
open-on-output "DP-4"
|
||||
open-floating true
|
||||
open-fullscreen true
|
||||
// optional: no focus ring, etc.
|
||||
focus-ring { off; }
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id="cs-tmux" // or match title=".*keycodes.*" if no class set
|
||||
open-on-output "DP-6"
|
||||
open-floating true
|
||||
open-fullscreen true
|
||||
// optional: no focus ring, etc.
|
||||
focus-ring { off; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
window-rule {
|
||||
match at-startup=true app-id="kitty-organizer"
|
||||
open-on-output "DP-6"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match at-startup=true app-id="kitty-yazi"
|
||||
open-on-output "DP-6"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
|
||||
window-rule {
|
||||
match at-startup=true app-id="ff-dp7-x"
|
||||
open-on-output "DP-7"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
|
||||
window-rule {
|
||||
match at-startup=true app-id="ff-dp7-youtube"
|
||||
open-on-output "DP-7"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
|
||||
window-rule {
|
||||
match at-startup=true title="(?i)gitea"
|
||||
open-on-output "DP-4"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match at-startup=true title="(?i)t3"
|
||||
open-on-output "DP-4"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match at-startup=true title="(?i)grok"
|
||||
open-on-output "DP-4"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match at-startup=true title="(?i)gemini"
|
||||
open-on-output "DP-4"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
|
||||
window-rule {
|
||||
match at-startup=true app-id="kitty-terminal"
|
||||
open-on-output "DP-5"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
window-rule {
|
||||
match at-startup=true app-id="thunar"
|
||||
open-on-output "DP-5"
|
||||
default-column-width { proportion 1.0; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
window-rule {
|
||||
// This regular expression is intentionally made as specific as possible,
|
||||
// since this is the default config, and we want no false positives.
|
||||
// You can get away with just app-id="wezterm" if you want.
|
||||
match app-id=r#"^org\.wezfurlong\.wezterm$"#
|
||||
default-column-width {}
|
||||
}
|
||||
|
||||
// Open the Firefox picture-in-picture player as floating by default.
|
||||
window-rule {
|
||||
// This app-id regular expression will work for both:
|
||||
// - host Firefox (app-id is "firefox")
|
||||
// - Flatpak Firefox (app-id is "org.mozilla.firefox")
|
||||
match app-id=r#"firefox$"# title="^Picture-in-Picture$"
|
||||
open-floating true
|
||||
}
|
||||
|
||||
// Example: block out two password managers from screen capture.
|
||||
// (This example rule is commented out with a "/-" in front.)
|
||||
/-window-rule {
|
||||
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
|
||||
match app-id=r#"^org\.gnome\.World\.Secrets$"#
|
||||
|
||||
block-out-from "screen-capture"
|
||||
|
||||
// Use this instead if you want them visible on third-party screenshot tools.
|
||||
// block-out-from "screencast"
|
||||
}
|
||||
|
||||
// Example: enable rounded corners for all windows.
|
||||
// (This example rule is commented out with a "/-" in front.)
|
||||
/-window-rule {
|
||||
geometry-corner-radius 12
|
||||
clip-to-geometry true
|
||||
}
|
||||
|
||||
binds {
|
||||
// Keys consist of modifiers separated by + signs, followed by an XKB key name
|
||||
// in the end. To find an XKB name for a particular key, you may use a program
|
||||
// like wev.
|
||||
//
|
||||
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
|
||||
// when running as a winit window.
|
||||
//
|
||||
// Most actions that you can bind here can also be invoked programmatically with
|
||||
// `niri msg action do-something`.
|
||||
|
||||
// Mod-Shift-/, which is usually the same as Mod-?,
|
||||
// shows a list of important hotkeys.
|
||||
Mod+Shift+S { spawn-sh "grim -g \"$(slurp)\" - | swappy -f -"; }
|
||||
Mod+Shift+Slash { show-hotkey-overlay; }
|
||||
|
||||
// Suggested binds for running programs: terminal, app launcher, screen locker.
|
||||
Mod+T hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; }
|
||||
Mod+D hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; }
|
||||
Super+Alt+L hotkey-overlay-title="Lock the Screen: swaylock" { spawn "swaylock"; }
|
||||
|
||||
// Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.
|
||||
// Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.
|
||||
// For example, this is a standard bind to toggle the screen reader (orca).
|
||||
Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; }
|
||||
|
||||
// Example volume keys mappings for PipeWire & WirePlumber.
|
||||
// The allow-when-locked=true property makes them work even when the session is locked.
|
||||
// Using spawn-sh allows to pass multiple arguments together with the command.
|
||||
// "-l 1.0" limits the volume to 100%.
|
||||
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0"; }
|
||||
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
|
||||
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
|
||||
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
|
||||
|
||||
// Example media keys mapping using playerctl.
|
||||
// This will work with any MPRIS-enabled media player.
|
||||
XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
|
||||
XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
|
||||
XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
|
||||
XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
|
||||
|
||||
// Example brightness key mappings for brightnessctl.
|
||||
// You can use regular spawn with multiple arguments too (to avoid going through "sh"),
|
||||
// but you need to manually put each argument in separate "" quotes.
|
||||
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
|
||||
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
|
||||
|
||||
// Open/close the Overview: a zoomed-out view of workspaces and windows.
|
||||
// You can also move the mouse into the top-left hot corner,
|
||||
// or do a four-finger swipe up on a touchpad.
|
||||
Mod+O repeat=false { toggle-overview; }
|
||||
|
||||
Mod+Q repeat=false { close-window; }
|
||||
|
||||
Mod+Left { focus-column-left; }
|
||||
Mod+Down { focus-window-down; }
|
||||
Mod+Up { focus-window-up; }
|
||||
Mod+Right { focus-column-right; }
|
||||
Mod+H { focus-column-left; }
|
||||
Mod+J { focus-window-down; }
|
||||
Mod+K { focus-window-up; }
|
||||
Mod+L { focus-column-right; }
|
||||
|
||||
Mod+Ctrl+Left { move-column-left; }
|
||||
Mod+Ctrl+Down { move-window-down; }
|
||||
Mod+Ctrl+Up { move-window-up; }
|
||||
Mod+Ctrl+Right { move-column-right; }
|
||||
Mod+Ctrl+H { move-column-left; }
|
||||
Mod+Ctrl+J { move-window-down; }
|
||||
Mod+Ctrl+K { move-window-up; }
|
||||
Mod+Ctrl+L { move-column-right; }
|
||||
|
||||
// Alternative commands that move across workspaces when reaching
|
||||
// the first or last window in a column.
|
||||
// Mod+J { focus-window-or-workspace-down; }
|
||||
// Mod+K { focus-window-or-workspace-up; }
|
||||
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
|
||||
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
|
||||
|
||||
Mod+Home { focus-column-first; }
|
||||
Mod+End { focus-column-last; }
|
||||
Mod+Ctrl+Home { move-column-to-first; }
|
||||
Mod+Ctrl+End { move-column-to-last; }
|
||||
|
||||
Mod+Shift+Left { focus-monitor-left; }
|
||||
Mod+Shift+Down { focus-monitor-down; }
|
||||
Mod+Shift+Up { focus-monitor-up; }
|
||||
Mod+Shift+Right { focus-monitor-right; }
|
||||
Mod+Shift+H { focus-monitor-left; }
|
||||
Mod+Shift+J { focus-monitor-down; }
|
||||
Mod+Shift+K { focus-monitor-up; }
|
||||
Mod+Shift+L { focus-monitor-right; }
|
||||
|
||||
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
|
||||
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
|
||||
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
|
||||
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
|
||||
Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
|
||||
Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
|
||||
Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
|
||||
Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
|
||||
|
||||
// Alternatively, there are commands to move just a single window:
|
||||
// Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
|
||||
// ...
|
||||
|
||||
// And you can also move a whole workspace to another monitor:
|
||||
// Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
|
||||
// ...
|
||||
|
||||
Mod+Page_Down { focus-workspace-down; }
|
||||
Mod+Page_Up { focus-workspace-up; }
|
||||
Mod+U { focus-workspace-down; }
|
||||
Mod+I { focus-workspace-up; }
|
||||
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
|
||||
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
|
||||
Mod+Ctrl+U { move-column-to-workspace-down; }
|
||||
Mod+Ctrl+I { move-column-to-workspace-up; }
|
||||
|
||||
// Alternatively, there are commands to move just a single window:
|
||||
// Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
|
||||
// ...
|
||||
|
||||
Mod+Shift+Page_Down { move-workspace-down; }
|
||||
Mod+Shift+Page_Up { move-workspace-up; }
|
||||
Mod+Shift+U { move-workspace-down; }
|
||||
Mod+Shift+I { move-workspace-up; }
|
||||
|
||||
// You can bind mouse wheel scroll ticks using the following syntax.
|
||||
// These binds will change direction based on the natural-scroll setting.
|
||||
//
|
||||
// To avoid scrolling through workspaces really fast, you can use
|
||||
// the cooldown-ms property. The bind will be rate-limited to this value.
|
||||
// You can set a cooldown on any bind, but it's most useful for the wheel.
|
||||
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
|
||||
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
|
||||
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
|
||||
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
|
||||
|
||||
Mod+WheelScrollRight { focus-column-right; }
|
||||
Mod+WheelScrollLeft { focus-column-left; }
|
||||
Mod+Ctrl+WheelScrollRight { move-column-right; }
|
||||
Mod+Ctrl+WheelScrollLeft { move-column-left; }
|
||||
|
||||
// Usually scrolling up and down with Shift in applications results in
|
||||
// horizontal scrolling; these binds replicate that.
|
||||
Mod+Shift+WheelScrollDown { focus-column-right; }
|
||||
Mod+Shift+WheelScrollUp { focus-column-left; }
|
||||
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
|
||||
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
|
||||
|
||||
// Similarly, you can bind touchpad scroll "ticks".
|
||||
// Touchpad scrolling is continuous, so for these binds it is split into
|
||||
// discrete intervals.
|
||||
// These binds are also affected by touchpad's natural-scroll, so these
|
||||
// example binds are "inverted", since we have natural-scroll enabled for
|
||||
// touchpads by default.
|
||||
// Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; }
|
||||
// Mod+TouchpadScrollUp { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; }
|
||||
|
||||
// You can refer to workspaces by index. However, keep in mind that
|
||||
// niri is a dynamic workspace system, so these commands are kind of
|
||||
// "best effort". Trying to refer to a workspace index bigger than
|
||||
// the current workspace count will instead refer to the bottommost
|
||||
// (empty) workspace.
|
||||
//
|
||||
// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
|
||||
// will all refer to the 3rd workspace.
|
||||
Mod+1 { focus-workspace 1; }
|
||||
Mod+2 { focus-workspace 2; }
|
||||
Mod+3 { focus-workspace 3; }
|
||||
Mod+4 { focus-workspace 4; }
|
||||
Mod+5 { focus-workspace 5; }
|
||||
Mod+6 { focus-workspace 6; }
|
||||
Mod+7 { focus-workspace 7; }
|
||||
Mod+8 { focus-workspace 8; }
|
||||
Mod+9 { focus-workspace 9; }
|
||||
Mod+Ctrl+1 { move-column-to-workspace 1; }
|
||||
Mod+Ctrl+2 { move-column-to-workspace 2; }
|
||||
Mod+Ctrl+3 { move-column-to-workspace 3; }
|
||||
Mod+Ctrl+4 { move-column-to-workspace 4; }
|
||||
Mod+Ctrl+5 { move-column-to-workspace 5; }
|
||||
Mod+Ctrl+6 { move-column-to-workspace 6; }
|
||||
Mod+Ctrl+7 { move-column-to-workspace 7; }
|
||||
Mod+Ctrl+8 { move-column-to-workspace 8; }
|
||||
Mod+Ctrl+9 { move-column-to-workspace 9; }
|
||||
|
||||
// Alternatively, there are commands to move just a single window:
|
||||
// Mod+Ctrl+1 { move-window-to-workspace 1; }
|
||||
|
||||
// Switches focus between the current and the previous workspace.
|
||||
// Mod+Tab { focus-workspace-previous; }
|
||||
|
||||
// The following binds move the focused window in and out of a column.
|
||||
// If the window is alone, they will consume it into the nearby column to the side.
|
||||
// If the window is already in a column, they will expel it out.
|
||||
Mod+BracketLeft { consume-or-expel-window-left; }
|
||||
Mod+BracketRight { consume-or-expel-window-right; }
|
||||
|
||||
// Consume one window from the right to the bottom of the focused column.
|
||||
Mod+Comma { consume-window-into-column; }
|
||||
// Expel the bottom window from the focused column to the right.
|
||||
Mod+Period { expel-window-from-column; }
|
||||
|
||||
Mod+R { switch-preset-column-width; }
|
||||
// Cycling through the presets in reverse order is also possible.
|
||||
// Mod+R { switch-preset-column-width-back; }
|
||||
Mod+Shift+R { switch-preset-window-height; }
|
||||
Mod+Ctrl+R { reset-window-height; }
|
||||
Mod+F { maximize-column; }
|
||||
Mod+Shift+F { fullscreen-window; }
|
||||
|
||||
// Expand the focused column to space not taken up by other fully visible columns.
|
||||
// Makes the column "fill the rest of the space".
|
||||
Mod+Ctrl+F { expand-column-to-available-width; }
|
||||
|
||||
Mod+C { center-column; }
|
||||
|
||||
// Center all fully visible columns on screen.
|
||||
Mod+Ctrl+C { center-visible-columns; }
|
||||
|
||||
// Finer width adjustments.
|
||||
// This command can also:
|
||||
// * set width in pixels: "1000"
|
||||
// * adjust width in pixels: "-5" or "+5"
|
||||
// * set width as a percentage of screen width: "25%"
|
||||
// * adjust width as a percentage of screen width: "-10%" or "+10%"
|
||||
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
|
||||
// set-column-width "100" will make the column occupy 200 physical screen pixels.
|
||||
Mod+Minus { set-column-width "-10%"; }
|
||||
Mod+Equal { set-column-width "+10%"; }
|
||||
|
||||
// Finer height adjustments when in column with other windows.
|
||||
Mod+Shift+Minus { set-window-height "-10%"; }
|
||||
Mod+Shift+Equal { set-window-height "+10%"; }
|
||||
|
||||
// Move the focused window between the floating and the tiling layout.
|
||||
Mod+V { toggle-window-floating; }
|
||||
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
|
||||
|
||||
// Toggle tabbed column display mode.
|
||||
// Windows in this column will appear as vertical tabs,
|
||||
// rather than stacked on top of each other.
|
||||
Mod+W { toggle-column-tabbed-display; }
|
||||
|
||||
// Actions to switch layouts.
|
||||
// Note: if you uncomment these, make sure you do NOT have
|
||||
// a matching layout switch hotkey configured in xkb options above.
|
||||
// Having both at once on the same hotkey will break the switching,
|
||||
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
|
||||
// Mod+Space { switch-layout "next"; }
|
||||
// Mod+Shift+Space { switch-layout "prev"; }
|
||||
|
||||
Print { screenshot; }
|
||||
Ctrl+Print { screenshot-screen; }
|
||||
Alt+Print { screenshot-window; }
|
||||
|
||||
// Applications such as remote-desktop clients and software KVM switches may
|
||||
// request that niri stops processing the keyboard shortcuts defined here
|
||||
// so they may, for example, forward the key presses as-is to a remote machine.
|
||||
// It's a good idea to bind an escape hatch to toggle the inhibitor,
|
||||
// so a buggy application can't hold your session hostage.
|
||||
//
|
||||
// The allow-inhibiting=false property can be applied to other binds as well,
|
||||
// which ensures niri always processes them, even when an inhibitor is active.
|
||||
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
|
||||
|
||||
// The quit action will show a confirmation dialog to avoid accidental exits.
|
||||
Mod+Shift+E { quit; }
|
||||
Ctrl+Alt+Delete { quit; }
|
||||
|
||||
// Powers off the monitors. To turn them back on, do any input like
|
||||
// moving the mouse or pressing any other key.
|
||||
Mod+Shift+P { power-off-monitors; }
|
||||
Mod+N { spawn "swaync-client" "-t"; }
|
||||
|
||||
}
|
||||
16
home/sam/config/starship.toml
Normal file
16
home/sam/config/starship.toml
Normal file
@@ -0,0 +1,16 @@
|
||||
# A clean and common Starship configuration
|
||||
|
||||
# Changes the symbol at the start of the line
|
||||
[character]
|
||||
success_symbol = "[❯](bold green)"
|
||||
error_symbol = "[✗](bold red)"
|
||||
|
||||
# Shows how long a command took to run if it exceeds 2 seconds
|
||||
[cmd_duration]
|
||||
min_time = 2000
|
||||
format = "took [$duration](bold yellow) "
|
||||
|
||||
# Shortens the directory path display
|
||||
[directory]
|
||||
truncation_length = 3
|
||||
truncate_to_repo = true # Shows path relative to the Git repository root
|
||||
56
home/sam/config/tickrs/config.yml
Normal file
56
home/sam/config/tickrs/config.yml
Normal file
@@ -0,0 +1,56 @@
|
||||
symbols:
|
||||
|
||||
# --- US Risk Appetite ---
|
||||
- ^GSPC # S&P 500
|
||||
- ^IXIC # Nasdaq
|
||||
- VIXY # VIX ETF proxy (more stable than ^VIX)
|
||||
|
||||
# --- US Rates ---
|
||||
- ^TNX # 10Y yield
|
||||
# - ^FVX # 5Y yield
|
||||
# - ^IRX # 13-week bill
|
||||
|
||||
# --- Dollar / FX ---
|
||||
- DX-Y.NYB # Dollar Index
|
||||
- EURUSD=X
|
||||
- USDJPY=X
|
||||
- AUDUSD=X
|
||||
# - USDCNH=X # China yuan offshore
|
||||
# - GBPUSD=X
|
||||
|
||||
# --- Commodities (Global Growth Signal) ---
|
||||
- GC=F # Gold
|
||||
- SI=F # Silver
|
||||
- HG=F # Copper
|
||||
- CL=F # Oil
|
||||
# - NG=F # Natural Gas
|
||||
# - ZC=F # Corn
|
||||
# - KE=F # Wheat
|
||||
|
||||
# --- China ---
|
||||
- 000001.SS # Shanghai
|
||||
- ^HSI # Hang Seng
|
||||
# - 399001.SZ # Shenzhen
|
||||
|
||||
# --- Australia (Trade Proxy) ---
|
||||
- ^AXJO
|
||||
- BHP.AX
|
||||
- RIO.AX
|
||||
- FMG.AX
|
||||
# - NST.AX # Gold miner
|
||||
# - CBA.AX
|
||||
|
||||
# --- US Tech Leadership ---
|
||||
- AAPL
|
||||
- MSFT
|
||||
- NVDA
|
||||
# - AMZN
|
||||
# - META
|
||||
# - TSLA
|
||||
|
||||
chart_type: line
|
||||
time_frame: 1M
|
||||
update_interval: 900
|
||||
enable_pre_post: false
|
||||
summary: true
|
||||
|
||||
118
home/sam/config/waybar/config.jsonc
Normal file
118
home/sam/config/waybar/config.jsonc
Normal file
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"layer": "top",
|
||||
"position": "top",
|
||||
"height": 32,
|
||||
|
||||
"modules-left": ["niri/workspaces"],
|
||||
"modules-center": ["niri/window"],
|
||||
"modules-right": [
|
||||
"custom/tasks", // <-- ADD THIS LINE
|
||||
"custom/notification", // <-- ADD THIS
|
||||
"keyboard-state",
|
||||
"cpu",
|
||||
"memory",
|
||||
"network",
|
||||
"pulseaudio",
|
||||
"tray",
|
||||
"clock"
|
||||
],
|
||||
|
||||
"tray": {
|
||||
"icon-size": 20,
|
||||
"spacing": 8
|
||||
},
|
||||
|
||||
|
||||
"clock": {
|
||||
"format": " {:%a %d %b %H:%M}",
|
||||
"on-click": "niri msg action spawn -- gnome-calendar",
|
||||
"tooltip": true,
|
||||
"tooltip-format": "{:%Y-%m-%d %H:%M:%S}"
|
||||
},
|
||||
|
||||
"cpu": {
|
||||
"format": " {usage}%",
|
||||
"on-click": "niri msg action spawn -- kitty -e btop",
|
||||
"tooltip": true
|
||||
},
|
||||
|
||||
"memory": {
|
||||
"format": " {percentage}%",
|
||||
"on-click": "niri msg action spawn -- kitty -e btop",
|
||||
"tooltip": true
|
||||
},
|
||||
|
||||
"network": {
|
||||
"format-wifi": " {signalStrength}%",
|
||||
"format-ethernet": " Wired",
|
||||
"format-disconnected": " Offline",
|
||||
"on-click": "nm-connection-editor",
|
||||
"on-click-right": "nmcli networking toggle",
|
||||
"tooltip": true,
|
||||
"tooltip-format": "{essid}\nLeft-click: Network settings\nRight-click: Toggle networking"
|
||||
},
|
||||
|
||||
|
||||
"pulseaudio": {
|
||||
"format": "{icon} {volume}%",
|
||||
"format-muted": " Muted",
|
||||
"format-icons": {
|
||||
"default": ["", "", ""],
|
||||
"headphone": "",
|
||||
"headset": ""
|
||||
},
|
||||
"on-click": "pavucontrol",
|
||||
"on-click-right": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
|
||||
"on-scroll-up": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+ -l 1.0",
|
||||
"on-scroll-down": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-",
|
||||
"tooltip": true,
|
||||
"tooltip-format": "{icon} {volume}%\nLeft-click: Mixer\nRight-click: Toggle mute\nScroll: Adjust volume"
|
||||
},
|
||||
|
||||
"keyboard-state": {
|
||||
"device": "/dev/input/event*",
|
||||
"numlock": true,
|
||||
"capslock": true,
|
||||
"format": "{name} {icon}",
|
||||
"format-icons": {
|
||||
"locked": "",
|
||||
"unlocked": ""
|
||||
}
|
||||
},
|
||||
|
||||
"custom/tasks": {
|
||||
"format": "{icon} {text}",
|
||||
"format-icons": ["", ""],
|
||||
"interval": 30,
|
||||
"exec": "task status:pending count",
|
||||
"exec-if": "which task",
|
||||
"on-click": "niri msg action spawn -- kitty -e taskwarrior-tui",
|
||||
"on-click-right": "niri msg action spawn -- kitty -e task add",
|
||||
"tooltip": true,
|
||||
"tooltip-format": "{} pending tasks\nLeft-click: Open TUI\nRight-click: Add task",
|
||||
"min-length": 3,
|
||||
"max-length": 20
|
||||
},
|
||||
"custom/notification": {
|
||||
"tooltip": false,
|
||||
"format": "{icon}",
|
||||
"format-icons": {
|
||||
"notification": "<span foreground='red'><sup></sup></span>",
|
||||
"none": "",
|
||||
"dnd-notification": "<span foreground='red'><sup></sup></span>",
|
||||
"dnd-none": ""
|
||||
},
|
||||
"return-type": "json",
|
||||
"exec-if": "which swaync-client",
|
||||
"exec": "swaync-client -swb",
|
||||
"on-click": "swaync-client -t -sw",
|
||||
"on-click-right": "swaync-client -d -sw",
|
||||
"escape": true
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
43
home/sam/config/waybar/style.css
Normal file
43
home/sam/config/waybar/style.css
Normal file
@@ -0,0 +1,43 @@
|
||||
@define-color base #24273a;
|
||||
@define-color mantle #1e2030;
|
||||
@define-color text #cad3f5;
|
||||
@define-color blue #8aadf4;
|
||||
@define-color green #a6da95;
|
||||
@define-color red #ed8796;
|
||||
@define-color overlay0 #6e738d;
|
||||
|
||||
* {
|
||||
font-family: "JetBrainsMono Nerd Font", "Symbols Nerd Font","Font Awesome 6 Free", "Font Awesome 6 Brands", sans-serif;
|
||||
font-size: 14px;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
background: @mantle;
|
||||
color: @text;
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
padding: 0 10px;
|
||||
margin: 6px 4px;
|
||||
background: transparent;
|
||||
color: @overlay0;
|
||||
}
|
||||
|
||||
#workspaces button.focused {
|
||||
background: @blue;
|
||||
color: @base;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#clock,
|
||||
#pulseaudio,
|
||||
#network,
|
||||
#tray {
|
||||
padding: 0 12px;
|
||||
margin: 6px 4px;
|
||||
background: @base;
|
||||
border-radius: 8px;
|
||||
}
|
||||
532
home/sam/config/zellij/config.kdl
Normal file
532
home/sam/config/zellij/config.kdl
Normal file
@@ -0,0 +1,532 @@
|
||||
keybinds clear-defaults=true {
|
||||
locked {
|
||||
bind "Ctrl g" { SwitchToMode "normal"; }
|
||||
}
|
||||
pane {
|
||||
bind "left" { MoveFocus "left"; }
|
||||
bind "down" { MoveFocus "down"; }
|
||||
bind "up" { MoveFocus "up"; }
|
||||
bind "right" { MoveFocus "right"; }
|
||||
bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; }
|
||||
bind "d" { NewPane "down"; SwitchToMode "normal"; }
|
||||
bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "normal"; }
|
||||
bind "f" { ToggleFocusFullscreen; SwitchToMode "normal"; }
|
||||
bind "h" { MoveFocus "left"; }
|
||||
bind "i" { TogglePanePinned; SwitchToMode "normal"; }
|
||||
bind "j" { MoveFocus "down"; }
|
||||
bind "k" { MoveFocus "up"; }
|
||||
bind "l" { MoveFocus "right"; }
|
||||
bind "n" { NewPane; SwitchToMode "normal"; }
|
||||
bind "p" { SwitchFocus; }
|
||||
bind "Ctrl p" { SwitchToMode "normal"; }
|
||||
bind "r" { NewPane "right"; SwitchToMode "normal"; }
|
||||
bind "s" { NewPane "stacked"; SwitchToMode "normal"; }
|
||||
bind "w" { ToggleFloatingPanes; SwitchToMode "normal"; }
|
||||
bind "z" { TogglePaneFrames; SwitchToMode "normal"; }
|
||||
}
|
||||
tab {
|
||||
bind "left" { GoToPreviousTab; }
|
||||
bind "down" { GoToNextTab; }
|
||||
bind "up" { GoToPreviousTab; }
|
||||
bind "right" { GoToNextTab; }
|
||||
bind "1" { GoToTab 1; SwitchToMode "normal"; }
|
||||
bind "2" { GoToTab 2; SwitchToMode "normal"; }
|
||||
bind "3" { GoToTab 3; SwitchToMode "normal"; }
|
||||
bind "4" { GoToTab 4; SwitchToMode "normal"; }
|
||||
bind "5" { GoToTab 5; SwitchToMode "normal"; }
|
||||
bind "6" { GoToTab 6; SwitchToMode "normal"; }
|
||||
bind "7" { GoToTab 7; SwitchToMode "normal"; }
|
||||
bind "8" { GoToTab 8; SwitchToMode "normal"; }
|
||||
bind "9" { GoToTab 9; SwitchToMode "normal"; }
|
||||
bind "[" { BreakPaneLeft; SwitchToMode "normal"; }
|
||||
bind "]" { BreakPaneRight; SwitchToMode "normal"; }
|
||||
bind "b" { BreakPane; SwitchToMode "normal"; }
|
||||
bind "h" { GoToPreviousTab; }
|
||||
bind "j" { GoToNextTab; }
|
||||
bind "k" { GoToPreviousTab; }
|
||||
bind "l" { GoToNextTab; }
|
||||
bind "n" { NewTab; SwitchToMode "normal"; }
|
||||
bind "r" { SwitchToMode "renametab"; TabNameInput 0; }
|
||||
bind "s" { ToggleActiveSyncTab; SwitchToMode "normal"; }
|
||||
bind "Ctrl t" { SwitchToMode "normal"; }
|
||||
bind "x" { CloseTab; SwitchToMode "normal"; }
|
||||
bind "tab" { ToggleTab; }
|
||||
}
|
||||
resize {
|
||||
bind "left" { Resize "Increase left"; }
|
||||
bind "down" { Resize "Increase down"; }
|
||||
bind "up" { Resize "Increase up"; }
|
||||
bind "right" { Resize "Increase right"; }
|
||||
bind "+" { Resize "Increase"; }
|
||||
bind "-" { Resize "Decrease"; }
|
||||
bind "=" { Resize "Increase"; }
|
||||
bind "H" { Resize "Decrease left"; }
|
||||
bind "J" { Resize "Decrease down"; }
|
||||
bind "K" { Resize "Decrease up"; }
|
||||
bind "L" { Resize "Decrease right"; }
|
||||
bind "h" { Resize "Increase left"; }
|
||||
bind "j" { Resize "Increase down"; }
|
||||
bind "k" { Resize "Increase up"; }
|
||||
bind "l" { Resize "Increase right"; }
|
||||
bind "Ctrl n" { SwitchToMode "normal"; }
|
||||
}
|
||||
move {
|
||||
bind "left" { MovePane "left"; }
|
||||
bind "down" { MovePane "down"; }
|
||||
bind "up" { MovePane "up"; }
|
||||
bind "right" { MovePane "right"; }
|
||||
bind "h" { MovePane "left"; }
|
||||
bind "Ctrl h" { SwitchToMode "normal"; }
|
||||
bind "j" { MovePane "down"; }
|
||||
bind "k" { MovePane "up"; }
|
||||
bind "l" { MovePane "right"; }
|
||||
bind "n" { MovePane; }
|
||||
bind "p" { MovePaneBackwards; }
|
||||
bind "tab" { MovePane; }
|
||||
}
|
||||
scroll {
|
||||
bind "e" { EditScrollback; SwitchToMode "normal"; }
|
||||
bind "s" { SwitchToMode "entersearch"; SearchInput 0; }
|
||||
}
|
||||
search {
|
||||
bind "c" { SearchToggleOption "CaseSensitivity"; }
|
||||
bind "n" { Search "down"; }
|
||||
bind "o" { SearchToggleOption "WholeWord"; }
|
||||
bind "p" { Search "up"; }
|
||||
bind "w" { SearchToggleOption "Wrap"; }
|
||||
}
|
||||
session {
|
||||
bind "a" {
|
||||
LaunchOrFocusPlugin "zellij:about" {
|
||||
floating true
|
||||
move_to_focused_tab true
|
||||
}
|
||||
SwitchToMode "normal"
|
||||
}
|
||||
bind "c" {
|
||||
LaunchOrFocusPlugin "configuration" {
|
||||
floating true
|
||||
move_to_focused_tab true
|
||||
}
|
||||
SwitchToMode "normal"
|
||||
}
|
||||
bind "Ctrl o" { SwitchToMode "normal"; }
|
||||
bind "p" {
|
||||
LaunchOrFocusPlugin "plugin-manager" {
|
||||
floating true
|
||||
move_to_focused_tab true
|
||||
}
|
||||
SwitchToMode "normal"
|
||||
}
|
||||
bind "s" {
|
||||
LaunchOrFocusPlugin "zellij:share" {
|
||||
floating true
|
||||
move_to_focused_tab true
|
||||
}
|
||||
SwitchToMode "normal"
|
||||
}
|
||||
bind "w" {
|
||||
LaunchOrFocusPlugin "session-manager" {
|
||||
floating true
|
||||
move_to_focused_tab true
|
||||
}
|
||||
SwitchToMode "normal"
|
||||
}
|
||||
}
|
||||
shared_except "locked" {
|
||||
bind "Alt left" { MoveFocusOrTab "left"; }
|
||||
bind "Alt down" { MoveFocus "down"; }
|
||||
bind "Alt up" { MoveFocus "up"; }
|
||||
bind "Alt right" { MoveFocusOrTab "right"; }
|
||||
bind "Alt +" { Resize "Increase"; }
|
||||
bind "Alt -" { Resize "Decrease"; }
|
||||
bind "Alt =" { Resize "Increase"; }
|
||||
bind "Alt [" { PreviousSwapLayout; }
|
||||
bind "Alt ]" { NextSwapLayout; }
|
||||
bind "Alt f" { ToggleFloatingPanes; }
|
||||
bind "Ctrl g" { SwitchToMode "locked"; }
|
||||
bind "Alt h" { MoveFocusOrTab "left"; }
|
||||
bind "Alt i" { MoveTab "left"; }
|
||||
bind "Alt j" { MoveFocus "down"; }
|
||||
bind "Alt k" { MoveFocus "up"; }
|
||||
bind "Alt l" { MoveFocusOrTab "right"; }
|
||||
bind "Alt n" { NewPane; }
|
||||
bind "Alt o" { MoveTab "right"; }
|
||||
bind "Alt p" { TogglePaneInGroup; }
|
||||
bind "Alt Shift p" { ToggleGroupMarking; }
|
||||
bind "Ctrl q" { Quit; }
|
||||
}
|
||||
shared_except "locked" "move" {
|
||||
bind "Ctrl h" { SwitchToMode "move"; }
|
||||
}
|
||||
shared_except "locked" "session" {
|
||||
bind "Ctrl o" { SwitchToMode "session"; }
|
||||
}
|
||||
shared_except "locked" "scroll" "search" "tmux" {
|
||||
bind "Ctrl b" { SwitchToMode "tmux"; }
|
||||
}
|
||||
shared_except "locked" "scroll" "search" {
|
||||
bind "Ctrl s" { SwitchToMode "scroll"; }
|
||||
}
|
||||
shared_except "locked" "tab" {
|
||||
bind "Ctrl t" { SwitchToMode "tab"; }
|
||||
}
|
||||
shared_except "locked" "pane" {
|
||||
bind "Ctrl p" { SwitchToMode "pane"; }
|
||||
}
|
||||
shared_except "locked" "resize" {
|
||||
bind "Ctrl n" { SwitchToMode "resize"; }
|
||||
}
|
||||
shared_except "normal" "locked" "entersearch" {
|
||||
bind "enter" { SwitchToMode "normal"; }
|
||||
}
|
||||
shared_except "normal" "locked" "entersearch" "renametab" "renamepane" {
|
||||
bind "esc" { SwitchToMode "normal"; }
|
||||
}
|
||||
shared_among "pane" "tmux" {
|
||||
bind "x" { CloseFocus; SwitchToMode "normal"; }
|
||||
}
|
||||
shared_among "scroll" "search" {
|
||||
bind "PageDown" { PageScrollDown; }
|
||||
bind "PageUp" { PageScrollUp; }
|
||||
bind "left" { PageScrollUp; }
|
||||
bind "down" { ScrollDown; }
|
||||
bind "up" { ScrollUp; }
|
||||
bind "right" { PageScrollDown; }
|
||||
bind "Ctrl b" { PageScrollUp; }
|
||||
bind "Ctrl c" { ScrollToBottom; SwitchToMode "normal"; }
|
||||
bind "d" { HalfPageScrollDown; }
|
||||
bind "Ctrl f" { PageScrollDown; }
|
||||
bind "h" { PageScrollUp; }
|
||||
bind "j" { ScrollDown; }
|
||||
bind "k" { ScrollUp; }
|
||||
bind "l" { PageScrollDown; }
|
||||
bind "Ctrl s" { SwitchToMode "normal"; }
|
||||
bind "u" { HalfPageScrollUp; }
|
||||
}
|
||||
entersearch {
|
||||
bind "Ctrl c" { SwitchToMode "scroll"; }
|
||||
bind "esc" { SwitchToMode "scroll"; }
|
||||
bind "enter" { SwitchToMode "search"; }
|
||||
}
|
||||
renametab {
|
||||
bind "esc" { UndoRenameTab; SwitchToMode "tab"; }
|
||||
}
|
||||
shared_among "renametab" "renamepane" {
|
||||
bind "Ctrl c" { SwitchToMode "normal"; }
|
||||
}
|
||||
renamepane {
|
||||
bind "esc" { UndoRenamePane; SwitchToMode "pane"; }
|
||||
}
|
||||
shared_among "session" "tmux" {
|
||||
bind "d" { Detach; }
|
||||
}
|
||||
tmux {
|
||||
bind "left" { MoveFocus "left"; SwitchToMode "normal"; }
|
||||
bind "down" { MoveFocus "down"; SwitchToMode "normal"; }
|
||||
bind "up" { MoveFocus "up"; SwitchToMode "normal"; }
|
||||
bind "right" { MoveFocus "right"; SwitchToMode "normal"; }
|
||||
bind "space" { NextSwapLayout; }
|
||||
bind "\"" { NewPane "down"; SwitchToMode "normal"; }
|
||||
bind "%" { NewPane "right"; SwitchToMode "normal"; }
|
||||
bind "," { SwitchToMode "renametab"; }
|
||||
bind "[" { SwitchToMode "scroll"; }
|
||||
bind "Ctrl b" { Write 2; SwitchToMode "normal"; }
|
||||
bind "c" { NewTab; SwitchToMode "normal"; }
|
||||
bind "h" { MoveFocus "left"; SwitchToMode "normal"; }
|
||||
bind "j" { MoveFocus "down"; SwitchToMode "normal"; }
|
||||
bind "k" { MoveFocus "up"; SwitchToMode "normal"; }
|
||||
bind "l" { MoveFocus "right"; SwitchToMode "normal"; }
|
||||
bind "n" { GoToNextTab; SwitchToMode "normal"; }
|
||||
bind "o" { FocusNextPane; }
|
||||
bind "p" { GoToPreviousTab; SwitchToMode "normal"; }
|
||||
bind "z" { ToggleFocusFullscreen; SwitchToMode "normal"; }
|
||||
}
|
||||
}
|
||||
|
||||
// Plugin aliases - can be used to change the implementation of Zellij
|
||||
// changing these requires a restart to take effect
|
||||
plugins {
|
||||
about location="zellij:about"
|
||||
compact-bar location="zellij:compact-bar"
|
||||
configuration location="zellij:configuration"
|
||||
filepicker location="zellij:strider" {
|
||||
cwd "/"
|
||||
}
|
||||
plugin-manager location="zellij:plugin-manager"
|
||||
session-manager location="zellij:session-manager"
|
||||
status-bar location="zellij:status-bar"
|
||||
strider location="zellij:strider"
|
||||
tab-bar location="zellij:tab-bar"
|
||||
welcome-screen location="zellij:session-manager" {
|
||||
welcome_screen true
|
||||
}
|
||||
}
|
||||
|
||||
// Plugins to load in the background when a new session starts
|
||||
// eg. "file:/path/to/my-plugin.wasm"
|
||||
// eg. "https://example.com/my-plugin.wasm"
|
||||
load_plugins {
|
||||
}
|
||||
web_client {
|
||||
font "monospace"
|
||||
}
|
||||
|
||||
// Use a simplified UI without special fonts (arrow glyphs)
|
||||
// Options:
|
||||
// - true
|
||||
// - false (Default)
|
||||
//
|
||||
// simplified_ui true
|
||||
|
||||
// Choose the theme that is specified in the themes section.
|
||||
// Default: default
|
||||
//
|
||||
// theme "dracula"
|
||||
|
||||
// Choose the base input mode of zellij.
|
||||
// Default: normal
|
||||
//
|
||||
// default_mode "locked"
|
||||
|
||||
// Choose the path to the default shell that zellij will use for opening new panes
|
||||
// Default: $SHELL
|
||||
//
|
||||
// default_shell "fish"
|
||||
|
||||
// Choose the path to override cwd that zellij will use for opening new panes
|
||||
//
|
||||
// default_cwd "/tmp"
|
||||
|
||||
// The name of the default layout to load on startup
|
||||
// Default: "default"
|
||||
//
|
||||
// default_layout "compact"
|
||||
|
||||
// The folder in which Zellij will look for layouts
|
||||
// (Requires restart)
|
||||
//
|
||||
// layout_dir "/tmp"
|
||||
|
||||
// The folder in which Zellij will look for themes
|
||||
// (Requires restart)
|
||||
//
|
||||
// theme_dir "/tmp"
|
||||
|
||||
// Toggle enabling the mouse mode.
|
||||
// On certain configurations, or terminals this could
|
||||
// potentially interfere with copying text.
|
||||
// Options:
|
||||
// - true (default)
|
||||
// - false
|
||||
//
|
||||
// mouse_mode false
|
||||
|
||||
// Toggle having pane frames around the panes
|
||||
// Options:
|
||||
// - true (default, enabled)
|
||||
// - false
|
||||
//
|
||||
// pane_frames false
|
||||
|
||||
// When attaching to an existing session with other users,
|
||||
// should the session be mirrored (true)
|
||||
// or should each user have their own cursor (false)
|
||||
// (Requires restart)
|
||||
// Default: false
|
||||
//
|
||||
// mirror_session true
|
||||
|
||||
// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP
|
||||
// eg. when terminal window with an active zellij session is closed
|
||||
// (Requires restart)
|
||||
// Options:
|
||||
// - detach (Default)
|
||||
// - quit
|
||||
//
|
||||
// on_force_close "quit"
|
||||
|
||||
// Configure the scroll back buffer size
|
||||
// This is the number of lines zellij stores for each pane in the scroll back
|
||||
// buffer. Excess number of lines are discarded in a FIFO fashion.
|
||||
// (Requires restart)
|
||||
// Valid values: positive integers
|
||||
// Default value: 10000
|
||||
//
|
||||
// scroll_buffer_size 10000
|
||||
|
||||
// Provide a command to execute when copying text. The text will be piped to
|
||||
// the stdin of the program to perform the copy. This can be used with
|
||||
// terminal emulators which do not support the OSC 52 ANSI control sequence
|
||||
// that will be used by default if this option is not set.
|
||||
// Examples:
|
||||
//
|
||||
// copy_command "xclip -selection clipboard" // x11
|
||||
// copy_command "wl-copy" // wayland
|
||||
// copy_command "pbcopy" // osx
|
||||
//
|
||||
// copy_command "pbcopy"
|
||||
|
||||
// Choose the destination for copied text
|
||||
// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard.
|
||||
// Does not apply when using copy_command.
|
||||
// Options:
|
||||
// - system (default)
|
||||
// - primary
|
||||
//
|
||||
// copy_clipboard "primary"
|
||||
|
||||
// Enable automatic copying (and clearing) of selection when releasing mouse
|
||||
// Default: true
|
||||
//
|
||||
// copy_on_select true
|
||||
|
||||
// Path to the default editor to use to edit pane scrollbuffer
|
||||
// Default: $EDITOR or $VISUAL
|
||||
// scrollback_editor "/usr/bin/vim"
|
||||
|
||||
// A fixed name to always give the Zellij session.
|
||||
// Consider also setting `attach_to_session true,`
|
||||
// otherwise this will error if such a session exists.
|
||||
// Default: <RANDOM>
|
||||
//
|
||||
// session_name "My singleton session"
|
||||
|
||||
// When `session_name` is provided, attaches to that session
|
||||
// if it is already running or creates it otherwise.
|
||||
// Default: false
|
||||
//
|
||||
// attach_to_session true
|
||||
|
||||
// Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible
|
||||
// Options:
|
||||
// - true (default)
|
||||
// - false
|
||||
//
|
||||
// auto_layout false
|
||||
|
||||
// Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected
|
||||
// Options:
|
||||
// - true (default)
|
||||
// - false
|
||||
//
|
||||
// session_serialization false
|
||||
|
||||
// Whether pane viewports are serialized along with the session, default is false
|
||||
// Options:
|
||||
// - true
|
||||
// - false (default)
|
||||
//
|
||||
// serialize_pane_viewport false
|
||||
|
||||
// Scrollback lines to serialize along with the pane viewport when serializing sessions, 0
|
||||
// defaults to the scrollback size. If this number is higher than the scrollback size, it will
|
||||
// also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true.
|
||||
//
|
||||
// scrollback_lines_to_serialize 10000
|
||||
|
||||
// Enable or disable the rendering of styled and colored underlines (undercurl).
|
||||
// May need to be disabled for certain unsupported terminals
|
||||
// (Requires restart)
|
||||
// Default: true
|
||||
//
|
||||
// styled_underlines false
|
||||
|
||||
// How often in seconds sessions are serialized
|
||||
//
|
||||
// serialization_interval 10000
|
||||
|
||||
// Enable or disable writing of session metadata to disk (if disabled, other sessions might not know
|
||||
// metadata info on this session)
|
||||
// (Requires restart)
|
||||
// Default: false
|
||||
//
|
||||
// disable_session_metadata false
|
||||
|
||||
// Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it)
|
||||
// (Requires restart)
|
||||
// Default: true (if the host terminal supports it)
|
||||
//
|
||||
// support_kitty_keyboard_protocol false
|
||||
// Whether to make sure a local web server is running when a new Zellij session starts.
|
||||
// This web server will allow creating new sessions and attaching to existing ones that have
|
||||
// opted in to being shared in the browser.
|
||||
// When enabled, navigate to http://127.0.0.1:8082
|
||||
// (Requires restart)
|
||||
//
|
||||
// Note: a local web server can still be manually started from within a Zellij session or from the CLI.
|
||||
// If this is not desired, one can use a version of Zellij compiled without
|
||||
// `web_server_capability`
|
||||
//
|
||||
// Possible values:
|
||||
// - true
|
||||
// - false
|
||||
// Default: false
|
||||
//
|
||||
// web_server false
|
||||
// Whether to allow sessions started in the terminal to be shared through a local web server, assuming one is
|
||||
// running (see the `web_server` option for more details).
|
||||
// (Requires restart)
|
||||
//
|
||||
// Note: This is an administrative separation and not intended as a security measure.
|
||||
//
|
||||
// Possible values:
|
||||
// - "on" (allow web sharing through the local web server if it
|
||||
// is online)
|
||||
// - "off" (do not allow web sharing unless sessions explicitly opt-in to it)
|
||||
// - "disabled" (do not allow web sharing and do not permit sessions started in the terminal to opt-in to it)
|
||||
// Default: "off"
|
||||
//
|
||||
// web_sharing "off"
|
||||
// A path to a certificate file to be used when setting up the web client to serve the
|
||||
// connection over HTTPs
|
||||
//
|
||||
// web_server_cert "/path/to/cert.pem"
|
||||
// A path to a key file to be used when setting up the web client to serve the
|
||||
// connection over HTTPs
|
||||
//
|
||||
// web_server_key "/path/to/key.pem"
|
||||
/// Whether to enforce https connections to the web server when it is bound to localhost
|
||||
/// (127.0.0.0/8)
|
||||
///
|
||||
/// Note: https is ALWAYS enforced when bound to non-local interfaces
|
||||
///
|
||||
/// Default: false
|
||||
//
|
||||
// enforce_https_for_localhost false
|
||||
|
||||
// Whether to stack panes when resizing beyond a certain size
|
||||
// Default: true
|
||||
//
|
||||
// stacked_resize false
|
||||
|
||||
// Whether to show tips on startup
|
||||
// Default: true
|
||||
//
|
||||
// show_startup_tips false
|
||||
|
||||
// Whether to show release notes on first version run
|
||||
// Default: true
|
||||
//
|
||||
// show_release_notes false
|
||||
|
||||
// Whether to enable mouse hover effects and pane grouping functionality
|
||||
// default is true
|
||||
// advanced_mouse_actions false
|
||||
|
||||
// The ip address the web server should listen on when it starts
|
||||
// Default: "127.0.0.1"
|
||||
// (Requires restart)
|
||||
// web_server_ip "127.0.0.1"
|
||||
|
||||
// The port the web server should listen on when it starts
|
||||
// Default: 8082
|
||||
// (Requires restart)
|
||||
// web_server_port 8082
|
||||
|
||||
// A command to run (will be wrapped with sh -c and provided the RESURRECT_COMMAND env variable)
|
||||
// after Zellij attempts to discover a command inside a pane when resurrecting sessions, the STDOUT
|
||||
// of this command will be used instead of the discovered RESURRECT_COMMAND
|
||||
// can be useful for removing wrappers around commands
|
||||
// Note: be sure to escape backslashes and similar characters properly
|
||||
// post_command_discovery_hook "echo $RESURRECT_COMMAND | sed <your_regex_here>"
|
||||
105
home/sam/config/zsh/local.zsh
Normal file
105
home/sam/config/zsh/local.zsh
Normal file
@@ -0,0 +1,105 @@
|
||||
export PATH="$HOME/.cargo/bin:$HOME/.atuin/bin:$HOME/.local/bin:$HOME/.fzf/bin:$PATH"
|
||||
#
|
||||
# export OPENAI_API_KEY="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"
|
||||
#
|
||||
# export TAVILY_API_KEY="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"
|
||||
#
|
||||
# #export GEMINI_API_KEY="AIzaSyAoCOjfPH3HigI6aFFAmg9eVhaHMimM7ak"
|
||||
# export DEEPSEEK_API_KEY="sk-26c66e4dd5b34017bd66f7aef748c625"
|
||||
|
||||
|
||||
|
||||
export EDITOR="nvim"
|
||||
export VISUAL="nvim"
|
||||
|
||||
|
||||
export TICKER_WATCH="^GSPC,^DJI,^IXIC,^AXJO,^AORD,CBA.AX,NAB.AX,WBC.AX,ANZ.AX,BHP.AX,RIO.AX,FMG.AX,NST.AX,^VIX,CL=F,NG=F,ZC=F,KE=F,^TNX,BDRY,BTC-USD,DX-Y.NYB,000001.SS,399001.SZ,^HSI,TIO=F,EURUSD=X,AUDUSD=X,GC=F,SI=F,AAPL,MSFT,GOOG,NVDA,AMZN,META,TSLA"
|
||||
export TICKER_REFRESH=120 # Refresh rate in seconds
|
||||
|
||||
|
||||
# This must be at the top for Powerlevel10k Instant Prompt to work.
|
||||
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
|
||||
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
|
||||
fi
|
||||
|
||||
# === Oh My Zsh Configuration ===
|
||||
# Path to your Oh My Zsh installation.
|
||||
export ZSH="$HOME/.oh-my-zsh"
|
||||
|
||||
# Set the Powerlevel10k theme.
|
||||
ZSH_THEME="powerlevel10k/powerlevel10k"
|
||||
|
||||
# Which plugins would you like to load?
|
||||
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
|
||||
|
||||
|
||||
# === Custom PATH Configuration ===
|
||||
# This is the most critical fix. We set the PATH *before* sourcing Oh My Zsh.
|
||||
# This ensures all custom commands are available to the shell and plugins.
|
||||
export PATH="$HOME/.local/bin:$HOME/.fzf/bin:$PATH"
|
||||
|
||||
|
||||
# === Source Oh My Zsh ===
|
||||
# This line loads the Oh My Zsh framework. All customisations must come after this.
|
||||
#source $ZSH/oh-my-zsh.sh
|
||||
|
||||
|
||||
# === Custom Tool Configuration ===
|
||||
# All your custom tools are configured here, after OMZ has loaded.
|
||||
|
||||
# 1. Bat (Better Cat)
|
||||
# On Debian/Ubuntu, the binary is often 'batcat'. If 'bat' is not found,
|
||||
# change this alias to 'batcat'.
|
||||
alias cat='bat --color=always --paging=never'
|
||||
|
||||
# 2. Eza Aliases (Modern replacement for 'ls')
|
||||
alias ls='eza --icons --git'
|
||||
alias ll='eza -l --icons --git'
|
||||
alias la='eza -la --icons --git'
|
||||
alias tree='eza --tree'
|
||||
|
||||
# 3. Zoxide (Smarter cd)
|
||||
eval "$(zoxide init zsh)"
|
||||
|
||||
# 4. Atuin (Shell History)
|
||||
# Your existing Atuin config.
|
||||
eval "$(atuin init zsh)"
|
||||
bindkey '^[[A' atuin-up-search # Up arrow
|
||||
bindkey '^[[B' atuin-down-search # Down arrow
|
||||
|
||||
# 5. FZF (Fuzzy Finder)
|
||||
# The official script handles keybindings (Ctrl+T) and completions.
|
||||
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
|
||||
|
||||
# 6. Carapace (Completion Engine)
|
||||
# This will now work because the PATH is set correctly above.
|
||||
#source <(carapace-bin _carapace zsh)
|
||||
|
||||
|
||||
# === Load Powerlevel10k Theme ===
|
||||
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
|
||||
# This must be the very last thing in your .zshrc
|
||||
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
|
||||
|
||||
alias cat='batcat --color=always --paging=never'
|
||||
|
||||
export ANDROID_HOME=$HOME/android-sdk
|
||||
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools
|
||||
# Source ESP-IDF environment
|
||||
# IMPORTANT: Adjust path if your ESP-IDF installation moves
|
||||
if [ -d "/home/sam/esp/esp-idf" ]; then
|
||||
. "/home/sam/esp/esp-idf/export.sh"
|
||||
fi
|
||||
|
||||
# opencode
|
||||
export PATH=/home/sam/.opencode/bin:$PATH
|
||||
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
|
||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
|
||||
|
||||
if [ -f "$HOME/.config/environment.d/10-secrets.conf" ]; then
|
||||
set -a
|
||||
source "$HOME/.config/environment.d/10-secrets.conf"
|
||||
set +a
|
||||
fi
|
||||
@@ -1,17 +1,234 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
let
|
||||
# Dotfiles live on the installed system itself at: ~/dotfiles
|
||||
dotfilesDir = "${config.home.homeDirectory}/dotfiles";
|
||||
|
||||
# Home Manager helper to symlink files/dirs that live outside the Nix store.
|
||||
mkOOS = config.lib.file.mkOutOfStoreSymlink;
|
||||
in
|
||||
{
|
||||
home.stateVersion = "24.05";
|
||||
xdg.configFile."tickrs/config.yml".source =
|
||||
./config/tickrs/config.yml;
|
||||
|
||||
xdg.configFile."apprise/apprise.yml".source =
|
||||
./config/apprise/apprise.yml;
|
||||
|
||||
xdg.configFile."nvim/init.lua".source = ./nvim/init.lua;
|
||||
xdg.configFile."nvim/lua".source = ./nvim/lua;
|
||||
|
||||
xdg.configFile."atuin" = { source = ./config/atuin; recursive = true; };
|
||||
xdg.configFile."kitty" = { source = ./config/kitty; recursive = true; };
|
||||
xdg.configFile."zellij" = { source = ./config/zellij; recursive = true; };
|
||||
xdg.configFile."lazygit" = { source = ./config/lazygit; recursive = true; };
|
||||
xdg.configFile."btop" = { source = ./config/btop; recursive = true; };
|
||||
xdg.configFile."gh" = { source = ./config/gh; recursive = true; };
|
||||
xdg.configFile."starship.toml".source = ./config/starship.toml;
|
||||
|
||||
xdg.configFile."niri" = { source = ./config/niri; recursive = true; };
|
||||
xdg.configFile."waybar" = { source = ./config/waybar; recursive = true; };
|
||||
xdg.configFile."zsh/local.zsh".source = ./config/zsh/local.zsh;
|
||||
|
||||
home.username = "sam";
|
||||
home.homeDirectory = "/home/sam";
|
||||
home.stateVersion = "25.11";
|
||||
|
||||
|
||||
|
||||
|
||||
services.swaync = {
|
||||
enable = true;
|
||||
settings = {
|
||||
positionX = "right";
|
||||
positionY = "top";
|
||||
control-center-margin-top = 10;
|
||||
control-center-margin-right = 10;
|
||||
control-center-width = 380;
|
||||
notification-window-width = 400;
|
||||
notification-icon-size = 64;
|
||||
notification-body-image-height = 100;
|
||||
notification-body-image-width = 200;
|
||||
timeout = 10;
|
||||
timeout-low = 5;
|
||||
timeout-critical = 0;
|
||||
widgets = [
|
||||
"notifications"
|
||||
"mpris"
|
||||
"volume"
|
||||
"backlight"
|
||||
"buttons-grid"
|
||||
];
|
||||
"widget-config" = {
|
||||
notifications = {
|
||||
"hide-on-clear" = false;
|
||||
"hide-on-action" = true;
|
||||
};
|
||||
mpris = {
|
||||
"image-size" = 96;
|
||||
"image-radius" = 12;
|
||||
};
|
||||
volume = {
|
||||
label = "";
|
||||
};
|
||||
backlight = {
|
||||
label = "";
|
||||
};
|
||||
"buttons-grid" = {
|
||||
actions = [
|
||||
{
|
||||
label = "";
|
||||
command = "systemctl poweroff";
|
||||
}
|
||||
{
|
||||
label = "";
|
||||
command = "systemctl reboot";
|
||||
}
|
||||
{
|
||||
label = "";
|
||||
command = "swaylock";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
# services.mako = {
|
||||
# enable = true;
|
||||
#
|
||||
# # Essential Wayland integration
|
||||
# layer = "overlay"; # Required for Niri
|
||||
# output = ""; # Shows on all outputs
|
||||
#
|
||||
# # Design (matches your Dunst preferences)
|
||||
# font = "JetBrainsMono Nerd Font 10";
|
||||
# backgroundColor = "#1e1e2e";
|
||||
# borderColor = "#89b4fa";
|
||||
# borderSize = 2;
|
||||
# borderRadius = 5;
|
||||
#
|
||||
# # Positioning
|
||||
# anchor = "top-right";
|
||||
# margin = "30,30"; # X,Y from anchor
|
||||
# width = 300;
|
||||
# height = 200;
|
||||
#
|
||||
# # Behavior
|
||||
# defaultTimeout = 10000; # ms
|
||||
# sort = "-time"; # Newest on top-right
|
||||
#
|
||||
# settings = {
|
||||
# "[urgency=high]" = {
|
||||
# background-color = "#f38ba8";
|
||||
# default-timeout = 0;
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
|
||||
|
||||
# Deploy the script to ~/.local/bin (Nix handles creation/permissions)
|
||||
home.file.".local/bin/task-due-notify" = {
|
||||
source = ./bin/task-due-notify.sh;
|
||||
executable = true;
|
||||
};
|
||||
|
||||
systemd.user.timers.task-due-notify = {
|
||||
Unit = {
|
||||
Description = "Timer for Taskwarrior due notifications";
|
||||
};
|
||||
Timer = {
|
||||
OnBootSec = "1min";
|
||||
OnCalendar = "*:*:0/1"; # Every 5 minutes
|
||||
Persistent = true;
|
||||
};
|
||||
Install = {
|
||||
WantedBy = ["timers.target"];
|
||||
};
|
||||
};
|
||||
|
||||
# systemd.user.services.task-due-notify = {
|
||||
# Unit = {
|
||||
# Description = "Check for due Taskwarrior tasks and notify";
|
||||
# };
|
||||
# Service = {
|
||||
# Type = "oneshot";
|
||||
# ExecStart = "${pkgs.bash}/bin/bash${config.home.homeDirectory}/.local/bin/task-due-notify";
|
||||
# };
|
||||
# };
|
||||
# Systemd user timer to run the service periodically
|
||||
# systemd.user.timers.task-due-notify = {
|
||||
# Unit = {
|
||||
# Description = "Timer for Taskwarrior due notifications";
|
||||
# };
|
||||
# Timer = {
|
||||
# OnBootSec = "1min";
|
||||
# OnUnitActiveSec = "1min";
|
||||
# AccuracySec = "30s";
|
||||
# Persistent = true;
|
||||
# };
|
||||
# Install = {
|
||||
# WantedBy = ["timers.target"];
|
||||
# };
|
||||
# };
|
||||
|
||||
systemd.user.services.task-due-notify = {
|
||||
Unit = {
|
||||
Description = "Check for due Taskwarrior tasks and notify";
|
||||
};
|
||||
Service = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${pkgs.bash}/bin/bash ${config.home.homeDirectory}/.local/bin/task-due-notify";
|
||||
Environment = [
|
||||
"PATH=${pkgs.gnugrep}/bin:${pkgs.gnused}/bin:${pkgs.coreutils}/bin:${pkgs.taskwarrior3}/bin:${pkgs.jq}/bin:${pkgs.curl}/bin:${pkgs.libnotify}/bin:/usr/bin:/bin"
|
||||
"DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
systemd.user.services.kdeconnect-indicator = {
|
||||
Unit = {
|
||||
Description = "KDE Connect indicator";
|
||||
};
|
||||
|
||||
Service = {
|
||||
Type = "simple";
|
||||
ExecStart = "${pkgs.kdePackages.kdeconnect-kde}/bin/kdeconnect-indicator";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "2s";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "default.target" ];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
systemd.user.services.vorta = {
|
||||
Unit = {
|
||||
Description = "Vorta (BorgBackup GUI)";
|
||||
};
|
||||
|
||||
Service = {
|
||||
Type = "simple";
|
||||
ExecStart = ''
|
||||
${pkgs.bash}/bin/bash -lc 'for i in $(seq 1 100); do for s in "$XDG_RUNTIME_DIR"/wayland-*; do if [ -S "$s" ]; then exec ${pkgs.vorta}/bin/vorta; fi; done; sleep 0.2; done; exit 1'
|
||||
'';
|
||||
Restart = "on-failure";
|
||||
RestartSec = "2s";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "default.target" ];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
|
||||
dconf.settings."org/gnome/desktop/interface" = {
|
||||
color-scheme = "prefer-dark";
|
||||
};
|
||||
|
||||
|
||||
# ---
|
||||
# Shell (zsh + oh-my-zsh + powerlevel10k)
|
||||
# ---
|
||||
@@ -22,7 +239,7 @@ in
|
||||
|
||||
oh-my-zsh = {
|
||||
enable = true;
|
||||
theme = "powerlevel10k/powerlevel10k";
|
||||
theme = "robbyrussell";
|
||||
plugins = [ "git" ];
|
||||
};
|
||||
|
||||
@@ -34,24 +251,18 @@ in
|
||||
cat = "bat --color=always --paging=never";
|
||||
};
|
||||
|
||||
# Dotfiles integration notes:
|
||||
# - Home Manager manages ~/.zshrc; do not symlink ~/.zshrc directly.
|
||||
# - If you want to source additional Zsh snippets from ~/dotfiles, tell me
|
||||
# the exact filename(s) and we’ll add them safely here.
|
||||
|
||||
initExtra = ''
|
||||
# Optional: source additional Zsh config from ~/dotfiles if desired.
|
||||
# Example (uncomment + adjust if you confirm the exact file path):
|
||||
# if [ -f "${dotfilesDir}/zsh/extra.zsh" ]; then
|
||||
# source "${dotfilesDir}/zsh/extra.zsh"
|
||||
# fi
|
||||
if [ -f "$HOME/.config/zsh/local.zsh" ]; then
|
||||
source "$HOME/.config/zsh/local.zsh"
|
||||
fi
|
||||
# carapace completions
|
||||
if command -v carapace >/dev/null 2>&1; then
|
||||
eval "$(carapace _carapace zsh)"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
programs.powerlevel10k = {
|
||||
enable = true;
|
||||
# If you have a real p10k config file in dotfiles, tell me its exact path.
|
||||
# Then we can symlink it to ~/.p10k.zsh (or source it) reliably.
|
||||
};
|
||||
|
||||
# ---
|
||||
# Shell tools
|
||||
@@ -74,32 +285,144 @@ in
|
||||
# ---
|
||||
# Terminal / editor
|
||||
# ---
|
||||
programs.kitty.enable = true;
|
||||
# programs.kitty.enable = true;
|
||||
|
||||
programs.neovim = {
|
||||
enable = true;
|
||||
defaultEditor = true;
|
||||
extraPackages = with pkgs; [ tree-sitter gcc gnumake];
|
||||
};
|
||||
|
||||
|
||||
programs.yazi = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
enableBashIntegration = true;
|
||||
# This sets the command name for the wrapper.
|
||||
# Many people use 'y' or 'yy' for quick access.
|
||||
shellWrapperName = "y";
|
||||
};
|
||||
|
||||
home.sessionVariables = {
|
||||
QT_QPA_PLATFORM = "wayland";
|
||||
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
||||
};
|
||||
|
||||
gtk = {
|
||||
enable = true;
|
||||
theme = {
|
||||
name = "Adwaita-dark";
|
||||
package = pkgs.gnome-themes-extra;
|
||||
};
|
||||
iconTheme = {
|
||||
name = "breeze-dark";
|
||||
package = pkgs.kdePackages.breeze-icons;
|
||||
};
|
||||
};
|
||||
|
||||
qt = {
|
||||
enable = true;
|
||||
platformTheme.name = "gtk3";
|
||||
style.name = "adwaita-dark";
|
||||
};
|
||||
|
||||
|
||||
|
||||
# ---
|
||||
# Packages (NOW list + a few safe essentials)
|
||||
# ---
|
||||
home.packages = with pkgs; [
|
||||
|
||||
|
||||
# Input device support
|
||||
libinput
|
||||
seatd
|
||||
|
||||
# Audio controls
|
||||
pamixer
|
||||
playerctl
|
||||
|
||||
# Network
|
||||
networkmanagerapplet
|
||||
|
||||
# System Monitoring
|
||||
swaynotificationcenter # For notification daemon
|
||||
|
||||
|
||||
|
||||
libnotify
|
||||
|
||||
kdePackages.dolphin
|
||||
kdePackages.kio-extras
|
||||
kdePackages.kdegraphics-thumbnailers
|
||||
kdePackages.ffmpegthumbs
|
||||
kdePackages.ark
|
||||
|
||||
adwaita-qt
|
||||
adwaita-qt6
|
||||
kdePackages.breeze-icons
|
||||
|
||||
nushell
|
||||
bun
|
||||
pnpm
|
||||
vite
|
||||
|
||||
|
||||
# CLI tools
|
||||
# python3Packages.autogpt
|
||||
# agentops
|
||||
|
||||
|
||||
(callPackage ../../pkgs/cao-cli.nix { })
|
||||
|
||||
ollama
|
||||
|
||||
tickrs
|
||||
taskwarrior3
|
||||
taskwarrior-tui
|
||||
glow
|
||||
pandoc
|
||||
texlive.combined.scheme-small
|
||||
swaybg
|
||||
zathura
|
||||
zathuraPkgs.zathura_pdf_mupdf
|
||||
swayimg
|
||||
qimgv
|
||||
tmux
|
||||
vorta
|
||||
borgbackup
|
||||
carapace
|
||||
aider-chat
|
||||
opencode
|
||||
goose-cli
|
||||
gemini-cli-bin
|
||||
|
||||
lua-language-server
|
||||
marksman
|
||||
nodePackages.typescript
|
||||
nodePackages.typescript-language-server
|
||||
|
||||
|
||||
nodejs
|
||||
python3
|
||||
python3Packages.pynvim
|
||||
git
|
||||
curl
|
||||
wget
|
||||
|
||||
tgpt
|
||||
|
||||
eza
|
||||
bat
|
||||
ripgrep
|
||||
fd
|
||||
|
||||
ticker
|
||||
btop
|
||||
lazygit
|
||||
zellij
|
||||
tealdeer
|
||||
navi
|
||||
yazi
|
||||
# yazi
|
||||
dua
|
||||
jq
|
||||
|
||||
@@ -108,29 +431,4 @@ in
|
||||
p7zip
|
||||
];
|
||||
|
||||
# ---
|
||||
# Dotfiles (out-of-store symlinks from ~/dotfiles)
|
||||
# ---
|
||||
# IMPORTANT:
|
||||
# - These symlinks will point into ~/dotfiles.
|
||||
# - Ensure you clone/copy your dotfiles to ~/dotfiles on the new system.
|
||||
home.file.".config/atuin".source = mkOOS "${dotfilesDir}/atuin";
|
||||
home.file.".config/kitty".source = mkOOS "${dotfilesDir}/kitty";
|
||||
home.file.".config/nvim".source = mkOOS "${dotfilesDir}/nvim";
|
||||
home.file.".config/zellij".source = mkOOS "${dotfilesDir}/zellij";
|
||||
|
||||
# TODO (needs confirmation from you):
|
||||
# - zsh dotfiles: what exact files do you want sourced?
|
||||
# - pk10k: what is the exact filename for your p10k config?
|
||||
#
|
||||
# Once you confirm, we can add e.g.:
|
||||
# home.file.".p10k.zsh".source = mkOOS "${dotfilesDir}/pk10k/.p10k.zsh";
|
||||
|
||||
# ---
|
||||
# Secrets policy
|
||||
# ---
|
||||
# Do NOT put API keys here (or anywhere in git).
|
||||
# Preferred approach (local-only):
|
||||
# ~/.config/environment.d/10-secrets.conf
|
||||
# or add sops-nix later.
|
||||
}
|
||||
|
||||
2
home/sam/nvim/init.lua
Executable file
2
home/sam/nvim/init.lua
Executable file
@@ -0,0 +1,2 @@
|
||||
require("sam.options")
|
||||
require("sam.lazy")
|
||||
42
home/sam/nvim/lazy-lock.json
Executable file
42
home/sam/nvim/lazy-lock.json
Executable file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
|
||||
"LuaSnip": { "branch": "master", "commit": "3732756842a2f7e0e76a7b0487e9692072857277" },
|
||||
"avante.nvim": { "branch": "main", "commit": "ca95e0386433da2077184719886fa658257261a3" },
|
||||
"catppuccin": { "branch": "main", "commit": "234fc048de931a0e42ebcad675bf6559d75e23df" },
|
||||
"cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
|
||||
"cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
|
||||
"cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
|
||||
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
|
||||
"conform.nvim": { "branch": "master", "commit": "cde4da5c1083d3527776fee69536107d98dae6c9" },
|
||||
"dracula.nvim": { "branch": "main", "commit": "ae752c13e95fb7c5f58da4b5123cb804ea7568ee" },
|
||||
"dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" },
|
||||
"everforest-nvim": { "branch": "main", "commit": "557bce922401e247a596583679bc181d4d688554" },
|
||||
"gitsigns.nvim": { "branch": "main", "commit": "20ad4419564d6e22b189f6738116b38871082332" },
|
||||
"gruvbox.nvim": { "branch": "main", "commit": "5e0a460d8e0f7f669c158dedd5f9ae2bcac31437" },
|
||||
"kanagawa.nvim": { "branch": "master", "commit": "aef7f5cec0a40dbe7f3304214850c472e2264b10" },
|
||||
"lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" },
|
||||
"live-preview.nvim": { "branch": "main", "commit": "a1bb1b3a851df5276e53908276f5ae1d724d4812" },
|
||||
"lualine.nvim": { "branch": "master", "commit": "3946f0122255bc377d14a59b27b609fb3ab25768" },
|
||||
"mason-lspconfig.nvim": { "branch": "main", "commit": "b1d9a914b02ba5660f1e272a03314b31d4576fe2" },
|
||||
"mason.nvim": { "branch": "main", "commit": "57e5a8addb8c71fb063ee4acda466c7cf6ad2800" },
|
||||
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
|
||||
"nvim-autopairs": { "branch": "master", "commit": "7a2c97cccd60abc559344042fefb1d5a85b3e33b" },
|
||||
"nvim-cmp": { "branch": "main", "commit": "106c4bcc053a5da783bf4a9d907b6f22485c2ea0" },
|
||||
"nvim-dap": { "branch": "master", "commit": "b38f7d30366d9169d0a623c4c85fbcf99d8d58bb" },
|
||||
"nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" },
|
||||
"nvim-lint": { "branch": "master", "commit": "2536f1b18ea389e6b078b3a47a5e273c74a46a34" },
|
||||
"nvim-lspconfig": { "branch": "master", "commit": "cc3d02065593d74b2fa7c0ff337c3e8b087fd788" },
|
||||
"nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" },
|
||||
"nvim-tree.lua": { "branch": "master", "commit": "1eda2569394f866360e61f590f1796877388cb8a" },
|
||||
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
|
||||
"nvim-web-devicons": { "branch": "master", "commit": "8dcb311b0c92d460fac00eac706abd43d94d68af" },
|
||||
"onedark.nvim": { "branch": "master", "commit": "6c10964f91321c6a0f09bcc41dd64e7a6602bc4f" },
|
||||
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
|
||||
"tabular": { "branch": "master", "commit": "12437cd1b53488e24936ec4b091c9324cafee311" },
|
||||
"telescope-themes": { "branch": "main", "commit": "65721365bd7a04a6c9679e76b6387b60320fd5f3" },
|
||||
"telescope.nvim": { "branch": "master", "commit": "3a12a853ebf21ec1cce9a92290e3013f8ae75f02" },
|
||||
"tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" },
|
||||
"vim-markdown": { "branch": "master", "commit": "1bc9d0cd8e1cc3e901b0a49c2b50a843f1c89397" },
|
||||
"vimtex": { "branch": "master", "commit": "32bcb3922c20588e00de68f73c86312eda2141ad" },
|
||||
"which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }
|
||||
}
|
||||
1
home/sam/nvim/lua/current-theme.lua
Executable file
1
home/sam/nvim/lua/current-theme.lua
Executable file
@@ -0,0 +1 @@
|
||||
vim.cmd("colorscheme kanagawa-wave")
|
||||
20
home/sam/nvim/lua/sam/lazy.lua
Executable file
20
home/sam/nvim/lua/sam/lazy.lua
Executable file
@@ -0,0 +1,20 @@
|
||||
-- ~/.config/nvim/lua/sam/lazy.lua
|
||||
|
||||
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||
if not vim.loop.fs_stat(lazypath) then
|
||||
vim.fn.system({
|
||||
"git",
|
||||
"clone",
|
||||
"--filter=blob:none",
|
||||
"https://github.com/folke/lazy.nvim.git",
|
||||
"--branch=stable", -- latest stable release
|
||||
lazypath,
|
||||
})
|
||||
end
|
||||
vim.opt.rtp:prepend(lazypath)
|
||||
|
||||
-- Tell lazy to load our plugin specs from the "plugins" directory
|
||||
require("lazy").setup("sam.plugins", {
|
||||
install = { missing = true },
|
||||
lockfile = vim.fn.stdpath("data") .. "/lazy-lock.json",
|
||||
})
|
||||
92
home/sam/nvim/lua/sam/options.lua
Executable file
92
home/sam/nvim/lua/sam/options.lua
Executable file
@@ -0,0 +1,92 @@
|
||||
-- ~/.config/nvim/lua/sam/options.lua
|
||||
|
||||
vim.g.mapleader = " " -- Set the leader key to the space bar.
|
||||
vim.g.maplocalleader = " " -- Set the local leader key to the space bar.
|
||||
-- sam.options.lua
|
||||
vim.opt.number = true -- Absolute numbers on all lines
|
||||
vim.opt.relativenumber = true -- Relative numbers (hybrid when both enabled)
|
||||
|
||||
-- ===================================================================
|
||||
-- Clipboard Settings (Added)
|
||||
-- ===================================================================
|
||||
|
||||
-- Sync with system clipboard
|
||||
vim.opt.clipboard = "unnamedplus"
|
||||
|
||||
-- OSC 52 Support for SSH (Copy from Remote Nvim -> Local Computer)
|
||||
if vim.env.SSH_TTY then
|
||||
vim.g.clipboard = {
|
||||
name = 'OSC 52',
|
||||
copy = {
|
||||
['+'] = require('vim.ui.clipboard.osc52').copy('+'),
|
||||
['*'] = require('vim.ui.clipboard.osc52').copy('*'),
|
||||
},
|
||||
paste = {
|
||||
['+'] = require('vim.ui.clipboard.osc52').paste('+'),
|
||||
['*'] = require('vim.ui.clipboard.osc52').paste('*'),
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
-- ===================================================================
|
||||
-- Search Settings
|
||||
-- ===================================================================
|
||||
|
||||
vim.opt.hlsearch = true -- Highlight all matches on search
|
||||
vim.opt.incsearch = true -- Show search results incrementally as you type
|
||||
vim.opt.ignorecase = true -- Ignore case in search patterns
|
||||
vim.opt.smartcase = true -- Override ignorecase if search pattern contains uppercase letters
|
||||
|
||||
-- ===================================================================
|
||||
-- Essential Keybindings
|
||||
-- ===================================================================
|
||||
|
||||
-- Set a timeout for which-key to respond (in milliseconds)
|
||||
vim.opt.timeoutlen = 300
|
||||
|
||||
-- A helper function to make setting keymaps easier
|
||||
local keymap = function(mode, lhs, rhs, opts)
|
||||
local options = { noremap = true, silent = true }
|
||||
if opts then
|
||||
options = vim.tbl_extend("force", options, opts)
|
||||
end
|
||||
vim.api.nvim_set_keymap(mode, lhs, rhs, options)
|
||||
end
|
||||
|
||||
vim.api.nvim_create_autocmd("BufWritePost", {
|
||||
group = vim.api.nvim_create_augroup("VimtexCompile", { clear = true }),
|
||||
pattern = "*.tex",
|
||||
callback = function()
|
||||
vim.cmd("VimtexCompile")
|
||||
end,
|
||||
})
|
||||
|
||||
-- --- General ---
|
||||
-- Save the current file
|
||||
keymap("n", "<leader>w", ":w<CR>", { desc = "Write (Save) File" })
|
||||
|
||||
-- Quit the current buffer/window
|
||||
keymap("n", "<leader>q", ":q<CR>", { desc = "Quit Window" })
|
||||
|
||||
-- --- Window Management (Splits) ---
|
||||
-- Split window vertically
|
||||
keymap("n", "<leader>sv", "<C-w>v", { desc = "Split Vertically" })
|
||||
|
||||
-- Split window horizontally
|
||||
keymap("n", "<leader>sh", "<C-w>s", { desc = "Split Horizontally" })
|
||||
|
||||
-- --- Navigation Between Splits ---
|
||||
-- Move to the window below/above/left/right
|
||||
keymap("n", "<C-j>", "<C-w>j", { desc = "Move to Window Below" })
|
||||
keymap("n", "<C-k>", "<C-w>k", { desc = "Move to Window Above" })
|
||||
keymap("n", "<C-h>", "<C-w>h", { desc = "Move to Window Left" })
|
||||
keymap("n", "<C-l>", "<C-w>l", { desc = "Move to Window Right" })
|
||||
|
||||
-- --- Buffer Navigation ---
|
||||
-- Go to the next buffer
|
||||
keymap("n", "<S-l>", ":bnext<CR>", { desc = "Next Buffer" })
|
||||
|
||||
-- Go to the previous buffer
|
||||
keymap("n", "<S-h>", ":bprevious<CR>", { desc = "Previous Buffer" })
|
||||
vim.keymap.set({'n', 'i', 'v'}, '<F14>', '<C-V>', { desc = 'Enter Visual Block' })
|
||||
vim.keymap.set({'n', 'i'}, '<F15>', 'V', { desc = 'Enter Visual Line' })
|
||||
7
home/sam/nvim/lua/sam/plugins/autopairs.lua
Executable file
7
home/sam/nvim/lua/sam/plugins/autopairs.lua
Executable file
@@ -0,0 +1,7 @@
|
||||
return {
|
||||
"windwp/nvim-autopairs",
|
||||
event = "InsertEnter",
|
||||
config = function()
|
||||
require("nvim-autopairs").setup({})
|
||||
end,
|
||||
}
|
||||
39
home/sam/nvim/lua/sam/plugins/cmp.lua
Executable file
39
home/sam/nvim/lua/sam/plugins/cmp.lua
Executable file
@@ -0,0 +1,39 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/cmp.lua
|
||||
|
||||
return {
|
||||
"hrsh7th/nvim-cmp",
|
||||
dependencies = {
|
||||
"hrsh7th/cmp-nvim-lsp", -- Source for LSP completions
|
||||
"hrsh7th/cmp-buffer", -- Source for buffer completions
|
||||
"hrsh7th/cmp-path", -- Source for path completions
|
||||
"L3MON4D3/LuaSnip", -- Snippet engine
|
||||
"saadparwaiz1/cmp_luasnip", -- Bridge for snippet engine
|
||||
},
|
||||
config = function()
|
||||
local cmp = require("cmp")
|
||||
local luasnip = require("luasnip")
|
||||
|
||||
cmp.setup({
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
luasnip.lsp_expand(args.body)
|
||||
end,
|
||||
},
|
||||
mapping = cmp.mapping.preset.insert({
|
||||
["<C-k>"] = cmp.mapping.select_prev_item(), -- Previous item
|
||||
["<C-j>"] = cmp.mapping.select_next_item(), -- Next item
|
||||
["<C-b>"] = cmp.mapping.scroll_docs(-4),
|
||||
["<C-f>"] = cmp.mapping.scroll_docs(4),
|
||||
["<C-Space>"] = cmp.mapping.complete(), -- Trigger completion
|
||||
["<CR>"] = cmp.mapping.confirm({ select = true }), -- Confirm selection
|
||||
}),
|
||||
-- The sources for completion
|
||||
sources = cmp.config.sources({
|
||||
{ name = "nvim_lsp" },
|
||||
{ name = "luasnip" },
|
||||
{ name = "buffer" },
|
||||
{ name = "path" },
|
||||
}),
|
||||
})
|
||||
end,
|
||||
}
|
||||
22
home/sam/nvim/lua/sam/plugins/codecompanion.lua
Normal file
22
home/sam/nvim/lua/sam/plugins/codecompanion.lua
Normal file
@@ -0,0 +1,22 @@
|
||||
return {
|
||||
"olimorris/codecompanion.nvim",
|
||||
dependencies = { "nvim-lua/plenary.nvim" },
|
||||
config = function()
|
||||
local openai = require("codecompanion.adapters").extend("openai", {
|
||||
env = {
|
||||
api_key = "OPENROUTER_API_KEY",
|
||||
url = "https://openrouter.ai/api/v1",
|
||||
},
|
||||
})
|
||||
|
||||
require("codecompanion").setup({
|
||||
adapters = {
|
||||
openai = openai,
|
||||
},
|
||||
strategies = {
|
||||
chat = { adapter = "openai" },
|
||||
inline = { adapter = "openai" },
|
||||
},
|
||||
})
|
||||
end,
|
||||
}
|
||||
11
home/sam/nvim/lua/sam/plugins/colorscheme.lua
Executable file
11
home/sam/nvim/lua/sam/plugins/colorscheme.lua
Executable file
@@ -0,0 +1,11 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/colorscheme.lua
|
||||
|
||||
return {
|
||||
"catppuccin/nvim",
|
||||
name = "catppuccin",
|
||||
priority = 1000, -- Make sure to load this before all the other start plugins
|
||||
config = function()
|
||||
-- load the colorscheme here
|
||||
vim.cmd.colorscheme("catppuccin")
|
||||
end,
|
||||
}
|
||||
6
home/sam/nvim/lua/sam/plugins/comment.lua
Executable file
6
home/sam/nvim/lua/sam/plugins/comment.lua
Executable file
@@ -0,0 +1,6 @@
|
||||
return {
|
||||
"numToStr/Comment.nvim",
|
||||
config = function()
|
||||
require("Comment").setup()
|
||||
end,
|
||||
}
|
||||
20
home/sam/nvim/lua/sam/plugins/dap.lua
Executable file
20
home/sam/nvim/lua/sam/plugins/dap.lua
Executable file
@@ -0,0 +1,20 @@
|
||||
return {
|
||||
"mfussenegger/nvim-dap",
|
||||
dependencies = {
|
||||
-- Installs the beautiful UI for DAP
|
||||
"rcarriga/nvim-dap-ui",
|
||||
-- Required by dap-ui
|
||||
"nvim-neotest/nvim-nio",
|
||||
},
|
||||
config = function()
|
||||
local dap, dapui = require("dap"), require("dapui")
|
||||
dapui.setup()
|
||||
|
||||
-- Add your keymaps for debugging here
|
||||
vim.keymap.set("n", "<Leader>db", dap.toggle_breakpoint, { desc = "Toggle Breakpoint" })
|
||||
vim.keymap.set("n", "<Leader>dc", dap.continue, { desc = "Continue" })
|
||||
vim.keymap.set("n", "<Leader>do", dap.step_over, { desc = "Step Over" })
|
||||
vim.keymap.set("n", "<Leader>di", dap.step_into, { desc = "Step Into" })
|
||||
vim.keymap.set("n", "<Leader>du", dapui.toggle, { desc = "Toggle DAP UI" })
|
||||
end,
|
||||
}
|
||||
14
home/sam/nvim/lua/sam/plugins/filetree.lua
Executable file
14
home/sam/nvim/lua/sam/plugins/filetree.lua
Executable file
@@ -0,0 +1,14 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/filetree.lua
|
||||
|
||||
return {
|
||||
"nvim-tree/nvim-tree.lua",
|
||||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||
config = function()
|
||||
require("nvim-tree").setup({})
|
||||
|
||||
-- A keymap to toggle the file tree
|
||||
vim.keymap.set("n", "<leader>e", ":NvimTreeToggle<CR>", {
|
||||
desc = "Toggle file explorer",
|
||||
})
|
||||
end,
|
||||
}
|
||||
34
home/sam/nvim/lua/sam/plugins/formatter.lua
Executable file
34
home/sam/nvim/lua/sam/plugins/formatter.lua
Executable file
@@ -0,0 +1,34 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/formatter.lua
|
||||
|
||||
return {
|
||||
"stevearc/conform.nvim",
|
||||
config = function()
|
||||
require("conform").setup({
|
||||
formatters_by_ft = {
|
||||
-- Web
|
||||
javascript = { "prettier" },
|
||||
typescript = { "prettier" },
|
||||
javascriptreact = { "prettier" },
|
||||
typescriptreact = { "prettier" },
|
||||
html = { "prettier" },
|
||||
css = { "prettier" },
|
||||
json = { "prettier" },
|
||||
yaml = { "prettier" },
|
||||
markdown = { "prettier" },
|
||||
sh = { "shfmt" }, -- << ADD THIS LINE
|
||||
bash = { "shfmt" }, -- << AND THIS ONE
|
||||
-- PHP
|
||||
php = { "pint" },
|
||||
-- Python
|
||||
python = { "black" },
|
||||
-- Lua (for our config)
|
||||
lua = { "stylua" },
|
||||
},
|
||||
})
|
||||
|
||||
-- A keymap to trigger formatting
|
||||
vim.keymap.set({ "n", "v" }, "<leader>f", function()
|
||||
require("conform").format({ async = true, lsp_fallback = true })
|
||||
end, { desc = "Format code" })
|
||||
end,
|
||||
}
|
||||
17
home/sam/nvim/lua/sam/plugins/gitsigns.lua
Executable file
17
home/sam/nvim/lua/sam/plugins/gitsigns.lua
Executable file
@@ -0,0 +1,17 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/gitsigns.lua
|
||||
|
||||
return {
|
||||
"lewis6991/gitsigns.nvim",
|
||||
config = function()
|
||||
require("gitsigns").setup({
|
||||
-- You can configure the signs here if you want
|
||||
-- signs = {
|
||||
-- add = { text = '+' },
|
||||
-- change = { text = '~' },
|
||||
-- delete = { text = '_' },
|
||||
-- topdelete = { text = '‾' },
|
||||
-- changedelete = { text = '~' },
|
||||
-- },
|
||||
})
|
||||
end,
|
||||
}
|
||||
5
home/sam/nvim/lua/sam/plugins/icons.lua
Executable file
5
home/sam/nvim/lua/sam/plugins/icons.lua
Executable file
@@ -0,0 +1,5 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/icons.lua
|
||||
|
||||
return {
|
||||
"nvim-tree/nvim-web-devicons",
|
||||
}
|
||||
16
home/sam/nvim/lua/sam/plugins/lint.lua
Executable file
16
home/sam/nvim/lua/sam/plugins/lint.lua
Executable file
@@ -0,0 +1,16 @@
|
||||
return {
|
||||
"mfussenegger/nvim-lint",
|
||||
event = "VeryLazy",
|
||||
config = function()
|
||||
require("lint").linters_by_ft = {
|
||||
-- You can add your languages here. Examples:
|
||||
-- javascript = { "eslint_d" },
|
||||
-- python = { "ruff" },
|
||||
}
|
||||
vim.api.nvim_create_autocmd({ "BufWritePost" }, {
|
||||
callback = function()
|
||||
require("lint").try_lint()
|
||||
end,
|
||||
})
|
||||
end,
|
||||
}
|
||||
97
home/sam/nvim/lua/sam/plugins/lsp.lua
Executable file
97
home/sam/nvim/lua/sam/plugins/lsp.lua
Executable file
@@ -0,0 +1,97 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/lsp.lua (emmet-ls for HTML Tag Completion + No Warning)
|
||||
|
||||
return {
|
||||
"neovim/nvim-lspconfig",
|
||||
dependencies = {
|
||||
"williamboman/mason.nvim",
|
||||
"williamboman/mason-lspconfig.nvim",
|
||||
"hrsh7th/nvim-cmp",
|
||||
},
|
||||
config = function()
|
||||
local capabilities = require("cmp_nvim_lsp").default_capabilities()
|
||||
local on_attach = function(client, bufnr)
|
||||
-- LSP keymaps
|
||||
local nmap = function(keys, func, desc)
|
||||
vim.keymap.set("n", keys, func, { buffer = bufnr, desc = "LSP: " .. desc })
|
||||
end
|
||||
nmap("gD", vim.lsp.buf.declaration, "Go to Declaration")
|
||||
nmap("gd", vim.lsp.buf.definition, "Go to Definition")
|
||||
nmap("K", vim.lsp.buf.hover, "Hover Documentation")
|
||||
nmap("<leader>rn", vim.lsp.buf.rename, "Rename Symbol")
|
||||
nmap("<leader>ca", vim.lsp.buf.code_action, "Code Action")
|
||||
end
|
||||
|
||||
require("mason").setup()
|
||||
|
||||
-- ADDING THE NEW LSP SERVERS HERE (emmet_ls replaces html for better tags)
|
||||
local servers = {
|
||||
"intelephense", -- PHP
|
||||
"pyright", -- Python
|
||||
"ts_ls", -- TS/JS
|
||||
"clangd", -- C++
|
||||
"lua_ls", -- Lua
|
||||
"emmet_ls", -- HTML/CSS (for tag completion/snippets)
|
||||
"jsonls", -- JSON
|
||||
"yamlls", -- YAML
|
||||
"marksman", -- Markdown
|
||||
"bashls",
|
||||
}
|
||||
local mason_lspconfig = require("mason-lspconfig")
|
||||
mason_lspconfig.setup({
|
||||
ensure_installed = servers,
|
||||
handlers = {
|
||||
-- Global handler using new vim.lsp.config API (no global lspconfig require)
|
||||
function(server_name)
|
||||
vim.lsp.config(server_name, {
|
||||
on_attach = on_attach,
|
||||
capabilities = capabilities,
|
||||
root_dir = function(fname)
|
||||
if type(fname) ~= "string" then
|
||||
return vim.fn.getcwd()
|
||||
end
|
||||
local util = require("lspconfig.util")
|
||||
return util.root_pattern(".git", "composer.json", "package.json")(fname)
|
||||
or util.path.dirname(fname)
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
})
|
||||
|
||||
-- emmet-ls Specific Setup (for HTML/CSS tag completion + snippets)
|
||||
vim.lsp.config("emmet_ls", {
|
||||
on_attach = on_attach,
|
||||
capabilities = vim.tbl_deep_extend("force", capabilities, {
|
||||
textDocument = {
|
||||
completion = {
|
||||
completionItem = {
|
||||
snippetSupport = true, -- Enables <div> → <div></div> + Emmet expansions
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
filetypes = { "html", "css", "javascriptreact", "typescriptreact" }, -- Broad for web files
|
||||
root_dir = function(fname)
|
||||
if type(fname) ~= "string" then
|
||||
return vim.fn.getcwd()
|
||||
end
|
||||
local util = require("lspconfig.util")
|
||||
return util.root_pattern(".git", "package.json")(fname)
|
||||
or util.path.dirname(fname)
|
||||
end,
|
||||
init_options = {
|
||||
html = {
|
||||
options = {
|
||||
["bem.enabled"] = true, -- Optional: BEM naming support
|
||||
},
|
||||
completions = true,
|
||||
format = true,
|
||||
extractColors = true,
|
||||
includeLanguages = {
|
||||
javascript = "javascriptreact",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
}
|
||||
9
home/sam/nvim/lua/sam/plugins/lualine.lua
Executable file
9
home/sam/nvim/lua/sam/plugins/lualine.lua
Executable file
@@ -0,0 +1,9 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/lualine.lua
|
||||
|
||||
return {
|
||||
"nvim-lualine/lualine.nvim",
|
||||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||
config = function()
|
||||
require("lualine").setup({})
|
||||
end,
|
||||
}
|
||||
75
home/sam/nvim/lua/sam/plugins/markdown.lua
Executable file
75
home/sam/nvim/lua/sam/plugins/markdown.lua
Executable file
@@ -0,0 +1,75 @@
|
||||
return {
|
||||
-- Enhanced Markdown editing (only for .md)
|
||||
{
|
||||
"godlygeek/tabular",
|
||||
ft = "markdown",
|
||||
},
|
||||
{
|
||||
"plasticboy/vim-markdown",
|
||||
ft = "markdown",
|
||||
dependencies = { "godlygeek/tabular" },
|
||||
config = function()
|
||||
-- Core settings
|
||||
vim.g.vim_markdown_folding_disabled = 0
|
||||
vim.g.vim_markdown_conceal = 1
|
||||
vim.g.vim_markdown_toc_autofit = 1
|
||||
vim.g.vim_markdown_strikethrough = 1
|
||||
|
||||
-- Prose-friendly wrapping + Pandoc exports (MD only)
|
||||
vim.api.nvim_create_autocmd("FileType", {
|
||||
pattern = "markdown",
|
||||
callback = function()
|
||||
-- Wrapping
|
||||
vim.opt_local.wrap = true
|
||||
vim.opt_local.linebreak = true
|
||||
vim.opt_local.list = false
|
||||
|
||||
-- HTML preview/export
|
||||
vim.keymap.set("n", "<leader>mh", function()
|
||||
local input = vim.fn.expand("%")
|
||||
local output = "/tmp/" .. vim.fn.fnamemodify(input, ":t:r") .. ".html"
|
||||
vim.fn.system("pandoc " .. vim.fn.shellescape(input) .. " -o " .. vim.fn.shellescape(output) .. " --standalone --self-contained")
|
||||
vim.fn.system("open " .. vim.fn.shellescape(output))
|
||||
end, { desc = "Markdown to HTML Preview", buffer = true })
|
||||
|
||||
-- PDF export
|
||||
vim.keymap.set("n", "<leader>mp", function()
|
||||
local input = vim.fn.expand("%")
|
||||
local output = vim.fn.fnamemodify(input, ":r") .. ".pdf"
|
||||
vim.fn.system("pandoc " .. vim.fn.shellescape(input) .. " -o " .. vim.fn.shellescape(output) .. " --pdf-engine=pdflatex")
|
||||
end, { desc = "Markdown to PDF", buffer = true })
|
||||
|
||||
-- TOC preview
|
||||
vim.keymap.set("n", "<leader>mt", ":!pandoc % --toc -o /tmp/toc.html && open /tmp/toc.html<CR>", { desc = "Generate TOC Preview", buffer = true })
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- Live browser preview (MD + HTML)
|
||||
{
|
||||
"brianhuster/live-preview.nvim",
|
||||
dependencies = { "nvim-telescope/telescope.nvim" },
|
||||
ft = { "markdown", "html" }, -- Load for both
|
||||
lazy = false,
|
||||
opts = {
|
||||
usage_title = "Usage: <leader>lp to start preview",
|
||||
picker_title = "Select file to preview",
|
||||
templates = { -- Basic MD render (for .md); HTML serves raw
|
||||
md = {
|
||||
command = "pandoc % -o /tmp/preview.html --standalone --self-contained", -- Use Pandoc for MD
|
||||
extension = "html"
|
||||
},
|
||||
html = {
|
||||
command = "echo 'Serving raw HTML'", -- No-op; serves file directly
|
||||
extension = "html"
|
||||
}
|
||||
},
|
||||
debounce = 300, -- Refresh delay post-save
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>lp", "<cmd>LivePreview start<cr>", desc = "Start Live Preview", ft = { "markdown", "html" } },
|
||||
{ "<leader>ls", "<cmd>LivePreview stop<cr>", desc = "Stop Live Preview", ft = { "markdown", "html" } },
|
||||
},
|
||||
},
|
||||
}
|
||||
17
home/sam/nvim/lua/sam/plugins/mason-tools.lua
Executable file
17
home/sam/nvim/lua/sam/plugins/mason-tools.lua
Executable file
@@ -0,0 +1,17 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/mason-tools.lua
|
||||
|
||||
return {
|
||||
"williamboman/mason.nvim",
|
||||
opts = {
|
||||
ensure_installed = {
|
||||
-- Formatters
|
||||
"html-ls",
|
||||
"prettier", -- For web files
|
||||
"pint", -- For PHP/Laravel
|
||||
"black", -- For Python
|
||||
"shfmt",
|
||||
-- Linters (optional but recommended)
|
||||
"eslint_d", -- For JS/TS
|
||||
},
|
||||
},
|
||||
}
|
||||
50
home/sam/nvim/lua/sam/plugins/orgmode.lua
Normal file
50
home/sam/nvim/lua/sam/plugins/orgmode.lua
Normal file
@@ -0,0 +1,50 @@
|
||||
return {
|
||||
"nvim-orgmode/orgmode",
|
||||
dependencies = {
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
},
|
||||
|
||||
-- Load at startup so the parser definition exists before you run TSInstall.
|
||||
lazy = false,
|
||||
|
||||
init = function()
|
||||
-- Register the org parser with nvim-treesitter (API-compatible fallback).
|
||||
local ok, parsers = pcall(require, "nvim-treesitter.parsers")
|
||||
if not ok then
|
||||
return
|
||||
end
|
||||
|
||||
local parser_configs = nil
|
||||
|
||||
if type(parsers.get_parser_configs) == "function" then
|
||||
parser_configs = parsers.get_parser_configs()
|
||||
elseif type(parsers.get_parser_configs) == "table" then
|
||||
parser_configs = parsers.get_parser_configs
|
||||
elseif type(parsers.parser_configs) == "table" then
|
||||
parser_configs = parsers.parser_configs
|
||||
end
|
||||
|
||||
if not parser_configs then
|
||||
return
|
||||
end
|
||||
|
||||
-- Don’t overwrite if it already exists.
|
||||
if not parser_configs.org then
|
||||
parser_configs.org = {
|
||||
install_info = {
|
||||
url = "https://github.com/milisims/tree-sitter-org",
|
||||
revision = "main",
|
||||
files = { "src/parser.c", "src/scanner.c" },
|
||||
},
|
||||
filetype = "org",
|
||||
}
|
||||
end
|
||||
end,
|
||||
|
||||
config = function()
|
||||
require("orgmode").setup({
|
||||
org_agenda_files = { "~/organizer/agenda/**/*", "~/organizer/*.org" },
|
||||
org_default_notes_file = "~/organizer/inbox.org",
|
||||
})
|
||||
end,
|
||||
}
|
||||
3
home/sam/nvim/lua/sam/plugins/telescope-addons.lua
Executable file
3
home/sam/nvim/lua/sam/plugins/telescope-addons.lua
Executable file
@@ -0,0 +1,3 @@
|
||||
return {
|
||||
"andrewberty/telescope-themes",
|
||||
}
|
||||
21
home/sam/nvim/lua/sam/plugins/telescope.lua
Executable file
21
home/sam/nvim/lua/sam/plugins/telescope.lua
Executable file
@@ -0,0 +1,21 @@
|
||||
return {
|
||||
"nvim-telescope/telescope.nvim",
|
||||
dependencies = { "nvim-lua/plenary.nvim" },
|
||||
config = function()
|
||||
-- This section is unchanged
|
||||
local builtin = require("telescope.builtin")
|
||||
vim.keymap.set("n", "<leader>ff", builtin.find_files, { desc = "Find files" })
|
||||
vim.keymap.set("n", "<leader>fg", builtin.live_grep, { desc = "Live grep" })
|
||||
|
||||
-- ADD THIS LINE to load the new extension
|
||||
require("telescope").load_extension("themes")
|
||||
|
||||
vim.keymap.set("n", "<leader>f", builtin.find_files, { desc = "Find files" })
|
||||
|
||||
vim.keymap.set("n", "<leader>ff", builtin.find_files, { desc = "Find files" })
|
||||
vim.keymap.set("n", "<leader>fg", builtin.live_grep, { desc = "Live grep" })
|
||||
|
||||
-- ADD THIS LINE to create the new keymap
|
||||
vim.keymap.set("n", "<leader>th", "<cmd>Telescope themes<cr>", { desc = "Switch Theme" })
|
||||
end,
|
||||
}
|
||||
8
home/sam/nvim/lua/sam/plugins/theme-catppuccin.lua
Executable file
8
home/sam/nvim/lua/sam/plugins/theme-catppuccin.lua
Executable file
@@ -0,0 +1,8 @@
|
||||
return {
|
||||
"catppuccin/nvim",
|
||||
name = "catppuccin",
|
||||
priority = 1000, -- Make sure this theme is loaded first
|
||||
config = function()
|
||||
-- You can add custom settings here if you like
|
||||
end,
|
||||
}
|
||||
1
home/sam/nvim/lua/sam/plugins/theme-dracula.lua
Executable file
1
home/sam/nvim/lua/sam/plugins/theme-dracula.lua
Executable file
@@ -0,0 +1 @@
|
||||
return { "Mofiqul/dracula.nvim" }
|
||||
1
home/sam/nvim/lua/sam/plugins/theme-everforest.lua
Executable file
1
home/sam/nvim/lua/sam/plugins/theme-everforest.lua
Executable file
@@ -0,0 +1 @@
|
||||
return { "neanias/everforest-nvim" }
|
||||
1
home/sam/nvim/lua/sam/plugins/theme-gruvbox.lua
Executable file
1
home/sam/nvim/lua/sam/plugins/theme-gruvbox.lua
Executable file
@@ -0,0 +1 @@
|
||||
return { "ellisonleao/gruvbox.nvim" }
|
||||
1
home/sam/nvim/lua/sam/plugins/theme-kanagawa.lua
Executable file
1
home/sam/nvim/lua/sam/plugins/theme-kanagawa.lua
Executable file
@@ -0,0 +1 @@
|
||||
return { "rebelot/kanagawa.nvim" }
|
||||
1
home/sam/nvim/lua/sam/plugins/theme-onedark.lua
Executable file
1
home/sam/nvim/lua/sam/plugins/theme-onedark.lua
Executable file
@@ -0,0 +1 @@
|
||||
return { "navarasu/onedark.nvim" }
|
||||
1
home/sam/nvim/lua/sam/plugins/theme-tokyonight.lua
Executable file
1
home/sam/nvim/lua/sam/plugins/theme-tokyonight.lua
Executable file
@@ -0,0 +1 @@
|
||||
return { "folke/tokyonight.nvim" }
|
||||
42
home/sam/nvim/lua/sam/plugins/treesitter.lua
Executable file
42
home/sam/nvim/lua/sam/plugins/treesitter.lua
Executable file
@@ -0,0 +1,42 @@
|
||||
-- ~/.config/nvim/lua/sam/plugins/treesitter.lua
|
||||
|
||||
return {
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
build = ":TSUpdate", -- Installs and updates parsers
|
||||
|
||||
config = function()
|
||||
local ok, ts = pcall(require, "nvim-treesitter.config")
|
||||
if not ok then
|
||||
ok, ts = pcall(require, "nvim-treesitter.configs")
|
||||
end
|
||||
if not ok then
|
||||
vim.notify(
|
||||
"nvim-treesitter: config module not found",
|
||||
vim.log.levels.ERROR
|
||||
)
|
||||
return
|
||||
end
|
||||
|
||||
ts.setup({
|
||||
ensure_installed = {
|
||||
"c",
|
||||
"cpp",
|
||||
"lua",
|
||||
"vim",
|
||||
"vimdoc",
|
||||
"python",
|
||||
"javascript",
|
||||
"typescript",
|
||||
"tsx",
|
||||
"html",
|
||||
"css",
|
||||
"json",
|
||||
"php",
|
||||
},
|
||||
sync_install = false,
|
||||
auto_install = true,
|
||||
highlight = { enable = true },
|
||||
})
|
||||
end,
|
||||
|
||||
}
|
||||
15
home/sam/nvim/lua/sam/plugins/vimtex.lua
Executable file
15
home/sam/nvim/lua/sam/plugins/vimtex.lua
Executable file
@@ -0,0 +1,15 @@
|
||||
-- In your plugins configuration file
|
||||
return {
|
||||
-- ... other plugins
|
||||
|
||||
{
|
||||
"lervag/vimtex",
|
||||
lazy = false, -- Or ft = "tex" to load it only for tex files
|
||||
config = function()
|
||||
-- Use Zathura as the PDF viewer
|
||||
vim.g.vimtex_view_method = "zathura"
|
||||
end,
|
||||
},
|
||||
|
||||
-- ... other plugins
|
||||
}
|
||||
9
home/sam/nvim/lua/sam/plugins/which-key.lua
Executable file
9
home/sam/nvim/lua/sam/plugins/which-key.lua
Executable file
@@ -0,0 +1,9 @@
|
||||
return {
|
||||
"folke/which-key.nvim",
|
||||
config = function()
|
||||
require("which-key").setup({
|
||||
-- your configuration comes here
|
||||
-- or leave it empty to use the default settings
|
||||
})
|
||||
end,
|
||||
}
|
||||
@@ -1,10 +1,30 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
{
|
||||
|
||||
|
||||
# Stop nouveau from binding the NVIDIA GPU
|
||||
boot.blacklistedKernelModules = [ "nouveau" ];
|
||||
boot.kernelParams = [
|
||||
"nvidia.NVreg_PreserveVideoMemoryAllocations=1"
|
||||
"intel_iommu=off"
|
||||
"dev_mem_signed_off=1"
|
||||
"modprobe.blacklist=nouveau"
|
||||
"nouveau.modeset=0"
|
||||
];
|
||||
|
||||
|
||||
boot.extraModprobeConfig = ''
|
||||
options nvidia_modeset vblank_sem_control=0
|
||||
'';
|
||||
|
||||
|
||||
imports = [
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
home-manager.backupFileExtension = "hm-bak";
|
||||
|
||||
# ---
|
||||
# Nix (enable flakes on the installed system)
|
||||
# ---
|
||||
@@ -17,7 +37,7 @@
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
# Known-good baseline from niri-4screen.md
|
||||
boot.kernelParams = [ "intel_iommu=off" "dev_mem_signed_off=1" ];
|
||||
|
||||
|
||||
# ---
|
||||
# Identity
|
||||
@@ -29,6 +49,7 @@
|
||||
# Networking
|
||||
# ---
|
||||
networking.networkmanager.enable = true;
|
||||
networking.interfaces.enp0s31f6.wakeOnLan.enable = true;
|
||||
|
||||
# Static IP policy:
|
||||
# - Static IP must be on Wi-Fi SSID "Aussie Broadband 8729"
|
||||
@@ -100,12 +121,27 @@
|
||||
# ---
|
||||
# Users
|
||||
# ---
|
||||
|
||||
|
||||
users.users.sam.openssh.authorizedKeys.keys = [
|
||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC3yxLtvBY6ClGliUfKA6eJLwUoCmagT5aZTrMsJnguUIch5lmdIGqz8gbGoy9ADEBaUpSA9nQsZZaXQE34t4xEqAzqra7hYogHR2uT6bIoML0ZWPiiMvSHOtknKcnfK/MBBPKjGYJSMhy2nzP02ORZs9D+DlfV8nVknsJa/G5jkgJXpA4za0bhxIZWJE7DPFF/utfSjxs6AB2wOzjfLPeuqSyUVq8nze+b1zf8baMBYVNxxpbHCyEXCvpuoxDw3JVk5Ha+hYyWb7563cCSeakrGM3f5048pFdPRGdbi4qcNsQV1KCBEd939VsOSNcY7Yr69zjnWzZNDCRBWxzlu+3DNY8I7ukHzxR78FPAQ6eCDR4druwIiGqlo5CE6S4P1h0uqKH2RW75qXoLb/orlwHKnAi3YOxDvELTQnxnLVgp6ahRpRu7ZqtLfJfwMLVcjTaExm8Yo4fLTJMgNv7U4bY/yRgenRzzRKHwL+kR/+SfY6KOH+8X0Jf0J653d9Z3VcVrXgo8r4vv6wx8CE605AfgQAsK9RN0cmtaDgd5GaXs3BOWMz+IeeiauSF2EXvPK5BsnvnZbBfATgpqsfi+iShoIDJ0+6mbwFqbczc17Ss9Z0mkSZyg3fsQHpWo9UFBNq5Jic1UGcjUKcvvZaB6/5bPvc6dVL/JKGcj0xqogr1paQ== root@core-ssh"
|
||||
];
|
||||
|
||||
|
||||
services.ollama.enable = true;
|
||||
|
||||
services.udisks2.enable = true;
|
||||
services.dbus.enable = true;
|
||||
|
||||
programs.kdeconnect.enable = true;
|
||||
services.gvfs.enable = true;
|
||||
services.tumbler.enable = true;
|
||||
programs.zsh.enable = true;
|
||||
|
||||
users.users.sam = {
|
||||
isNormalUser = true;
|
||||
description = "Sam";
|
||||
extraGroups = [ "wheel" "networkmanager" "video" "render" ];
|
||||
extraGroups = [ "wheel" "networkmanager" "video" "render" "docker"];
|
||||
shell = pkgs.zsh;
|
||||
};
|
||||
|
||||
@@ -121,11 +157,23 @@
|
||||
# ---
|
||||
# SSH
|
||||
# ---
|
||||
services.openssh.enable = true;
|
||||
services.openssh.openFirewall = true;
|
||||
|
||||
services.openssh = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
settings = {
|
||||
PasswordAuthentication = true;
|
||||
KbdInteractiveAuthentication = true;
|
||||
PermitRootLogin = "no";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
#services.openssh.enable = true;
|
||||
# services.openssh.openFirewall = true;
|
||||
# Defaulting to keys-only for safety. If you explicitly want password auth for the migration,
|
||||
# flip this to true.
|
||||
services.openssh.settings.PasswordAuthentication = false;
|
||||
#services.openssh.settings.PasswordAuthentication = false;
|
||||
|
||||
# Explicitly enable firewall (keep SSH as the only opened port via openFirewall above).
|
||||
networking.firewall.enable = true;
|
||||
@@ -139,6 +187,18 @@
|
||||
# especially in minimal Wayland sessions.
|
||||
security.polkit.enable = true;
|
||||
|
||||
|
||||
security.polkit.extraConfig = ''
|
||||
polkit.addRule(function(action, subject) {
|
||||
if (action.id == "org.freedesktop.login1.suspend" &&
|
||||
subject.user == "sam") {
|
||||
return polkit.Result.YES;
|
||||
}
|
||||
});
|
||||
'';
|
||||
|
||||
|
||||
|
||||
# ---
|
||||
# Firmware / microcode (stability)
|
||||
# ---
|
||||
@@ -148,10 +208,9 @@
|
||||
# ---
|
||||
# OpenGL (important for NVIDIA Wayland apps)
|
||||
# ---
|
||||
hardware.opengl = {
|
||||
hardware.graphics = {
|
||||
enable = true;
|
||||
driSupport = true;
|
||||
driSupport32Bit = true;
|
||||
enable32Bit = true;
|
||||
};
|
||||
|
||||
# ---
|
||||
@@ -174,17 +233,118 @@
|
||||
# ---
|
||||
# Docker (DEFER for now)
|
||||
# ---
|
||||
virtualisation.docker.enable = false;
|
||||
virtualisation.docker.enable = true;
|
||||
|
||||
# ---
|
||||
# Mounts
|
||||
# ---
|
||||
fileSystems."/data" = {
|
||||
device = "/dev/disk/by-uuid/27febd74-20aa-4a3a-92c1-6fdd1ad7e88e";
|
||||
fsType = "ext4";
|
||||
options = [ "nofail" "x-systemd.device-timeout=1s" ];
|
||||
# fileSystems."/data" = {
|
||||
# device = "/dev/disk/by-uuid/27febd74-20aa-4a3a-92c1-6fdd1ad7e88e";
|
||||
# fsType = "ext4";
|
||||
# options = [ "nofail" "x-systemd.device-timeout=1s" ];
|
||||
# };
|
||||
|
||||
|
||||
systemd.services.wake-on-lan-resume = {
|
||||
description = "Re-enable Wake-on-LAN after resume";
|
||||
wantedBy = [ "post-resume.target" ];
|
||||
after = [ "post-resume.target" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${pkgs.ethtool}/bin/ethtool -s enp0s31f6 wol g";
|
||||
};
|
||||
};
|
||||
|
||||
# Allow sam to suspend without password (for Home Assistant WOL)
|
||||
security.sudo.extraRules = [
|
||||
{
|
||||
users = [ "sam" ];
|
||||
commands = [
|
||||
{
|
||||
command = "${pkgs.systemd}/bin/systemctl suspend";
|
||||
options = [ "NOPASSWD" ];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
|
||||
|
||||
# This was the integral drive that died.
|
||||
|
||||
# fileSystems."/mnt/integral300" = {
|
||||
# device = "/dev/disk/by-uuid/27febd74-20aa-4a3a-92c1-6fdd1ad7e88e";
|
||||
# fsType = "ext4";
|
||||
# options = [
|
||||
# "nofail"
|
||||
# "noauto"
|
||||
# "x-systemd.automount"
|
||||
# "x-systemd.idle-timeout=60"
|
||||
# "x-systemd.device-timeout=30s"
|
||||
# ];
|
||||
# };
|
||||
|
||||
fileSystems."/mnt/backup" = {
|
||||
device = "/dev/disk/by-uuid/0806B92006B90FA4";
|
||||
fsType = "ntfs3";
|
||||
options = [
|
||||
"ro"
|
||||
"nofail"
|
||||
"noauto"
|
||||
"x-systemd.automount"
|
||||
"x-systemd.idle-timeout=60"
|
||||
"x-systemd.device-timeout=30s"
|
||||
"uid=1000"
|
||||
"gid=100"
|
||||
"umask=022"
|
||||
];
|
||||
};
|
||||
|
||||
fileSystems."/mnt/tempbackup" = {
|
||||
device = "/dev/disk/by-uuid/4f9c4bd5-fea5-408f-9370-731fc095da3f";
|
||||
fsType = "ext4";
|
||||
options = [
|
||||
"nofail"
|
||||
"noauto"
|
||||
"x-systemd.automount"
|
||||
"x-systemd.idle-timeout=60"
|
||||
"x-systemd.device-timeout=30s"
|
||||
];
|
||||
};
|
||||
|
||||
fileSystems."/mnt/xpsystemdrive" = {
|
||||
device = "/dev/disk/by-uuid/82c994f1-9adb-49e4-ba1e-5b6e5ccbd49b";
|
||||
fsType = "ext4";
|
||||
options = [
|
||||
"nofail"
|
||||
"noauto"
|
||||
"x-systemd.automount"
|
||||
"x-systemd.idle-timeout=60"
|
||||
"x-systemd.device-timeout=30s"
|
||||
];
|
||||
};
|
||||
|
||||
fileSystems."/mnt/smartdrive" = {
|
||||
device = "/dev/disk/by-uuid/819c3228-c1af-4d8e-b507-2ad11b20cbef";
|
||||
fsType = "ext4";
|
||||
options = [
|
||||
"nofail"
|
||||
"noauto"
|
||||
"x-systemd.automount"
|
||||
"x-systemd.idle-timeout=60"
|
||||
"x-systemd.device-timeout=30s"
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
systemd.tmpfiles.rules = lib.mkAfter [
|
||||
"d /mnt/integral300 0755 root root -"
|
||||
"d /mnt/backup 0755 root root -"
|
||||
"d /mnt/tempbackup 0755 root root -"
|
||||
"d /mnt/xpsystemdrive 0755 root root -"
|
||||
"d /mnt/smartdrive 0755 root root -"
|
||||
];
|
||||
# ---
|
||||
# Niri + login (greetd)
|
||||
# ---
|
||||
@@ -195,7 +355,8 @@
|
||||
user = "greeter";
|
||||
command =
|
||||
"${pkgs.greetd.tuigreet}/bin/tuigreet --time --remember --cmd ${
|
||||
lib.escapeShellArg "${pkgs.niri}/bin/niri --session"
|
||||
lib.escapeShellArg
|
||||
"${pkgs.bash}/bin/bash -lc 'mkdir -p ~/.local/state; exec ${pkgs.niri}/bin/niri --session 2>~/.local/state/niri.log'"
|
||||
}";
|
||||
};
|
||||
};
|
||||
@@ -206,12 +367,61 @@
|
||||
enable = true;
|
||||
extraPortals = [
|
||||
pkgs.xdg-desktop-portal-gtk
|
||||
pkgs.xdg-desktop-portal-gnome
|
||||
pkgs.xdg-desktop-portal-wlr
|
||||
pkgs.kdePackages.xdg-desktop-portal-kde
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
fonts.packages = with pkgs; [
|
||||
nerd-fonts.symbols-only
|
||||
font-awesome
|
||||
nerd-fonts.jetbrains-mono
|
||||
];
|
||||
|
||||
# Minimal system packages needed for the session and core usability
|
||||
environment.systemPackages = with pkgs; [
|
||||
|
||||
ethtool
|
||||
|
||||
swww
|
||||
uv
|
||||
(pkgs.callPackage ../../pkgs/agentpipe.nix { })
|
||||
(pkgs.callPackage ../../pkgs/sidecar-bin.nix { })
|
||||
xfce.thunar
|
||||
xfce.tumbler
|
||||
ffmpegthumbnailer
|
||||
|
||||
|
||||
# Optional: ensure Qt apps look okay in Niri
|
||||
kdePackages.qtwayland
|
||||
kdePackages.qtsvg
|
||||
|
||||
|
||||
|
||||
poppler-utils
|
||||
kdePackages.kdeconnect-kde
|
||||
tmux
|
||||
brave
|
||||
vorta
|
||||
borgbackup
|
||||
libreoffice-fresh
|
||||
filezilla
|
||||
nushell
|
||||
zed-editor
|
||||
brave
|
||||
swappy
|
||||
nerd-fonts.symbols-only
|
||||
font-awesome
|
||||
nerd-fonts.jetbrains-mono
|
||||
spotify
|
||||
vlc
|
||||
telegram-desktop
|
||||
waybar
|
||||
firefox
|
||||
google-chrome
|
||||
kitty
|
||||
fuzzel
|
||||
niri
|
||||
greetd.tuigreet
|
||||
xwayland
|
||||
@@ -220,13 +430,26 @@
|
||||
slurp
|
||||
];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
services.tailscale.enable = true;
|
||||
# ---
|
||||
# NVIDIA (simple, first-boot stable config; PRIME tuning later)
|
||||
# ---
|
||||
services.xserver.videoDrivers = [ "nvidia" ];
|
||||
hardware.nvidia.modesetting.enable = true;
|
||||
hardware.nvidia.nvidiaSettings = true;
|
||||
hardware.nvidia.nvidiaPersistenced = true;
|
||||
|
||||
hardware.nvidia = {
|
||||
modesetting.enable = true;
|
||||
nvidiaSettings = true;
|
||||
nvidiaPersistenced = true;
|
||||
open = false;
|
||||
|
||||
# Helps resume by preserving VRAM allocations:
|
||||
powerManagement.enable = true;
|
||||
};
|
||||
|
||||
|
||||
# ---
|
||||
# NixOS release compatibility
|
||||
|
||||
@@ -1,18 +1,33 @@
|
||||
# -----------------------------------------------------------------------------
|
||||
# PLACEHOLDER hardware-configuration.nix
|
||||
#
|
||||
# Replace this file with the REAL generated hardware configuration from the
|
||||
# NixOS installer before installing / switching to this host configuration.
|
||||
#
|
||||
# How:
|
||||
# 1) Boot the NixOS installer ISO
|
||||
# 2) Partition/mount target as planned
|
||||
# 3) Run: nixos-generate-config --root /mnt
|
||||
# 4) Copy the generated /mnt/etc/nixos/hardware-configuration.nix into:
|
||||
# hosts/sam-4screen-desktop/hardware-configuration.nix
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "ums_cypress" "usbhid" "sd_mod" "sr_mod" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ "kvm-intel" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" =
|
||||
{ device = "/dev/disk/by-uuid/fb26cb12-6cbf-4dd9-a53d-5fed72351334";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{ device = "/dev/disk/by-uuid/4A17-D854";
|
||||
fsType = "vfat";
|
||||
options = [ "fmask=0077" "dmask=0077" ];
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[ { device = "/dev/disk/by-uuid/7ec41b93-8977-4a56-a6be-5eff57b823b0"; }
|
||||
];
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,808 +0,0 @@
|
||||
sam-4screen-desktop
|
||||
description: Desktop Computer
|
||||
product: Precision Tower 3620 (06B7)
|
||||
vendor: Dell Inc.
|
||||
serial: GJD72K2
|
||||
width: 64 bits
|
||||
capabilities: smbios-3.0.0 dmi-3.0.0 smp vsyscall32
|
||||
configuration: boot=normal chassis=desktop family=Precision sku=06B7 uuid=4c4c4544-004a-4410-8037-c7c04f324b32
|
||||
*-core
|
||||
description: Motherboard
|
||||
product: 0MWYPT
|
||||
vendor: Dell Inc.
|
||||
physical id: 0
|
||||
version: A01
|
||||
serial: /GJD72K2/CNFCW0077E00CW/
|
||||
*-firmware
|
||||
description: BIOS
|
||||
vendor: Dell Inc.
|
||||
physical id: 0
|
||||
version: 2.30.0
|
||||
date: 04/08/2024
|
||||
size: 64KiB
|
||||
capacity: 16MiB
|
||||
capabilities: pci pnp upgrade shadowing cdboot bootselect edd int13floppy1200 int13floppy720 int13floppy2880 int5printscreen int9keyboard int14serial int17printer acpi usb biosbootspecification netboot uefi
|
||||
*-memory
|
||||
description: System Memory
|
||||
physical id: 9
|
||||
slot: System board or motherboard
|
||||
size: 64GiB
|
||||
*-bank:0
|
||||
description: DIMM DDR4 Synchronous Unbuffered (Unregistered) 2133 MHz (0.5 ns)
|
||||
product: M378A2K43BB1-CPB
|
||||
vendor: Samsung
|
||||
physical id: 0
|
||||
serial: 9722AFF3
|
||||
slot: DIMM1
|
||||
size: 16GiB
|
||||
width: 64 bits
|
||||
clock: 2133MHz (0.5ns)
|
||||
*-bank:1
|
||||
description: DIMM DDR4 Synchronous Unbuffered (Unregistered) 2133 MHz (0.5 ns)
|
||||
product: M378A2K43BB1-CPB
|
||||
vendor: Samsung
|
||||
physical id: 1
|
||||
serial: 9722B079
|
||||
slot: DIMM2
|
||||
size: 16GiB
|
||||
width: 64 bits
|
||||
clock: 2133MHz (0.5ns)
|
||||
*-bank:2
|
||||
description: DIMM DDR4 Synchronous Unbuffered (Unregistered) 2133 MHz (0.5 ns)
|
||||
product: M378A2K43BB1-CPB
|
||||
vendor: Samsung
|
||||
physical id: 2
|
||||
serial: 9722B071
|
||||
slot: DIMM3
|
||||
size: 16GiB
|
||||
width: 64 bits
|
||||
clock: 2133MHz (0.5ns)
|
||||
*-bank:3
|
||||
description: DIMM DDR4 Synchronous Unbuffered (Unregistered) 2133 MHz (0.5 ns)
|
||||
product: M378A2K43BB1-CPB
|
||||
vendor: Samsung
|
||||
physical id: 3
|
||||
serial: 9722B070
|
||||
slot: DIMM4
|
||||
size: 16GiB
|
||||
width: 64 bits
|
||||
clock: 2133MHz (0.5ns)
|
||||
*-cache:0
|
||||
description: L1 cache
|
||||
physical id: f
|
||||
slot: L1 Cache
|
||||
size: 256KiB
|
||||
capacity: 256KiB
|
||||
capabilities: synchronous internal write-back unified
|
||||
configuration: level=1
|
||||
*-cache:1
|
||||
description: L2 cache
|
||||
physical id: 10
|
||||
slot: L2 Cache
|
||||
size: 1MiB
|
||||
capacity: 1MiB
|
||||
capabilities: synchronous internal write-back unified
|
||||
configuration: level=2
|
||||
*-cache:2
|
||||
description: L3 cache
|
||||
physical id: 11
|
||||
slot: L3 Cache
|
||||
size: 8MiB
|
||||
capacity: 8MiB
|
||||
capabilities: synchronous internal write-back unified
|
||||
configuration: level=3
|
||||
*-cpu
|
||||
description: CPU
|
||||
product: Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz
|
||||
vendor: Intel Corp.
|
||||
physical id: 12
|
||||
bus info: cpu@0
|
||||
version: 6.158.9
|
||||
serial: To Be Filled By O.E.M.
|
||||
slot: U3E1
|
||||
size: 4399MHz
|
||||
capacity: 4500MHz
|
||||
width: 64 bits
|
||||
clock: 100MHz
|
||||
capabilities: lm fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp x86-64 constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb pti ssbd ibrs ibpb stibp tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi md_clear flush_l1d arch_capabilities cpufreq
|
||||
configuration: cores=4 enabledcores=4 microcode=248 threads=8
|
||||
*-pci
|
||||
description: Host bridge
|
||||
product: Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
|
||||
vendor: Intel Corporation
|
||||
physical id: 100
|
||||
bus info: pci@0000:00:00.0
|
||||
version: 05
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
configuration: driver=skl_uncore
|
||||
resources: irq:0
|
||||
*-pci:0
|
||||
description: PCI bridge
|
||||
product: 6th-10th Gen Core Processor PCIe Controller (x16)
|
||||
vendor: Intel Corporation
|
||||
physical id: 1
|
||||
bus info: pci@0000:00:01.0
|
||||
version: 05
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
capabilities: pci pm msi pciexpress normal_decode bus_master cap_list
|
||||
configuration: driver=pcieport
|
||||
resources: irq:121 ioport:e000(size=4096) memory:ee000000-ef0fffff ioport:d0000000(size=301989888)
|
||||
*-display
|
||||
description: VGA compatible controller
|
||||
product: GP107GL [Quadro P620]
|
||||
vendor: NVIDIA Corporation
|
||||
physical id: 0
|
||||
bus info: pci@0000:01:00.0
|
||||
logical name: /dev/fb0
|
||||
version: a1
|
||||
width: 64 bits
|
||||
clock: 33MHz
|
||||
capabilities: pm msi pciexpress vga_controller bus_master cap_list rom fb
|
||||
configuration: depth=32 driver=nvidia latency=0 resolution=1680,1050
|
||||
resources: irq:145 memory:ee000000-eeffffff memory:d0000000-dfffffff memory:e0000000-e1ffffff ioport:e000(size=128) memory:c0000-dffff
|
||||
*-multimedia
|
||||
description: Audio device
|
||||
product: GP107GL High Definition Audio Controller
|
||||
vendor: NVIDIA Corporation
|
||||
physical id: 0.1
|
||||
bus info: pci@0000:01:00.1
|
||||
logical name: card0
|
||||
logical name: /dev/snd/controlC0
|
||||
logical name: /dev/snd/hwC0D0
|
||||
logical name: /dev/snd/pcmC0D3p
|
||||
logical name: /dev/snd/pcmC0D7p
|
||||
logical name: /dev/snd/pcmC0D8p
|
||||
logical name: /dev/snd/pcmC0D9p
|
||||
version: a1
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
capabilities: pm msi pciexpress bus_master cap_list
|
||||
configuration: driver=snd_hda_intel latency=0
|
||||
resources: irq:17 memory:ef080000-ef083fff
|
||||
*-input:0
|
||||
product: HDA NVidia HDMI/DP,pcm=3
|
||||
physical id: 0
|
||||
logical name: input18
|
||||
logical name: /dev/input/event14
|
||||
*-input:1
|
||||
product: HDA NVidia HDMI/DP,pcm=7
|
||||
physical id: 1
|
||||
logical name: input19
|
||||
logical name: /dev/input/event15
|
||||
*-input:2
|
||||
product: HDA NVidia HDMI/DP,pcm=8
|
||||
physical id: 2
|
||||
logical name: input20
|
||||
logical name: /dev/input/event16
|
||||
*-input:3
|
||||
product: HDA NVidia HDMI/DP,pcm=9
|
||||
physical id: 3
|
||||
logical name: input21
|
||||
logical name: /dev/input/event17
|
||||
*-display
|
||||
description: VGA compatible controller
|
||||
product: HD Graphics 630
|
||||
vendor: Intel Corporation
|
||||
physical id: 2
|
||||
bus info: pci@0000:00:02.0
|
||||
version: 04
|
||||
width: 64 bits
|
||||
clock: 33MHz
|
||||
capabilities: pciexpress msi pm vga_controller bus_master cap_list
|
||||
configuration: driver=i915 latency=0
|
||||
resources: irq:144 memory:ed000000-edffffff memory:c0000000-cfffffff ioport:f000(size=64)
|
||||
*-usb
|
||||
description: USB controller
|
||||
product: 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller
|
||||
vendor: Intel Corporation
|
||||
physical id: 14
|
||||
bus info: pci@0000:00:14.0
|
||||
version: 31
|
||||
width: 64 bits
|
||||
clock: 33MHz
|
||||
capabilities: pm msi xhci bus_master cap_list
|
||||
configuration: driver=xhci_hcd latency=0
|
||||
resources: irq:124 memory:ef330000-ef33ffff
|
||||
*-usbhost:0
|
||||
product: xHCI Host Controller
|
||||
vendor: Linux 6.14.0-37-generic xhci-hcd
|
||||
physical id: 0
|
||||
bus info: usb@1
|
||||
logical name: usb1
|
||||
version: 6.14
|
||||
capabilities: usb-2.00
|
||||
configuration: driver=hub slots=16 speed=480Mbit/s
|
||||
*-usb:0
|
||||
description: Mass storage device
|
||||
product: Cypress AT2LP
|
||||
vendor: Cypress Semiconductor Corp.
|
||||
physical id: 1
|
||||
bus info: usb@1:1
|
||||
logical name: scsi5
|
||||
version: 2.40
|
||||
serial: DEF10FD70D1E
|
||||
capabilities: usb-2.00 scsi emulated scsi-host
|
||||
configuration: driver=ums-cypress maxpower=2mA speed=480Mbit/s
|
||||
*-disk
|
||||
description: SCSI Disk
|
||||
product: 00JB-22KFA0
|
||||
vendor: WDC WD32
|
||||
physical id: 0.0.0
|
||||
bus info: scsi@5:0.0.0
|
||||
logical name: /dev/sdc
|
||||
version: 0000
|
||||
serial: W -D
|
||||
size: 298GiB (320GB)
|
||||
capabilities: partitioned partitioned:dos
|
||||
configuration: logicalsectorsize=512 sectorsize=512 signature=100b218d
|
||||
*-volume
|
||||
description: EXT4 volume
|
||||
vendor: Linux
|
||||
physical id: 1
|
||||
bus info: scsi@5:0.0.0,1
|
||||
logical name: /dev/sdc1
|
||||
logical name: /media/sam/Integral300
|
||||
version: 1.0
|
||||
serial: 27febd74-20aa-4a3a-92c1-6fdd1ad7e88e
|
||||
size: 298GiB
|
||||
capacity: 298GiB
|
||||
capabilities: primary journaled extended_attributes large_files huge_files dir_nlink recover 64bit extents ext4 ext2 initialized
|
||||
configuration: created=2026-01-27 19:20:40 filesystem=ext4 label=Integral300 lastmountpoint=/media/sam/Integral300 modified=2026-01-28 12:50:32 mount.fstype=ext4 mount.options=rw,nosuid,nodev,relatime,errors=remount-ro mounted=2026-01-27 19:29:38 state=mounted
|
||||
*-usb:1
|
||||
description: Mass storage device
|
||||
product: WD5000BEVT-22ZAT
|
||||
vendor: WDC
|
||||
physical id: 2
|
||||
bus info: usb@1:2
|
||||
logical name: scsi4
|
||||
version: 3.00
|
||||
serial: 0010101E40000000
|
||||
capabilities: usb-2.00 scsi emulated scsi-host
|
||||
configuration: driver=usb-storage maxpower=2mA speed=480Mbit/s
|
||||
*-disk
|
||||
description: SCSI Disk
|
||||
product: WD5000BEVT-22ZAT
|
||||
vendor: WDC
|
||||
physical id: 0.0.0
|
||||
bus info: scsi@4:0.0.0
|
||||
logical name: /dev/sdb
|
||||
version: 3.00
|
||||
serial: WD-WXNY08ND2684
|
||||
size: 465GiB (500GB)
|
||||
capabilities: partitioned partitioned:dos
|
||||
configuration: ansiversion=4 logicalsectorsize=512 sectorsize=512 signature=1ac8f43c
|
||||
*-volume
|
||||
description: EXT4 volume
|
||||
vendor: Linux
|
||||
physical id: 1
|
||||
bus info: scsi@4:0.0.0,1
|
||||
logical name: /dev/sdb1
|
||||
version: 1.0
|
||||
serial: 4f9c4bd5-fea5-408f-9370-731fc095da3f
|
||||
size: 465GiB
|
||||
capacity: 465GiB
|
||||
capabilities: primary journaled extended_attributes large_files huge_files dir_nlink 64bit extents ext4 ext2 initialized
|
||||
configuration: created=2026-01-27 18:46:14 filesystem=ext4 label=TempBackup modified=2026-01-27 18:46:39 state=clean
|
||||
*-usb:2
|
||||
description: Keyboard
|
||||
product: 2.4G Mouse Consumer Control
|
||||
vendor: SHARKOON Technologies GmbH
|
||||
physical id: 7
|
||||
bus info: usb@1:7
|
||||
logical name: input10
|
||||
logical name: /dev/input/event7
|
||||
logical name: input6
|
||||
logical name: /dev/input/event3
|
||||
logical name: input6::capslock
|
||||
logical name: input6::compose
|
||||
logical name: input6::kana
|
||||
logical name: input6::numlock
|
||||
logical name: input6::scrolllock
|
||||
logical name: input7
|
||||
logical name: /dev/input/event4
|
||||
logical name: input8
|
||||
logical name: /dev/input/event5
|
||||
logical name: /dev/input/mouse0
|
||||
logical name: input9
|
||||
logical name: /dev/input/event6
|
||||
version: 2.00
|
||||
capabilities: usb-1.10 usb
|
||||
configuration: driver=usbhid maxpower=100mA speed=12Mbit/s
|
||||
*-usb:3
|
||||
description: Keyboard
|
||||
product: umux.com X.Tips V4s Keyboard
|
||||
vendor: umux.com
|
||||
physical id: 8
|
||||
bus info: usb@1:8
|
||||
logical name: input12
|
||||
logical name: /dev/input/event8
|
||||
logical name: input12::capslock
|
||||
logical name: input12::compose
|
||||
logical name: input12::kana
|
||||
logical name: input12::numlock
|
||||
logical name: input12::scrolllock
|
||||
logical name: input13
|
||||
logical name: /dev/input/event9
|
||||
logical name: /dev/input/mouse1
|
||||
logical name: input14
|
||||
logical name: /dev/input/event10
|
||||
logical name: input15
|
||||
logical name: /dev/input/event11
|
||||
logical name: input16
|
||||
logical name: /dev/input/event12
|
||||
logical name: input16::capslock
|
||||
logical name: input16::compose
|
||||
logical name: input16::kana
|
||||
logical name: input16::numlock
|
||||
logical name: input16::scrolllock
|
||||
version: 0.01
|
||||
serial: vial:f64c2b3c
|
||||
capabilities: usb-2.00 usb
|
||||
configuration: driver=usbhid maxpower=500mA speed=12Mbit/s
|
||||
*-usb:4
|
||||
description: Mass storage device
|
||||
product: USB 2.0 SATA BRIDGE
|
||||
vendor: Super Top
|
||||
physical id: a
|
||||
bus info: usb@1:a
|
||||
version: 1.40
|
||||
serial: MA6116VE4018
|
||||
capabilities: usb-2.00 scsi
|
||||
configuration: driver=usb-storage maxpower=2mA speed=480Mbit/s
|
||||
*-usbhost:1
|
||||
product: xHCI Host Controller
|
||||
vendor: Linux 6.14.0-37-generic xhci-hcd
|
||||
physical id: 1
|
||||
bus info: usb@2
|
||||
logical name: usb2
|
||||
version: 6.14
|
||||
capabilities: usb-3.00
|
||||
configuration: driver=hub slots=10 speed=5000Mbit/s
|
||||
*-generic
|
||||
description: Signal processing controller
|
||||
product: 100 Series/C230 Series Chipset Family Thermal Subsystem
|
||||
vendor: Intel Corporation
|
||||
physical id: 14.2
|
||||
bus info: pci@0000:00:14.2
|
||||
version: 31
|
||||
width: 64 bits
|
||||
clock: 33MHz
|
||||
capabilities: pm msi cap_list
|
||||
configuration: driver=intel_pch_thermal latency=0
|
||||
resources: irq:18 memory:ef34e000-ef34efff
|
||||
*-communication
|
||||
description: Communication controller
|
||||
product: 100 Series/C230 Series Chipset Family MEI Controller #1
|
||||
vendor: Intel Corporation
|
||||
physical id: 16
|
||||
bus info: pci@0000:00:16.0
|
||||
version: 31
|
||||
width: 64 bits
|
||||
clock: 33MHz
|
||||
capabilities: pm msi bus_master cap_list
|
||||
configuration: driver=mei_me latency=0
|
||||
resources: irq:133 memory:ef34d000-ef34dfff
|
||||
*-sata
|
||||
description: SATA controller
|
||||
product: Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode]
|
||||
vendor: Intel Corporation
|
||||
physical id: 17
|
||||
bus info: pci@0000:00:17.0
|
||||
logical name: scsi1
|
||||
logical name: scsi2
|
||||
version: 31
|
||||
width: 32 bits
|
||||
clock: 66MHz
|
||||
capabilities: sata msi pm ahci_1.0 bus_master cap_list emulated
|
||||
configuration: driver=ahci latency=0
|
||||
resources: irq:132 memory:ef348000-ef349fff memory:ef34c000-ef34c0ff ioport:f090(size=8) ioport:f080(size=4) ioport:f060(size=32) memory:ef34b000-ef34b7ff
|
||||
*-disk
|
||||
description: ATA Disk
|
||||
product: Patriot Burst El
|
||||
physical id: 0
|
||||
bus info: scsi@1:0.0.0
|
||||
logical name: /dev/sda
|
||||
version: 9A0
|
||||
serial: PBEABBB23090814043
|
||||
size: 223GiB (240GB)
|
||||
capabilities: gpt-1.00 partitioned partitioned:gpt
|
||||
configuration: ansiversion=5 guid=d72b17f4-a649-40ca-935d-cae1eeb1c85d logicalsectorsize=512 sectorsize=512
|
||||
*-volume:0
|
||||
description: reserved partition
|
||||
vendor: Windows
|
||||
physical id: 1
|
||||
bus info: scsi@1:0.0.0,1
|
||||
logical name: /dev/sda1
|
||||
serial: 38c6b6b3-fdb2-4d43-ba15-9c275fbec985
|
||||
capacity: 15MiB
|
||||
capabilities: nofs
|
||||
configuration: name=Microsoft reserved partition
|
||||
*-volume:1
|
||||
description: Windows NTFS volume
|
||||
vendor: Windows
|
||||
physical id: 2
|
||||
bus info: scsi@1:0.0.0,2
|
||||
logical name: /dev/sda2
|
||||
version: 3.1
|
||||
serial: b6da3c24-6685-8944-8d4a-555b3dd3a023
|
||||
size: 223GiB
|
||||
capacity: 223GiB
|
||||
capabilities: ntfs initialized
|
||||
configuration: clustersize=4096 created=2024-06-16 15:40:40 filesystem=ntfs label=Back Up name=Basic data partition state=clean
|
||||
*-cdrom
|
||||
description: DVD-RAM writer
|
||||
product: DVD+-RW GHB0N
|
||||
vendor: HL-DT-ST
|
||||
physical id: 1
|
||||
bus info: scsi@2:0.0.0
|
||||
logical name: /dev/cdrom
|
||||
logical name: /dev/sr0
|
||||
version: A1C0
|
||||
capabilities: removable audio cd-r cd-rw dvd dvd-r dvd-ram
|
||||
configuration: ansiversion=5 status=nodisc
|
||||
*-pci:1
|
||||
description: PCI bridge
|
||||
product: 100 Series/C230 Series Chipset Family PCI Express Root Port #17
|
||||
vendor: Intel Corporation
|
||||
physical id: 1b
|
||||
bus info: pci@0000:00:1b.0
|
||||
version: f1
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
capabilities: pci pciexpress msi pm normal_decode bus_master cap_list
|
||||
configuration: driver=pcieport
|
||||
resources: irq:122 ioport:d000(size=4096) memory:ef200000-ef2fffff
|
||||
*-nvme
|
||||
description: NVMe device
|
||||
product: PM951 NVMe SAMSUNG 1024GB
|
||||
vendor: Samsung Electronics Co Ltd
|
||||
physical id: 0
|
||||
bus info: pci@0000:02:00.0
|
||||
logical name: /dev/nvme0
|
||||
version: BXV77D0Q
|
||||
serial: S2FZNXAH301424
|
||||
width: 64 bits
|
||||
clock: 33MHz
|
||||
capabilities: nvme pm msi pciexpress msix nvm_express bus_master cap_list
|
||||
configuration: driver=nvme latency=0 nqn=nqn.2014.08.org.nvmexpress:144d144d S2FZNXAH301424PM951 NVMe SAMSUNG 1024GB state=live
|
||||
resources: irq:16 memory:ef200000-ef203fff ioport:d000(size=256)
|
||||
*-namespace:0
|
||||
description: NVMe disk
|
||||
physical id: 0
|
||||
logical name: hwmon1
|
||||
*-namespace:1
|
||||
description: NVMe disk
|
||||
physical id: 2
|
||||
logical name: /dev/ng0n1
|
||||
*-namespace:2
|
||||
description: NVMe disk
|
||||
physical id: 1
|
||||
bus info: nvme@0:1
|
||||
logical name: /dev/nvme0n1
|
||||
size: 953GiB (1024GB)
|
||||
capabilities: gpt-1.00 partitioned partitioned:gpt
|
||||
configuration: guid=3c752166-f3f5-4ee6-b50a-b240d0fd272d logicalsectorsize=512 sectorsize=512 wwid=nvme.144d-2020202020205332465a4e584148333031343234-504d393531204e564d652053414d53554e4720313032344742-00000001
|
||||
*-volume:0
|
||||
description: Windows FAT volume
|
||||
vendor: MSDOS5.0
|
||||
physical id: 1
|
||||
bus info: nvme@0:1,1
|
||||
logical name: /dev/nvme0n1p1
|
||||
logical name: /boot/efi
|
||||
version: FAT32
|
||||
serial: 94cc-9da4
|
||||
size: 95MiB
|
||||
capacity: 99MiB
|
||||
capabilities: boot nomount fat initialized
|
||||
configuration: FATs=2 filesystem=fat mount.fstype=vfat mount.options=rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro name=EFI system partition state=mounted
|
||||
*-volume:1
|
||||
description: reserved partition
|
||||
vendor: Windows
|
||||
physical id: 2
|
||||
bus info: nvme@0:1,2
|
||||
logical name: /dev/nvme0n1p2
|
||||
serial: c548d0ae-4d8e-49ba-a9e8-e33d6b9ec973
|
||||
capacity: 15MiB
|
||||
capabilities: nofs nomount
|
||||
configuration: name=Microsoft reserved partition
|
||||
*-volume:2
|
||||
description: Windows NTFS volume
|
||||
vendor: Windows
|
||||
physical id: 3
|
||||
bus info: nvme@0:1,3
|
||||
logical name: /dev/nvme0n1p3
|
||||
logical name: /media/sam/8294CD2994CD2111
|
||||
version: 3.1
|
||||
serial: 2ea3692d-e9bc-c246-b7e4-28159a0c8020
|
||||
size: 503GiB
|
||||
capacity: 503GiB
|
||||
capabilities: ntfs initialized
|
||||
configuration: clustersize=4096 created=2024-05-18 15:25:31 filesystem=ntfs mount.fstype=fuseblk mount.options=rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096 name=Basic data partition state=mounted
|
||||
*-volume:3
|
||||
description: Windows NTFS volume
|
||||
vendor: Windows
|
||||
physical id: 4
|
||||
bus info: nvme@0:1,4
|
||||
logical name: /dev/nvme0n1p4
|
||||
version: 3.1
|
||||
serial: 1aa2-eef1
|
||||
size: 522MiB
|
||||
capacity: 529MiB
|
||||
capabilities: boot precious nomount ntfs initialized
|
||||
configuration: clustersize=4096 created=2024-05-17 21:30:36 filesystem=ntfs state=clean
|
||||
*-volume:4
|
||||
description: EXT4 volume
|
||||
vendor: Linux
|
||||
physical id: 5
|
||||
bus info: nvme@0:1,5
|
||||
logical name: /dev/nvme0n1p5
|
||||
logical name: /
|
||||
version: 1.0
|
||||
serial: 4e99904c-ce6f-4c3c-898a-e29cfc373489
|
||||
size: 449GiB
|
||||
capabilities: journaled extended_attributes large_files huge_files dir_nlink recover 64bit extents ext4 ext2 initialized
|
||||
configuration: created=2025-06-12 21:59:53 filesystem=ext4 lastmountpoint=/ modified=2026-01-28 12:27:04 mount.fstype=ext4 mount.options=rw,relatime mounted=2026-01-26 18:06:38 state=mounted
|
||||
*-pci:2
|
||||
description: PCI bridge
|
||||
product: 100 Series/C230 Series Chipset Family PCI Express Root Port #1
|
||||
vendor: Intel Corporation
|
||||
physical id: 1c
|
||||
bus info: pci@0000:00:1c.0
|
||||
version: f1
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
capabilities: pci pciexpress msi pm normal_decode bus_master cap_list
|
||||
configuration: driver=pcieport
|
||||
resources: irq:123 memory:ef100000-ef1fffff
|
||||
*-pci
|
||||
description: PCI bridge
|
||||
product: XIO2001 PCI Express-to-PCI Bridge
|
||||
vendor: Texas Instruments
|
||||
physical id: 0
|
||||
bus info: pci@0000:03:00.0
|
||||
version: 00
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
capabilities: pci pm msi pciexpress normal_decode bus_master cap_list
|
||||
resources: memory:ef100000-ef1fffff
|
||||
*-network DISABLED
|
||||
description: Wireless interface
|
||||
product: RT3062 Wireless 802.11n 2T/2R
|
||||
vendor: Ralink corp.
|
||||
physical id: 2
|
||||
bus info: pci@0000:04:02.0
|
||||
logical name: wlp4s2
|
||||
version: 00
|
||||
serial: 80:1f:02:4f:18:ae
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
capabilities: pm bus_master cap_list ethernet physical wireless
|
||||
configuration: broadcast=yes driver=rt2800pci driverversion=6.14.0-37-generic firmware=0.40 latency=32 link=no maxlatency=4 mingnt=2 multicast=yes wireless=IEEE 802.11
|
||||
resources: irq:18 memory:ef100000-ef10ffff
|
||||
*-isa
|
||||
description: ISA bridge
|
||||
product: C236 Chipset LPC/eSPI Controller
|
||||
vendor: Intel Corporation
|
||||
physical id: 1f
|
||||
bus info: pci@0000:00:1f.0
|
||||
version: 31
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
capabilities: isa bus_master
|
||||
configuration: latency=0
|
||||
*-pnp00:00
|
||||
product: PnP device PNP0c02
|
||||
physical id: 0
|
||||
capabilities: pnp
|
||||
configuration: driver=system
|
||||
*-pnp00:01
|
||||
product: PnP device PNP0501
|
||||
physical id: 1
|
||||
capabilities: pnp
|
||||
configuration: driver=serial
|
||||
*-pnp00:02
|
||||
product: PnP device PNP0303
|
||||
physical id: 2
|
||||
capabilities: pnp
|
||||
configuration: driver=i8042 kbd
|
||||
*-pnp00:03
|
||||
product: PnP device PNP0f03
|
||||
physical id: 3
|
||||
capabilities: pnp
|
||||
configuration: driver=i8042 aux
|
||||
*-pnp00:04
|
||||
product: PnP device PNP0c02
|
||||
physical id: 4
|
||||
capabilities: pnp
|
||||
configuration: driver=system
|
||||
*-pnp00:05
|
||||
product: PnP device PNP0c02
|
||||
physical id: 5
|
||||
capabilities: pnp
|
||||
configuration: driver=system
|
||||
*-pnp00:06
|
||||
product: PnP device PNP0b00
|
||||
physical id: 6
|
||||
capabilities: pnp
|
||||
configuration: driver=rtc_cmos
|
||||
*-pnp00:07
|
||||
product: PnP device PNP0c02
|
||||
physical id: 7
|
||||
capabilities: pnp
|
||||
configuration: driver=system
|
||||
*-pnp00:08
|
||||
product: PnP device PNP0c02
|
||||
physical id: 8
|
||||
capabilities: pnp
|
||||
configuration: driver=system
|
||||
*-pnp00:09
|
||||
product: PnP device PNP0c02
|
||||
physical id: 9
|
||||
capabilities: pnp
|
||||
configuration: driver=system
|
||||
*-pnp00:0a
|
||||
product: PnP device PNP0c02
|
||||
physical id: a
|
||||
capabilities: pnp
|
||||
configuration: driver=system
|
||||
*-pnp00:0b
|
||||
product: PnP device PNP0c31
|
||||
physical id: b
|
||||
capabilities: pnp
|
||||
configuration: driver=tpm_tis
|
||||
*-memory UNCLAIMED
|
||||
description: Memory controller
|
||||
product: 100 Series/C230 Series Chipset Family Power Management Controller
|
||||
vendor: Intel Corporation
|
||||
physical id: 1f.2
|
||||
bus info: pci@0000:00:1f.2
|
||||
version: 31
|
||||
width: 32 bits
|
||||
clock: 33MHz (30.3ns)
|
||||
capabilities: bus_master
|
||||
configuration: latency=0
|
||||
resources: memory:ef344000-ef347fff
|
||||
*-multimedia
|
||||
description: Audio device
|
||||
product: 100 Series/C230 Series Chipset Family HD Audio Controller
|
||||
vendor: Intel Corporation
|
||||
physical id: 1f.3
|
||||
bus info: pci@0000:00:1f.3
|
||||
logical name: card1
|
||||
logical name: /dev/snd/controlC1
|
||||
logical name: /dev/snd/hwC1D0
|
||||
logical name: /dev/snd/hwC1D2
|
||||
logical name: /dev/snd/pcmC1D0c
|
||||
logical name: /dev/snd/pcmC1D0p
|
||||
logical name: /dev/snd/pcmC1D3p
|
||||
logical name: /dev/snd/pcmC1D7p
|
||||
logical name: /dev/snd/pcmC1D8p
|
||||
version: 31
|
||||
width: 64 bits
|
||||
clock: 33MHz
|
||||
capabilities: pm msi bus_master cap_list
|
||||
configuration: driver=snd_hda_intel latency=32
|
||||
resources: irq:146 memory:ef340000-ef343fff memory:ef320000-ef32ffff
|
||||
*-input:0
|
||||
product: HDA Intel PCH Rear Mic
|
||||
physical id: 0
|
||||
logical name: input23
|
||||
logical name: /dev/input/event19
|
||||
*-input:1
|
||||
product: HDA Intel PCH Front Mic
|
||||
physical id: 1
|
||||
logical name: input24
|
||||
logical name: /dev/input/event20
|
||||
*-input:2
|
||||
product: HDA Intel PCH Line Out
|
||||
physical id: 2
|
||||
logical name: input25
|
||||
logical name: /dev/input/event21
|
||||
*-input:3
|
||||
product: HDA Intel PCH Front Headphone
|
||||
physical id: 3
|
||||
logical name: input26
|
||||
logical name: /dev/input/event22
|
||||
*-input:4
|
||||
product: HDA Intel PCH HDMI/DP,pcm=3
|
||||
physical id: 4
|
||||
logical name: input27
|
||||
logical name: /dev/input/event23
|
||||
*-input:5
|
||||
product: HDA Intel PCH HDMI/DP,pcm=7
|
||||
physical id: 5
|
||||
logical name: input28
|
||||
logical name: /dev/input/event24
|
||||
*-input:6
|
||||
product: HDA Intel PCH HDMI/DP,pcm=8
|
||||
physical id: 6
|
||||
logical name: input29
|
||||
logical name: /dev/input/event25
|
||||
*-serial
|
||||
description: SMBus
|
||||
product: 100 Series/C230 Series Chipset Family SMBus
|
||||
vendor: Intel Corporation
|
||||
physical id: 1f.4
|
||||
bus info: pci@0000:00:1f.4
|
||||
version: 31
|
||||
width: 64 bits
|
||||
clock: 33MHz
|
||||
configuration: driver=i801_smbus latency=0
|
||||
resources: irq:16 memory:ef34a000-ef34a0ff ioport:f040(size=32)
|
||||
*-network
|
||||
description: Ethernet interface
|
||||
product: Ethernet Connection (2) I219-LM
|
||||
vendor: Intel Corporation
|
||||
physical id: 1f.6
|
||||
bus info: pci@0000:00:1f.6
|
||||
logical name: enp0s31f6
|
||||
version: 31
|
||||
serial: d8:9e:f3:07:bf:05
|
||||
size: 1Gbit/s
|
||||
capacity: 1Gbit/s
|
||||
width: 32 bits
|
||||
clock: 33MHz
|
||||
capabilities: pm msi bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
|
||||
configuration: autonegotiation=on broadcast=yes driver=e1000e driverversion=6.14.0-37-generic duplex=full firmware=0.8-4 ip=192.168.20.27 latency=0 link=yes multicast=yes port=twisted pair speed=1Gbit/s
|
||||
resources: irq:143 memory:ef300000-ef31ffff
|
||||
*-scsi
|
||||
physical id: 1
|
||||
bus info: usb@1:10
|
||||
logical name: scsi7
|
||||
capabilities: emulated scsi-host
|
||||
configuration: driver=usb-storage
|
||||
*-disk
|
||||
description: SCSI Disk
|
||||
product: HTS541616J9SA00
|
||||
vendor: Hitachi
|
||||
physical id: 0.0.0
|
||||
bus info: scsi@7:0.0.0
|
||||
logical name: /dev/sde
|
||||
size: 149GiB (160GB)
|
||||
capabilities: partitioned partitioned:dos
|
||||
configuration: logicalsectorsize=512 sectorsize=512 signature=13991399
|
||||
*-volume
|
||||
description: EXT4 volume
|
||||
vendor: Linux
|
||||
physical id: 1
|
||||
bus info: scsi@7:0.0.0,1
|
||||
logical name: /dev/sde1
|
||||
logical name: /media/sam/XPSystemDrive
|
||||
version: 1.0
|
||||
serial: 82c994f1-9adb-49e4-ba1e-5b6e5ccbd49b
|
||||
size: 149GiB
|
||||
capacity: 149GiB
|
||||
capabilities: primary journaled extended_attributes large_files huge_files dir_nlink recover 64bit extents ext4 ext2 initialized
|
||||
configuration: created=2026-01-27 20:36:08 filesystem=ext4 label=XPSystemDrive modified=2026-01-27 21:09:30 mount.fstype=ext4 mount.options=rw,nosuid,nodev,relatime,errors=remount-ro mounted=2026-01-27 21:09:30 state=mounted
|
||||
*-input:0
|
||||
product: Sleep Button
|
||||
physical id: 1
|
||||
logical name: input0
|
||||
logical name: /dev/input/event0
|
||||
capabilities: platform
|
||||
*-input:1
|
||||
product: Power Button
|
||||
physical id: 2
|
||||
logical name: input1
|
||||
logical name: /dev/input/event1
|
||||
capabilities: platform
|
||||
*-input:2
|
||||
product: Dell WMI hotkeys
|
||||
physical id: 3
|
||||
logical name: input17
|
||||
logical name: /dev/input/event13
|
||||
capabilities: platform
|
||||
*-input:3
|
||||
product: Power Button
|
||||
physical id: 4
|
||||
logical name: input2
|
||||
logical name: /dev/input/event2
|
||||
capabilities: platform
|
||||
*-input:4
|
||||
product: Video Bus
|
||||
physical id: 5
|
||||
logical name: input22
|
||||
logical name: /dev/input/event18
|
||||
capabilities: platform
|
||||
@@ -1,144 +0,0 @@
|
||||
--- Netplan Configuration ---
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml:network:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: version: 2
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: wifis:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: renderer: NetworkManager
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: match:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: name: "wlp4s2"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: addresses:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: - "192.168.20.27/24"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: nameservers:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: addresses:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: - 192.168.20.35
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: - 192.168.20.13
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: dhcp6: true
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: access-points:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: "Aussie Broadband 8729":
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: auth:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: key-management: "psk"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: password: "<REDACTED>"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: networkmanager:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: uuid: "31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: name: "Aussie Broadband 8729"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: passthrough:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: connection.timestamp: "1766738969"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: ipv4.address1: "192.168.20.27/24,192.168.20.1"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: ipv4.method: "manual"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: ipv6.addr-gen-mode: "default"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: ipv6.ip6-privacy: "-1"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: proxy._: ""
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: networkmanager:
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: uuid: "31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4"
|
||||
/etc/netplan/90-NM-31ac1c6a-4de8-4a3e-929f-aaec5cd53cf4.yaml: name: "Aussie Broadband 8729"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml:network:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: version: 2
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: ethernets:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: renderer: NetworkManager
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: match:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: name: "enp0s31f6"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: addresses:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: - "192.168.20.27/24"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: nameservers:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: addresses:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: - 192.168.20.35
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: - 192.168.20.13
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: dhcp6: true
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: mtu: 1500
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: wakeonlan: true
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: networkmanager:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: uuid: "afb4bbc6-fac5-31f5-8cdc-a466b8b74765"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: name: "Wired connection 1"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: passthrough:
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: connection.autoconnect: "false"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: connection.autoconnect-priority: "-999"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: connection.timestamp: "1766741824"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: ethernet.wake-on-lan: "64"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: ipv4.address1: "192.168.20.27/24,192.168.20.1"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: ipv4.method: "manual"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: ipv6.addr-gen-mode: "default"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: ipv6.ip6-privacy: "-1"
|
||||
/etc/netplan/90-NM-afb4bbc6-fac5-31f5-8cdc-a466b8b74765.yaml: proxy._: ""
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml:network:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: version: 2
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: wifis:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: renderer: NetworkManager
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: match:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: name: "wlp4s2"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: dhcp4: true
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: dhcp6: true
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: access-points:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: "NetComm Wireless":
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: auth:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: key-management: "psk"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: password: "<REDACTED>"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: networkmanager:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: uuid: "ecfc8be2-ba84-46e9-89c6-75bcb35cba55"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: name: "NetComm Wireless"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: passthrough:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: connection.timestamp: "1769032320"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: wifi-security.auth-alg: "open"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: ipv6.addr-gen-mode: "default"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: ipv6.ip6-privacy: "-1"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: proxy._: ""
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: networkmanager:
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: uuid: "ecfc8be2-ba84-46e9-89c6-75bcb35cba55"
|
||||
/etc/netplan/90-NM-ecfc8be2-ba84-46e9-89c6-75bcb35cba55.yaml: name: "NetComm Wireless"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml:network:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: version: 2
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: wifis:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: NM-bf81f458-5456-4645-b6c4-0662760765ed:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: renderer: NetworkManager
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: match:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: name: "wlp4s2"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: dhcp4: true
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: dhcp6: true
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: access-points:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: "Sams Pixel 8a":
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: auth:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: key-management: "psk"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: password: "<REDACTED>"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: networkmanager:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: uuid: "bf81f458-5456-4645-b6c4-0662760765ed"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: name: "Sams Pixel 8a"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: passthrough:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: wifi-security.auth-alg: "open"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: ipv6.addr-gen-mode: "default"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: ipv6.ip6-privacy: "-1"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: proxy._: ""
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: networkmanager:
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: uuid: "bf81f458-5456-4645-b6c4-0662760765ed"
|
||||
/etc/netplan/90-NM-bf81f458-5456-4645-b6c4-0662760765ed.yaml: name: "Sams Pixel 8a"
|
||||
\n--- Current IP Configuration ---
|
||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
|
||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||
inet 127.0.0.1/8 scope host lo
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 ::1/128 scope host noprefixroute
|
||||
valid_lft forever preferred_lft forever
|
||||
2: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether d8:9e:f3:07:bf:05 brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.168.20.27/24 brd 192.168.20.255 scope global noprefixroute enp0s31f6
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 2403:5804:f1cf:0:1607:4771:2ca5:68a0/64 scope global temporary dynamic
|
||||
valid_lft 7201sec preferred_lft 3600sec
|
||||
inet6 2403:5804:f1cf:0:cfcb:7b68:499:a6b3/64 scope global dynamic mngtmpaddr noprefixroute
|
||||
valid_lft 7201sec preferred_lft 3600sec
|
||||
inet6 fd3a:a6b:b9f:0:abae:763c:7dd7:162/64 scope global temporary dynamic
|
||||
valid_lft 584685sec preferred_lft 66095sec
|
||||
inet6 fd3a:a6b:b9f:0:62bf:88cc:df17:c0ff/64 scope global dynamic mngtmpaddr noprefixroute
|
||||
valid_lft 2592000sec preferred_lft 604800sec
|
||||
inet6 fe80::ab76:a154:b7ae:4825/64 scope link noprefixroute
|
||||
valid_lft forever preferred_lft forever
|
||||
3: wlp4s2: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
|
||||
link/ether 80:1f:02:4f:18:ae brd ff:ff:ff:ff:ff:ff
|
||||
4: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 500
|
||||
link/none
|
||||
inet 100.90.186.31/32 scope global tailscale0
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fd7a:115c:a1e0::d101:ba97/128 scope global
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::6ddb:5b7c:f580:5ddc/64 scope link stable-privacy
|
||||
valid_lft forever preferred_lft forever
|
||||
156
niri-4screen.md
156
niri-4screen.md
@@ -1,156 +0,0 @@
|
||||
Niri + 4-Monitor Intel (DP) Migration Notes (Ubuntu 24.04+ → NixOS)
|
||||
|
||||
OWNER / CONTEXT
|
||||
- User: sam (IT)
|
||||
- Goal: Move to NixOS and daily-drive Niri on a 4-monitor setup.
|
||||
- Priority: Reliability and broad tool compatibility over “polish”.
|
||||
- Testing style: often SSH in from another machine because local display can go
|
||||
black during compositor/DM experiments.
|
||||
|
||||
REMOTE REQUIREMENT (clarified)
|
||||
- SSH is sufficient even when nobody is logged in locally (sshd runs pre-login).
|
||||
- Remote GUI login is optional/rare. Do not design around RustDesk-at-greeter on
|
||||
Wayland.
|
||||
- If remote GUI login is ever needed later, consider adding GNOME+GDM+RDP as a
|
||||
separate capability; keep Niri as main local session.
|
||||
|
||||
HARDWARE SUMMARY
|
||||
- GPU: Intel iGPU (exact model TBD)
|
||||
- Outputs: 4x DisplayPort to 4x HP LA2205 monitors
|
||||
- DRM nodes observed on Ubuntu (node numbering may differ on NixOS):
|
||||
- Primary KMS card for the 4 DP outputs: /dev/dri/card2
|
||||
- Render node: /dev/dri/renderD129
|
||||
- Notes: There may be multiple /dev/dri/card* devices. Session must pick the
|
||||
correct device driving the 4 DP outputs.
|
||||
|
||||
NOTE (2026-01 recon):
|
||||
- Current Ubuntu hardware scan shows NVIDIA Quadro P620 is driving /dev/fb0 at 1680x1050.
|
||||
- This suggests the monitors may actually be attached to the Quadro, not the Intel outputs.
|
||||
- Before finalizing GPU/device selection, verify:
|
||||
- ls -l /dev/dri/by-path
|
||||
- loginctl seat-status seat0
|
||||
- (optional) niri output listing once in session
|
||||
|
||||
KNOWN KERNEL / PLATFORM ISSUES
|
||||
- IOMMU faults / “Operation not permitted” style crashes were avoided on Ubuntu
|
||||
with kernel flags:
|
||||
- intel_iommu=off
|
||||
- dev_mem_signed_off=1
|
||||
- These flags may or may not be needed on NixOS; keep them as a known-good
|
||||
baseline and only remove once stable.
|
||||
|
||||
UBUNTU WORKING STATE (IMPORTANT BEHAVIORAL FINDINGS)
|
||||
1) GDM “gear icon” / Wayland sessions
|
||||
- GDM did not show Wayland sessions until Wayland was enabled.
|
||||
- /etc/gdm3/custom.conf had WaylandEnable=false. Commenting it out fixed
|
||||
session availability after restarting GDM.
|
||||
|
||||
2) .desktop Exec path issue
|
||||
- Session .desktop pointing Exec to /home/sam/start-niri.sh caused GDM issues.
|
||||
- Home perms were drwxr-x--- (750), so greeter user couldn’t traverse /home
|
||||
reliably.
|
||||
- Fix: Exec must point to a system path (/usr/bin or /usr/local/bin), not
|
||||
/home.
|
||||
|
||||
3) niri-session issue (major root cause of login loop)
|
||||
- /usr/bin/niri-session existed but session immediately returned to login.
|
||||
- Logs showed:
|
||||
Failed to start niri.service: Unit niri.service not found.
|
||||
Failed to start niri-shutdown.target: Unit niri-shutdown.target not found.
|
||||
- Therefore niri-session was not usable as packaged (missing systemd user
|
||||
units).
|
||||
|
||||
4) FINAL WORKING FIX ON UBUNTU (proven)
|
||||
- /usr/share/wayland-sessions/niri.desktop set to start Niri directly:
|
||||
Exec=/usr/bin/niri --session
|
||||
- This bypassed niri-session and made Niri start successfully from GDM.
|
||||
|
||||
SESSION START METHOD (proven)
|
||||
- Known working from a display manager: Exec = `niri --session`
|
||||
- Avoid relying on `niri-session` unless NixOS packaging provides the required
|
||||
systemd user units (niri.service, niri-shutdown.target).
|
||||
|
||||
PERMISSIONS / SECURITY WORKAROUNDS USED DURING TESTING
|
||||
- User group membership on Ubuntu: video, render, seat
|
||||
- Custom udev rules were created to chmod 666 DRM nodes.
|
||||
- Result: /dev/dri/card2 and /dev/dri/renderD129 became world-writable.
|
||||
- This is NOT desired long term; prefer logind seat ACLs.
|
||||
- On NixOS, aim to avoid chmod 666 rules unless absolutely needed for debugging.
|
||||
|
||||
NIRI CONFIG NOTES
|
||||
- Config validated successfully on Ubuntu: ~/.config/niri/config.kdl
|
||||
- Xwayland started via config:
|
||||
- spawn-at-startup "Xwayland" ":" "1"
|
||||
- Avoid exporting XDG_RUNTIME_DIR manually; let pam/systemd-logind manage it.
|
||||
- If needed to force GPU device, Niri supports choosing a render DRM device
|
||||
(exact config syntax/version dependent). On Ubuntu, correct render node was
|
||||
renderD129.
|
||||
|
||||
NIXOS TARGET STATE (WHAT WE WANT)
|
||||
- Boot to a login method that reliably starts Niri on the Intel GPU with 4
|
||||
monitors.
|
||||
- Must keep a working fallback (at minimum TTY + SSH; optionally a full DE).
|
||||
- Remote recovery/admin always possible via SSH.
|
||||
|
||||
LOGIN / DISPLAY MANAGER STRATEGY OPTIONS (pick one)
|
||||
Option A: greetd + tuigreet (recommended for Niri-first reliability)
|
||||
- Minimal moving parts, compositor-agnostic.
|
||||
- Start the session with: `niri --session`.
|
||||
- Ideal when “polish doesn’t matter” and reliability does.
|
||||
|
||||
Option B: GDM (works; proven on Ubuntu)
|
||||
- Ensure Wayland sessions enabled.
|
||||
- Ensure session Exec is not in /home.
|
||||
- If `niri-session` is incomplete, start `niri --session` directly.
|
||||
|
||||
DISPLAY MANAGER DECISION NOTE
|
||||
- If SSH-only remote is the requirement: prefer greetd for simplicity.
|
||||
- If remote graphical login is ever required: consider GDM + GNOME RDP later as
|
||||
a separate capability. (Not required now.)
|
||||
|
||||
SCREENSHARE / PORTALS REQUIREMENTS (broad tool compatibility)
|
||||
- Enable PipeWire + WirePlumber.
|
||||
- Ensure xdg-desktop-portal is installed and functional in the user session.
|
||||
- Choose a portal backend compatible with Niri (often portal-gnome and/or portal
|
||||
gtk; exact best choice may be NixOS-specific).
|
||||
- If screencast/screen-share fails in apps: check portal backend selection,
|
||||
permissions prompts, and PipeWire.
|
||||
|
||||
GPU/DRM PERMISSIONS
|
||||
- Avoid global chmod 666 udev rules in final config.
|
||||
- Use logind seat/ACLs; add user to video/render groups if needed.
|
||||
- When debugging device selection:
|
||||
- ls -l /dev/dri /dev/dri/by-path
|
||||
- loginctl seat-status seat0
|
||||
|
||||
FALLBACK PLAN
|
||||
- Minimum: TTY + SSH access always available.
|
||||
- Optional: install a full fallback DE only if needed (GNOME or Plasma).
|
||||
- Not required for Niri; just a safety net.
|
||||
|
||||
DEBUG / TROUBLESHOOTING CHECKLIST (capture these on failure)
|
||||
- niri config:
|
||||
- niri validate
|
||||
- user session logs:
|
||||
- journalctl --user -b -l --no-pager | tail -n 300
|
||||
- kernel DRM messages:
|
||||
- journalctl -b -k -l --no-pager | grep -iE "drm|i915|kms|atomic|permission" | tail
|
||||
- device inventory:
|
||||
- ls -l /dev/dri /dev/dri/by-path
|
||||
- session type:
|
||||
- echo $XDG_SESSION_TYPE
|
||||
- loginctl session-status
|
||||
|
||||
ACCEPTANCE CRITERIA (DONE WHEN)
|
||||
- Niri starts reliably after reboot from the chosen DM
|
||||
- All 4 monitors are active consistently
|
||||
- Screen sharing works in at least one browser-based app and one native app
|
||||
- SSH recovery works even if local display is broken
|
||||
- No chmod 666 DRM hacks required in the final config (preferred)
|
||||
|
||||
OPEN QUESTIONS FOR NIXOS MIGRATION
|
||||
- Exact Intel GPU model + correct DRM node mapping on NixOS (may differ)
|
||||
- Whether the kernel flags are still required on NixOS
|
||||
- Whether NixOS niri packaging includes full systemd integration units
|
||||
(niri.service, niri-shutdown.target)
|
||||
- Best portal backend combo for Niri screencast on NixOS
|
||||
28
pkgs/agentops.nix
Normal file
28
pkgs/agentops.nix
Normal file
@@ -0,0 +1,28 @@
|
||||
{ lib
|
||||
, python3Packages
|
||||
, fetchPypi
|
||||
}:
|
||||
python3Packages.buildPythonPackage rec {
|
||||
pname = "agentops";
|
||||
version = "0.4.21";
|
||||
pyproject = true;
|
||||
build-system = with python3Packages; [ hatchling ];
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
hash = "sha256-R3Wcbf1upYutL3dkJX5HeMsuNK4YDO9kL2D1atztZRA=";
|
||||
};
|
||||
# Bypasses strict dependency version checks that fail in Nixpkgs
|
||||
pythonRelaxDeps = [ "packaging" "psutil" "termcolor" ];
|
||||
propagatedBuildInputs = with python3Packages; [
|
||||
pydantic requests httpx websockets aiohttp
|
||||
opentelemetry-api opentelemetry-exporter-otlp-proto-http
|
||||
opentelemetry-instrumentation opentelemetry-sdk opentelemetry-semantic-conventions
|
||||
ordered-set packaging psutil pyyaml termcolor wrapt
|
||||
];
|
||||
pythonImportsCheck = [ "agentops" ];
|
||||
meta = with lib; {
|
||||
description = "Observability and DevTool Platform for AI Agents";
|
||||
homepage = "https://github.com/AgentOps-AI/agentops";
|
||||
license = licenses.mit;
|
||||
};
|
||||
}
|
||||
55
pkgs/agentpipe-bin.nix
Normal file
55
pkgs/agentpipe-bin.nix
Normal file
@@ -0,0 +1,55 @@
|
||||
{ lib, stdenvNoCC, fetchurl }:
|
||||
|
||||
stdenvNoCC.mkDerivation (finalAttrs: {
|
||||
pname = "agentpipe";
|
||||
version = "0.7.0";
|
||||
|
||||
src = fetchurl {
|
||||
url =
|
||||
"https://github.com/kevinelliott/agentpipe/releases/download/v${finalAttrs.version}/agentpipe_linux_amd64.tar.gz";
|
||||
sha256 ="sha256-3ofsrInUlcY1UN6LszOZGYJY0SgNB8FTwlyOXx/cznk=";
|
||||
};
|
||||
|
||||
dontConfigure = true;
|
||||
dontBuild = true;
|
||||
|
||||
unpackPhase = ''
|
||||
tar -xzf "$src"
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p "$out/bin"
|
||||
|
||||
if [ -f ./agentpipe ]; then
|
||||
install -m0755 ./agentpipe "$out/bin/agentpipe"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ -f ./agentpipe_linux_amd64 ]; then
|
||||
install -m0755 ./agentpipe_linux_amd64 "$out/bin/agentpipe"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Fallback: try to locate it if the archive layout changes.
|
||||
bin="$(find . -maxdepth 5 -type f \
|
||||
\( -name agentpipe -o -name 'agentpipe_linux_amd64' -o -name 'agentpipe_*' \) \
|
||||
! -name env-vars \
|
||||
-print -quit)"
|
||||
|
||||
if [ -z "$bin" ]; then
|
||||
echo "agentpipe binary not found after unpack. Contents:" >&2
|
||||
find . -maxdepth 5 -print >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
install -m0755 "$bin" "$out/bin/agentpipe"
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "AgentPipe multi-agent orchestrator CLI/TUI";
|
||||
homepage = "https://github.com/kevinelliott/agentpipe";
|
||||
license = licenses.mit;
|
||||
platforms = [ "x86_64-linux" ];
|
||||
mainProgram = "agentpipe";
|
||||
};
|
||||
})
|
||||
36
pkgs/agentpipe.nix
Normal file
36
pkgs/agentpipe.nix
Normal file
@@ -0,0 +1,36 @@
|
||||
{ lib, buildGoModule, fetchFromGitHub }:
|
||||
|
||||
buildGoModule rec {
|
||||
pname = "agentpipe";
|
||||
version = "0.6.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "kevinelliott";
|
||||
repo = "agentpipe";
|
||||
rev = "v${version}";
|
||||
hash ="sha256-sLnlgXG4Qy1nTbLyx2ci2492kwi8NNaue/4Xpdx7LQw=";
|
||||
};
|
||||
|
||||
vendorHash ="sha256-ZvJ4N2SVVBbxL2qyz/FyXUvrmTGyoojwitf5p1xSUo0=";
|
||||
subPackages = [ "." ];
|
||||
|
||||
# Avoid dynamic linking surprises.
|
||||
|
||||
env = {
|
||||
CGO_ENABLED = "0";
|
||||
};
|
||||
|
||||
ldflags = [
|
||||
"-s"
|
||||
"-w"
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description =
|
||||
"CLI/TUI orchestrator for multi-agent conversations between AI CLI tools";
|
||||
homepage = "https://github.com/kevinelliott/agentpipe";
|
||||
license = licenses.mit;
|
||||
mainProgram = "agentpipe";
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
||||
26
pkgs/autogpt.nix
Normal file
26
pkgs/autogpt.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
{ lib, buildPythonPackage, fetchFromGitHub, python3Packages }:
|
||||
buildPythonPackage rec {
|
||||
pname = "autogpt";
|
||||
version = "0.5.2";
|
||||
src = fetchFromGitHub {
|
||||
owner = "Significant-Gravitas";
|
||||
repo = "AutoGPT";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-0000000000000000000000000000000000000000000000000000"; # NEEDS UPDATE
|
||||
};
|
||||
|
||||
propagatedBuildInputs = with python3Packages; [
|
||||
openai
|
||||
langchain
|
||||
chromadb
|
||||
sqlalchemy
|
||||
beautifulsoup4
|
||||
requests
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description = "AutoGPT - Autonomous AI agent";
|
||||
homepage = "https://github.com/Significant-Gravitas/AutoGPT";
|
||||
license = licenses.mit;
|
||||
};
|
||||
}
|
||||
29
pkgs/cao-cli.nix
Normal file
29
pkgs/cao-cli.nix
Normal file
@@ -0,0 +1,29 @@
|
||||
{ lib
|
||||
, python3Packages
|
||||
, fetchFromGitHub
|
||||
}:
|
||||
python3Packages.buildPythonPackage rec {
|
||||
pname = "cli-agent-orchestrator";
|
||||
version = "1.0.3";
|
||||
pyproject = true;
|
||||
build-system = with python3Packages; [ hatchling ];
|
||||
src = fetchFromGitHub {
|
||||
owner = "awslabs";
|
||||
repo = "cli-agent-orchestrator";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-syfUQaHeubQnFLgAcIoMozcYA8wuFfcuR2at/J96FoE=";
|
||||
};
|
||||
# Relaxes version bounds on dependencies for NixOS compatibility
|
||||
pythonRelaxDeps = true;
|
||||
propagatedBuildInputs = with python3Packages; [
|
||||
fastapi pydantic sqlalchemy uvicorn websockets libtmux
|
||||
click requests aiofiles python-frontmatter watchdog
|
||||
apscheduler fastmcp
|
||||
];
|
||||
pythonImportsCheck = [ "cli_agent_orchestrator" ];
|
||||
meta = with lib; {
|
||||
description = "CLI Agent Orchestrator - multi-agent collaboration via tmux";
|
||||
homepage = "https://github.com/awslabs/cli-agent-orchestrator";
|
||||
license = licenses.asl20;
|
||||
};
|
||||
}
|
||||
34
pkgs/mediapipe.nix
Normal file
34
pkgs/mediapipe.nix
Normal file
@@ -0,0 +1,34 @@
|
||||
{ lib
|
||||
, stdenv
|
||||
, python3Packages
|
||||
, fetchurl
|
||||
, autoPatchelfHook
|
||||
, opencv
|
||||
, libglvnd
|
||||
}:
|
||||
python3Packages.buildPythonPackage rec {
|
||||
pname = "mediapipe";
|
||||
version = "0.10.32";
|
||||
format = "wheel";
|
||||
src = fetchurl {
|
||||
url = "https://files.pythonhosted.org/packages/e3/98/00cd8b2dcb563f2298655633e6611a791b2c1a7df1dae064b2b96084f1bf/mediapipe-0.10.32-py3-none-manylinux_2_28_x86_64.whl";
|
||||
hash = "sha256-SwlB+7vOQYYvE8sYUMSHjBPbxizV6B50iABRt6IM47Y=";
|
||||
};
|
||||
nativeBuildInputs = [ autoPatchelfHook ];
|
||||
buildInputs = [
|
||||
stdenv.cc.cc.lib
|
||||
opencv
|
||||
libglvnd
|
||||
];
|
||||
propagatedBuildInputs = with python3Packages; [
|
||||
numpy
|
||||
absl-py
|
||||
protobuf
|
||||
opencv4
|
||||
];
|
||||
meta = with lib; {
|
||||
description = "MediaPipe - Google's media processing framework";
|
||||
homepage = "https://github.com/google/mediapipe";
|
||||
license = licenses.asl20;
|
||||
};
|
||||
}
|
||||
27
pkgs/react-doctor.nix
Normal file
27
pkgs/react-doctor.nix
Normal file
@@ -0,0 +1,27 @@
|
||||
{ lib, nodejs, pkgs, buildNpmPackage, fetchFromGitHub }:
|
||||
buildNpmPackage rec {
|
||||
pname = "react-doctor";
|
||||
version = "0.0.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "millionco";
|
||||
repo = "react-doctor";
|
||||
rev = "0.0.1";
|
||||
hash = "sha256-T8szJcXeqIWmZQU/D4KpeFU1ZXilThL5JBmw2Y0hZkw=";
|
||||
};
|
||||
|
||||
npmDepsHash = lib.fakeHash;
|
||||
|
||||
# CRITICAL: Generate package-lock.json during build
|
||||
postPatch = ''
|
||||
cd $sourceRoot
|
||||
npm install --package-lock-only --no-audit --progress=false
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Let coding agents diagnose and fix your React code";
|
||||
homepage = "https://github.com/millionco/react-doctor";
|
||||
license = licenses.mit;
|
||||
mainProgram = "react-doctor";
|
||||
};
|
||||
}
|
||||
31
pkgs/sidecar-bin.nix
Normal file
31
pkgs/sidecar-bin.nix
Normal file
@@ -0,0 +1,31 @@
|
||||
{ lib, stdenvNoCC, fetchurl }:
|
||||
|
||||
stdenvNoCC.mkDerivation {
|
||||
pname = "sidecar";
|
||||
version = "0.71.1";
|
||||
|
||||
src = fetchurl {
|
||||
url =
|
||||
"https://github.com/marcus/sidecar/releases/download/v0.71.1/sidecar_0.71.1_linux_amd64.tar.gz";
|
||||
sha256 = "sha256-FFisAM3oHZL8lp35/shvYPj/jmfNohoTiTuVrtePeCU=";
|
||||
};
|
||||
|
||||
dontUnpack = false;
|
||||
|
||||
unpackPhase = ''
|
||||
tar -xzf "$src"
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p "$out/bin"
|
||||
install -m0755 sidecar "$out/bin/sidecar"
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Sidecar terminal dashboard for monitoring AI coding agents";
|
||||
homepage = "https://github.com/marcus/sidecar";
|
||||
license = licenses.mit;
|
||||
platforms = [ "x86_64-linux" ];
|
||||
mainProgram = "sidecar";
|
||||
};
|
||||
}
|
||||
55
plan.md
55
plan.md
@@ -1,55 +0,0 @@
|
||||
You are a devops engineer.
|
||||
You are brief and concise and will help guide me through my plan.
|
||||
Plan is to migrate my ubuntu system on the main drive with OS installed to NixOS.
|
||||
I have backed up the required files from Windows dual boot and Ubuntu to Integral300 mounted at /media/sam/Integral300/
|
||||
|
||||
DECISION:
|
||||
- We will WIPE the entire NVMe disk (/dev/nvme0n1). We are NOT keeping Windows partitions.
|
||||
|
||||
We need to make a list of software that needs to be installed on the NixOS. There are several files, and some folders to look through.
|
||||
We need to create a finalized list of software to ensure we have what we need.
|
||||
|
||||
We do not need to include everything in the list, just the things I have installed and need that are not generic system utils. The list needs to be concise and without duplicates.
|
||||
|
||||
Then we will be making a NixOS flake-based configuration using:
|
||||
- hosts/sam-4screen-desktop/configuration.nix
|
||||
- home-manager (home/sam/home.nix)
|
||||
- flake.nix
|
||||
|
||||
We will store/push this repo to my Gitea server so the config is available during install.
|
||||
|
||||
Dotfiles:
|
||||
- Dotfiles will be placed on the new NixOS system at: ~/dotfiles
|
||||
- Home Manager will symlink config from ~/dotfiles
|
||||
|
||||
We will be using Niri as the primary display.
|
||||
- Display/login manager: greetd + tuigreet
|
||||
- Start method: niri --session (do not use niri-session)
|
||||
|
||||
Networking:
|
||||
- Use NetworkManager
|
||||
- Static IP must be 192.168.20.27/24, applied on Wi-Fi SSID "Aussie Broadband 8729" (wlp4s2)
|
||||
|
||||
Some software is in the ai dev plan. If this is easy to include thats ok. Otherwise I can integrate that once the system is running.
|
||||
This approach applies to anything else that maybe problematic. We do not have to go all in at once. Get the main things working with niri, display manager, essential zsh utils, then dotfiles with homemanager, then AI tooling, etc. Keep adding to successful install.
|
||||
|
||||
I have a second machine on the desktop that can be used to ssh into this new NixOS if need be.
|
||||
|
||||
Folder /docs has more directions for the PLAN and software list.
|
||||
- docs/nixos_build_spec.md is the source-of-truth for disk/boot/network decisions.
|
||||
- docs/software_inventory.md (or equivalent) is the source-of-truth for the final software list.
|
||||
|
||||
Folder /logs has some scans and hardware profiles which can be used for planning and software.
|
||||
|
||||
Folder /results has the original migration configuration.nix results. We will eventually replicate this and create a new more up to date one. This can be used as a reference if needed.
|
||||
|
||||
Please ask questions, request access to file systems where needed.
|
||||
|
||||
Summary:
|
||||
- Build software list
|
||||
- Finalize list in collaboration with me
|
||||
- Build NixOS configuration (flake + home-manager)
|
||||
- Push to Gitea
|
||||
- Install NixOS (wipe entire NVMe)
|
||||
- Generate and commit hardware-configuration.nix during install
|
||||
- Boot into NixOS, clone/copy dotfiles to ~/dotfiles, verify Niri + static IP + SSH
|
||||
@@ -1,192 +0,0 @@
|
||||
# NixOS + Home Manager Setup Overview (sam/nixos)
|
||||
|
||||
This document is a practical overview of how this NixOS setup was built and how
|
||||
“dotfiles” are managed, so another AI session (or you later) can replicate it on
|
||||
another machine.
|
||||
|
||||
Repo: `ssh://git@gitea.lab.audasmedia.com.au:2222/sam/nixos.git`
|
||||
|
||||
## Goals of this setup
|
||||
|
||||
- Reproducible NixOS install via flakes (`nixos-rebuild` / `nixos-install`)
|
||||
- Home Manager managed user config (zsh, kitty, nvim config, etc.)
|
||||
- KDE Plasma + Hyprland selectable at SDDM login
|
||||
- Neovim works reliably on NixOS:
|
||||
- config tracked in git
|
||||
- plugins installed via lazy.nvim into a writable directory
|
||||
- avoid writing any lockfiles into `/nix/store` (read-only)
|
||||
|
||||
## High-level architecture
|
||||
|
||||
- System config: `hosts/<host>/configuration.nix`
|
||||
- Hardware config: `hosts/<host>/hardware-configuration.nix`
|
||||
- generated per-machine during install, then committed
|
||||
- Home Manager (as NixOS module): `home/sam/home.nix`
|
||||
- Neovim config stored in repo: `home/sam/nvim/...`
|
||||
|
||||
### Repo structure (typical)
|
||||
- `flake.nix`
|
||||
- `hosts/aspire-laptop/configuration.nix`
|
||||
- `hosts/aspire-laptop/hardware-configuration.nix`
|
||||
- `home/sam/home.nix`
|
||||
- `home/sam/nvim/` (init.lua, lua/, lazy-lock.json from old setup if needed)
|
||||
- `scripts/install-from-iso.sh`
|
||||
|
||||
## Installation procedure (wipe disk)
|
||||
|
||||
### BIOS notes
|
||||
- Secure Boot disabled on the Acer test laptop for easiest install.
|
||||
(If Secure Boot is locked by a BIOS Supervisor password, bare-metal install may
|
||||
be blocked; use a VM test instead.)
|
||||
|
||||
### From the NixOS graphical ISO (live environment)
|
||||
1. Connect to the internet.
|
||||
2. Clone repo to the live environment:
|
||||
- `git clone ssh://git@gitea.lab.audasmedia.com.au:2222/sam/nixos.git /tmp/nixos`
|
||||
|
||||
3. Partition/mount (WIPES DISK):
|
||||
- Identify disk (e.g. `/dev/sda` or `/dev/nvme0n1`)
|
||||
- Run:
|
||||
- `sudo DISK=/dev/<disk> bash /tmp/nixos/scripts/install-from-iso.sh`
|
||||
|
||||
This creates:
|
||||
- EFI partition (vfat)
|
||||
- Btrfs root with subvolumes `@` and `@home`
|
||||
- Mounts under `/mnt` and generates `/mnt/etc/nixos/hardware-configuration.nix`
|
||||
|
||||
4. Copy repo into target:
|
||||
- `sudo rm -rf /mnt/etc/nixos`
|
||||
- `sudo mkdir -p /mnt/etc`
|
||||
- `sudo cp -a /tmp/nixos /mnt/etc/nixos`
|
||||
|
||||
5. Copy generated hardware config into the repo host path:
|
||||
- `sudo cp -f /mnt/etc/nixos/hardware-configuration.nix /mnt/etc/nixos/hosts/<host>/hardware-configuration.nix`
|
||||
|
||||
6. Install:
|
||||
- `sudo nixos-install --flake /mnt/etc/nixos#<host>`
|
||||
- reboot
|
||||
|
||||
### After first boot
|
||||
- Set password for `sam` if needed:
|
||||
- `sudo passwd sam`
|
||||
- If using Tailscale:
|
||||
- `sudo tailscale up`
|
||||
|
||||
## SSH access (to administer remotely)
|
||||
|
||||
This setup enabled OpenSSH server via NixOS config.
|
||||
|
||||
- `services.openssh.enable = true;`
|
||||
- `services.openssh.openFirewall = true;`
|
||||
- Password auth was enabled for convenience in testing (not best practice).
|
||||
|
||||
To apply:
|
||||
- `sudo nixos-rebuild switch --flake /etc/nixos#<host>`
|
||||
|
||||
## “Dotfiles” / config management approach (what we actually did)
|
||||
|
||||
### The key rule
|
||||
Home Manager symlinks managed files into `/nix/store` (read-only). That is fine
|
||||
for config files, but NOT fine for files that apps need to write to at runtime.
|
||||
|
||||
### Neovim (special case)
|
||||
Neovim + lazy.nvim expects to write:
|
||||
- lockfile
|
||||
- plugin installs
|
||||
- cache/state
|
||||
|
||||
So:
|
||||
|
||||
1) The Neovim config code is kept in git and linked by Home Manager, but we do
|
||||
NOT have HM own the entire `~/.config/nvim` directory.
|
||||
|
||||
We link only:
|
||||
- `~/.config/nvim/init.lua`
|
||||
- `~/.config/nvim/lua/`
|
||||
|
||||
Example Home Manager linking (conceptual):
|
||||
- `xdg.configFile."nvim/init.lua".source = ./nvim/init.lua;`
|
||||
- `xdg.configFile."nvim/lua".source = ./nvim/lua;`
|
||||
|
||||
2) lazy.nvim is configured to write lockfile into a writable location:
|
||||
- lockfile path: `vim.fn.stdpath("data") .. "/lazy-lock.json"`
|
||||
(=> `~/.local/share/nvim/lazy-lock.json`)
|
||||
|
||||
3) Plugins are installed by lazy.nvim into:
|
||||
- `~/.local/share/nvim/lazy/`
|
||||
|
||||
4) After a new install / new machine, bootstrap plugins with:
|
||||
- `nvim --headless "+Lazy! sync" "+qa"`
|
||||
|
||||
### Why we avoided Nix-managed Neovim plugins in HM
|
||||
If `programs.neovim.plugins = ...` is used, Neovim may load plugins from a
|
||||
read-only Nix “vim pack dir” under `/nix/store/...`.
|
||||
Some plugins (notably treesitter) try to write build artifacts into the plugin
|
||||
directory, which fails on read-only paths.
|
||||
|
||||
Therefore:
|
||||
- Nix installs `nvim` + dependencies (node/python/rg/fd/compilers).
|
||||
- lazy.nvim installs the plugins at runtime into user-writable dirs.
|
||||
|
||||
### Other tools
|
||||
Most other CLI tools can be installed declaratively via NixOS or Home Manager.
|
||||
Their configs can be safely managed by HM as symlinks (read-only is fine).
|
||||
|
||||
## Notable fixes/decisions made during setup
|
||||
|
||||
- If you see errors like “Read-only file system” writing `lazy-lock.json`,
|
||||
it means HM is managing the lockfile path. Fix by moving lockfile to data dir
|
||||
and not linking `lazy-lock.json` into `/nix/store`.
|
||||
|
||||
- Treesitter module name mismatch was fixed in config to handle upstream changes:
|
||||
attempt `require("nvim-treesitter.config")` and fallback to
|
||||
`require("nvim-treesitter.configs")`.
|
||||
|
||||
- Avante was disabled on low-power machines by removing/renaming its plugin spec
|
||||
file so lazy.nvim does not load it.
|
||||
|
||||
- Git remote update issues were resolved using:
|
||||
- `git fetch origin`
|
||||
- `git pull --rebase origin main`
|
||||
- `git push`
|
||||
|
||||
## Adding programs (basic workflow)
|
||||
|
||||
### System-wide packages
|
||||
Edit:
|
||||
- `hosts/<host>/configuration.nix`
|
||||
Add to:
|
||||
- `environment.systemPackages = with pkgs; [ ... ];`
|
||||
Apply:
|
||||
- `sudo nixos-rebuild switch --flake /etc/nixos#<host>`
|
||||
|
||||
### User-only packages
|
||||
Edit:
|
||||
- `home/sam/home.nix`
|
||||
Add to:
|
||||
- `home.packages = with pkgs; [ ... ];`
|
||||
Apply:
|
||||
- `sudo nixos-rebuild switch --flake /etc/nixos#<host>`
|
||||
|
||||
### Then commit + push
|
||||
- `cd /etc/nixos`
|
||||
- `git add -A`
|
||||
- `git commit -m "..." && git push`
|
||||
|
||||
## Secrets (do not put in git)
|
||||
Do not commit API keys (Gemini/OpenAI/etc.) into this repo.
|
||||
|
||||
Preferred:
|
||||
- store secrets outside git (password manager) and export into your shell
|
||||
- or use a secret manager like `sops-nix` later
|
||||
|
||||
Example (local-only) environment file:
|
||||
- `~/.config/environment.d/10-secrets.conf`
|
||||
- contains `GEMINI_API_KEY=...`
|
||||
- not tracked in git
|
||||
|
||||
## References
|
||||
- NixOS Manual: https://nixos.org/manual/nixos/stable/
|
||||
- Home Manager Manual: https://nix-community.github.io/home-manager/
|
||||
- Flakes: https://nixos.wiki/wiki/Flakes
|
||||
- Packages/options search: https://search.nixos.org/
|
||||
@@ -1,112 +0,0 @@
|
||||
System (NixOS) services / core
|
||||
|
||||
- NetworkManager
|
||||
|
||||
- OpenSSH server (sshd) (password auth enabled)
|
||||
|
||||
- Tailscale (client)
|
||||
|
||||
- PipeWire audio (Pulse/ALSA)
|
||||
|
||||
- Firewall (enabled)
|
||||
|
||||
Shell / terminal
|
||||
|
||||
- zsh (default shell)
|
||||
|
||||
- kitty (terminal emulator)
|
||||
|
||||
Browsers / GUI apps
|
||||
|
||||
- Google Chrome
|
||||
|
||||
- VS Code
|
||||
|
||||
- Thunderbird
|
||||
|
||||
CLI / terminal utilities
|
||||
|
||||
- git, curl, wget, jq
|
||||
|
||||
- ripgrep (rg), fd (fd)
|
||||
|
||||
- bat, btop
|
||||
|
||||
- eza, zoxide, fzf
|
||||
|
||||
- starship
|
||||
|
||||
- atuin
|
||||
|
||||
- zellij
|
||||
|
||||
- lazygit
|
||||
|
||||
- gh (GitHub CLI)
|
||||
|
||||
- borgbackup
|
||||
|
||||
- yazi
|
||||
|
||||
- tealdeer (tldr)
|
||||
|
||||
- navi
|
||||
|
||||
- dua
|
||||
|
||||
- wl-clipboard, xclip
|
||||
|
||||
Build / dev dependencies
|
||||
|
||||
- neovim
|
||||
|
||||
- gcc, gnumake, unzip
|
||||
|
||||
- nodejs, python3, pynvim (Neovim providers)
|
||||
|
||||
Docs / LaTeX
|
||||
|
||||
- pandoc
|
||||
|
||||
- texlive (scheme-small)
|
||||
|
||||
- zathura (+ PDF backend as configured)
|
||||
|
||||
Neovim (config + plugins)
|
||||
|
||||
- Neovim config stored in repo: home/sam/nvim
|
||||
|
||||
- Plugin manager: lazy.nvim
|
||||
|
||||
- Plugins (from your lazy-lock.json, with Avante disabled):
|
||||
- which-key.nvim
|
||||
|
||||
- vimtex
|
||||
|
||||
- nvim-treesitter
|
||||
|
||||
- telescope.nvim + telescope-themes
|
||||
|
||||
- mason.nvim + mason-lspconfig.nvim
|
||||
|
||||
- nvim-lspconfig
|
||||
|
||||
- conform.nvim
|
||||
|
||||
- nvim-lint
|
||||
|
||||
- nvim-cmp + cmp-* + LuaSnip
|
||||
|
||||
- nvim-tree.lua + nvim-web-devicons
|
||||
|
||||
- gitsigns.nvim
|
||||
|
||||
- Comment.nvim
|
||||
|
||||
- nvim-dap + nvim-dap-ui + nvim-nio
|
||||
|
||||
- Themes: catppuccin, tokyonight, onedark, kanagawa, gruvbox, everforest, dracula
|
||||
|
||||
- Markdown: vim-markdown + tabular, live-preview.nvim
|
||||
|
||||
- lualine.nvim, plenary.nvim, dressing.nvim, nui.nvim (deps)
|
||||
@@ -1,117 +0,0 @@
|
||||
# NixOS Configuration: /results/configuration.nix
|
||||
# This file configures the core NixOS system.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ # Include the results of the hardware scan.
|
||||
# This file will be generated by the NixOS installer.
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
# Bootloader.
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
# ---
|
||||
# NETWORKING
|
||||
# ---
|
||||
networking.hostName = "nixos-desktop";
|
||||
networking.networkmanager.enable = true;
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Australia/Sydney";
|
||||
|
||||
# ---
|
||||
# USER ACCOUNTS
|
||||
# ---
|
||||
users.users.sam = {
|
||||
isNormalUser = true;
|
||||
description = "Sam";
|
||||
extraGroups = [ "networkmanager" "wheel" ]; # "wheel" allows sudo
|
||||
};
|
||||
|
||||
# ---
|
||||
# GRAPHICS & DESKTOP ENVIRONMENT
|
||||
# ---
|
||||
services.xserver = {
|
||||
enable = true;
|
||||
# Enable KDE Plasma 5 Desktop Environment
|
||||
desktopManager.plasma5.enable = true;
|
||||
# Enable SDDM as the display manager
|
||||
displayManager.sddm.enable = true;
|
||||
# Use the proprietary NVIDIA drivers
|
||||
videoDrivers = [ "nvidia" ];
|
||||
};
|
||||
|
||||
# Enable OpenGL and Vulkan support
|
||||
hardware.opengl = {
|
||||
enable = true;
|
||||
driSupport = true;
|
||||
driSupport32Bit = true;
|
||||
};
|
||||
|
||||
# Configure NVIDIA drivers for Hybrid Graphics (Intel + NVIDIA)
|
||||
hardware.nvidia = {
|
||||
modesetting.enable = true;
|
||||
# Use the stable proprietary driver package
|
||||
package = config.boot.kernelPackages.nvidiaPackages.stable;
|
||||
# Configure PRIME Render Offload
|
||||
prime = {
|
||||
sync.enable = true;
|
||||
# Set the PCI bus IDs for your GPUs (from lspci output)
|
||||
intelBusId = "PCI:0:2:0";
|
||||
nvidiaBusId = "PCI:1:0:0";
|
||||
};
|
||||
};
|
||||
|
||||
# ---
|
||||
# SOFTWARE PACKAGES
|
||||
# ---
|
||||
environment.systemPackages = with pkgs; [
|
||||
# --- Tier 1: Critical Applications & Services ---
|
||||
firefox thunderbird kitty neovim nushell vscode telegram-desktop
|
||||
# --- Tier 2: Development & CLI Tools ---
|
||||
git rustc cargo nodejs python3 gcc gnumake btop eza bat fzf ripgrep zoxide
|
||||
# --- Tier 3: Desktop & GUI Applications ---
|
||||
libreoffice flameshot vlc spotify timeshift
|
||||
];
|
||||
|
||||
# ---
|
||||
# SERVICES
|
||||
# ---
|
||||
# Enable sound with PipeWire.
|
||||
sound.enable = true;
|
||||
hardware.pulseaudio.enable = false;
|
||||
security.rtkit.enable = true;
|
||||
services.pipewire = {
|
||||
enable = true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
};
|
||||
|
||||
# Enable CUPS for printing.
|
||||
services.printing.enable = true;
|
||||
|
||||
# ---
|
||||
# DISK MOUNTS
|
||||
# ---
|
||||
fileSystems."/mnt/ubuntu_storage_3TB" = {
|
||||
device = "/dev/disk/by-uuid/037a542c-6aa9-4b1f-ab2f-4b6922ab371f";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/mnt/windows-storage" = {
|
||||
device = "/dev/disk/by-uuid/063E316A3E315441";
|
||||
fsType = "ntfs-3g";
|
||||
options = [ "rw" "uid=1000" "gid=100" "umask=007" ];
|
||||
};
|
||||
|
||||
# Allow installation of unfree packages (like NVIDIA drivers)
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
# Set the system state version.
|
||||
system.stateVersion = "24.05";
|
||||
}
|
||||
@@ -1,144 +0,0 @@
|
||||
# NixOS Configuration - AUTO-GENERATED DRAFT
|
||||
# Path: results/generated_configuration.nix
|
||||
#
|
||||
# This file was auto-generated on $(date) based on system reconnaissance.
|
||||
# !!! IMPORTANT !!!
|
||||
# This is a DRAFT and a starting point. It WILL require manual review and editing.
|
||||
# - Verify all package names against the Nixpkgs repository.
|
||||
# - Check service options and configurations.
|
||||
# - Double-check all hardware and disk mount settings.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ # This will be generated by the NixOS installer.
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
# Bootloader.
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
# --- NETWORKING ---
|
||||
# See logs/06_netplan_config.log for details.
|
||||
networking.hostName = "nixos-desktop"; # Set your desired hostname.
|
||||
networking.networkmanager.enable = true;
|
||||
# The scan found Tailscale running. You will likely want to enable it here.
|
||||
# services.tailscale.enable = true;
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Australia/Sydney"; # Please verify this is correct.
|
||||
|
||||
# --- USER ACCOUNTS ---
|
||||
users.users.sam = {
|
||||
isNormalUser = true;
|
||||
description = "Sam";
|
||||
extraGroups = [ "networkmanager" "wheel" "docker" ]; # "wheel" allows sudo. Add other groups if needed.
|
||||
};
|
||||
|
||||
# --- SOFTWARE PACKAGES (DERIVED FROM RECON LOG) ---
|
||||
environment.systemPackages = with pkgs; [
|
||||
# --- Essentials & CLI Tools (from history and manual install logs) ---
|
||||
git
|
||||
wget
|
||||
curl
|
||||
htop # btop is an alternative available in nix
|
||||
neovim
|
||||
zsh
|
||||
zoxide
|
||||
ripgrep
|
||||
fzf
|
||||
tree
|
||||
|
||||
# --- Rust & Go Environment ---
|
||||
rustc
|
||||
cargo
|
||||
go
|
||||
|
||||
# --- Python Environment ---
|
||||
python3
|
||||
|
||||
# --- Node.js Environment ---
|
||||
nodejs # Consider specifying a version, e.g., nodejs-20_x
|
||||
|
||||
# --- Desktop & GUI Applications ---
|
||||
firefox
|
||||
thunderbird
|
||||
vlc
|
||||
gimp
|
||||
inkscape
|
||||
obs-studio
|
||||
|
||||
# --- Manually Installed Tools (verify package names) ---
|
||||
arduino-cli
|
||||
lazygit
|
||||
ollama
|
||||
scrcpy
|
||||
|
||||
# --- Snap Packages (find equivalents in nixpkgs) ---
|
||||
# The following were installed as snaps. Find their NixOS equivalents.
|
||||
# - code (vscode)
|
||||
# - mqtt-explorer
|
||||
# - notepad-plus-plus (likely use notepadqq or similar)
|
||||
# - spotify
|
||||
# - telegram-desktop
|
||||
|
||||
# --- Other APT Packages (selection of common tools found) ---
|
||||
# A full list is in logs/04_nixos_recon.log. Add what you need.
|
||||
nmap
|
||||
minicom
|
||||
screen
|
||||
net-tools # for ifconfig, etc.
|
||||
gnome.gnome-tweaks
|
||||
|
||||
];
|
||||
|
||||
# --- SERVICES & VIRTUALIZATION ---
|
||||
|
||||
# Docker was found to be in use.
|
||||
virtualisation.docker.enable = true;
|
||||
|
||||
# Ollama service was running.
|
||||
# services.ollama.enable = true; # Find the correct module for Ollama on NixOS
|
||||
|
||||
# RustDesk service was running.
|
||||
# services.rustdesk.enable = true; # Find the correct module for RustDesk on NixOS
|
||||
|
||||
# Enable sound with PipeWire.
|
||||
sound.enable = true;
|
||||
hardware.pulseaudio.enable = false;
|
||||
security.rtkit.enable = true;
|
||||
services.pipewire = {
|
||||
enable = true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
jack.enable = true;
|
||||
};
|
||||
|
||||
# Enable CUPS to print documents.
|
||||
services.printing.enable = true;
|
||||
|
||||
# --- DESKTOP ENVIRONMENT ---
|
||||
services.xserver.enable = true;
|
||||
services.xserver.displayManager.gdm.enable = true;
|
||||
services.xserver.desktopManager.gnome.enable = true;
|
||||
|
||||
# --- DISK MOUNTS ---
|
||||
# !!! CRITICAL !!!
|
||||
# Update these with the correct UUIDs from your `lsblk -f` output
|
||||
# once you have booted the NixOS installer.
|
||||
fileSystems."/data" = {
|
||||
device = "/dev/disk/by-uuid/PLEASE_REPLACE_ME"; # UUID of Integral300 drive
|
||||
fsType = "ext4";
|
||||
options = [ "defaults" ];
|
||||
};
|
||||
|
||||
# --- MISC ---
|
||||
# Allow unfree packages for things like Chrome, Spotify, etc.
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
# System state version. This should be set to the version of NixOS you install.
|
||||
system.stateVersion = "24.05";
|
||||
}
|
||||
@@ -1,123 +0,0 @@
|
||||
# NixOS Home Manager Configuration: /results/generated_home.nix
|
||||
# This file declaratively manages your user environment based on the discovered .zshrc.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Set a state version for compatibility
|
||||
home.stateVersion = "24.05";
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
# ---
|
||||
# 1. ZSH SHELL & POWERLEVEL10K PROMPT
|
||||
# ---
|
||||
programs.zsh = {
|
||||
enable = true;
|
||||
enableAutosuggestions = true;
|
||||
enableSyntaxHighlighting = true;
|
||||
oh-my-zsh = {
|
||||
enable = true;
|
||||
plugins = [ "git" ]; # zsh-autosuggestions & syntax-highlighting are enabled above
|
||||
theme = "powerlevel10k/powerlevel10k";
|
||||
};
|
||||
shellAliases = {
|
||||
ls = "eza --icons --git";
|
||||
ll = "eza -l --icons --git";
|
||||
la = "eza -la --icons --git";
|
||||
tree = "eza --tree";
|
||||
# Note: 'batcat' from your .zshrc is typically packaged as 'bat' in NixOS
|
||||
cat = "bat --color=always --paging=never";
|
||||
};
|
||||
};
|
||||
|
||||
# Set Zsh as the default shell
|
||||
home.shell = pkgs.zsh;
|
||||
|
||||
# Enable Powerlevel10k theme
|
||||
programs.powerlevel10k = {
|
||||
enable = true;
|
||||
# Your Powerlevel10k config (~/.p10k.zsh) should be linked here if you have one.
|
||||
# For example: home.file.".p10k.zsh".source = ./p10k.zsh;
|
||||
};
|
||||
|
||||
# ---
|
||||
# 2. SHELL TOOLS & INTEGRATIONS
|
||||
# ---
|
||||
programs.atuin = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
};
|
||||
programs.fzf = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
};
|
||||
programs.zoxide = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
};
|
||||
programs.nvm = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
# ---
|
||||
# 3. EDITORS & TERMINAL
|
||||
# ---
|
||||
programs.neovim = {
|
||||
enable = true;
|
||||
defaultEditor = true; # Sets EDITOR and VISUAL to nvim
|
||||
};
|
||||
programs.kitty = {
|
||||
enable = true;
|
||||
};
|
||||
programs.zellij = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
# ---
|
||||
# 4. PACKAGES & LANGUAGES
|
||||
# ---
|
||||
home.packages = with pkgs; [
|
||||
# Core Utilities
|
||||
unzip zip p7zip htop wget curl nmap minicom screen tree
|
||||
|
||||
# Modern CLI Enhancements (from .zshrc and recon logs)
|
||||
eza bat lazygit yazi tealdeer navi carapace-bin
|
||||
|
||||
# Language Toolchains
|
||||
rustup go nodejs python3
|
||||
];
|
||||
|
||||
# ---
|
||||
# 5. ENVIRONMENT & API KEYS
|
||||
# ---
|
||||
# SECURITY: Do NOT store secrets in git-tracked Nix files.
|
||||
# Use a local-only file such as:
|
||||
# ~/.config/environment.d/10-secrets.conf
|
||||
# or adopt sops-nix / agenix later.
|
||||
#
|
||||
# Example (DO NOT COMMIT):
|
||||
# home.sessionVariables = {
|
||||
# OPENAI_API_KEY = "…";
|
||||
# TAVILY_API_KEY = "…";
|
||||
# DEEPSEEK_API_KEY = "…";
|
||||
# };
|
||||
|
||||
# Add custom binary paths to your environment
|
||||
home.sessionPath = [
|
||||
# For the 'opencode' CLI tool
|
||||
"$HOME/.opencode/bin"
|
||||
];
|
||||
|
||||
# ---
|
||||
# AI TOOLS
|
||||
# ---
|
||||
programs.gemini-cli = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
# ---
|
||||
# 6. DOTFILE MANAGEMENT
|
||||
# ---
|
||||
# This section is a placeholder for linking config files from a Git repo.
|
||||
# e.g., home.file.".config/nvim/init.vim".source = ./config/nvim/init.vim;
|
||||
}
|
||||
59
setup.md
59
setup.md
@@ -1,59 +0,0 @@
|
||||
|
||||
# My Linux Environment Setup
|
||||
|
||||
## 1. Core Command-Line Applications
|
||||
|
||||
These are the underlying programs installed on the system.
|
||||
|
||||
- **eza**: Modern `ls` replacement.
|
||||
- **bat** (`batcat`): Modern `cat` replacement with syntax highlighting.
|
||||
- **ripgrep** (`rg`): Fast `grep` replacement.
|
||||
- **fzf**: Fuzzy finder for files (`Ctrl+T`) and directories (`Alt+C`).
|
||||
- **zoxide** (`z`): "Smarter `cd`" command.
|
||||
- **atuin**: Advanced, searchable shell history (`Ctrl+R`).
|
||||
- **carapace**: Rich, IDE-style command completions.
|
||||
- **tealdeer** (`tldr`): Simplified man pages.
|
||||
- **navi**: Interactive cheatsheet tool.
|
||||
- **zellij**: Terminal multiplexer for splitting windows.
|
||||
- **lazygit**: A TUI for managing Git.
|
||||
- **btop**: Resource monitor.
|
||||
- **dua-cli** (`dua`): Interactive disk usage analyzer.
|
||||
- **yazi**: Terminal file manager.
|
||||
- **xclip**: System clipboard integration.
|
||||
- **jq**: Command-line JSON processor.
|
||||
- **pandoc**: Universal document converter.
|
||||
|
||||
## 2. Shell Environments
|
||||
|
||||
### Zsh (for Kitty)
|
||||
|
||||
- **Framework**: Oh My Zsh
|
||||
- **Prompt**: Powerlevel10k
|
||||
- **Main Config**: `~/.zshrc`
|
||||
- **Key Integrations**: `zsh-autosuggestions`, `zsh-syntax-highlighting`, and hooks for all core tools.
|
||||
|
||||
|
||||
## 3. Neovim Configuration
|
||||
|
||||
- **Config Directory**: `~/.config/nvim/`
|
||||
- **Package Manager**: `lazy.nvim`
|
||||
|
||||
### Key Plugins Installed
|
||||
|
||||
- **Core Functionality**:
|
||||
- `nvim-lspconfig` & `mason.nvim`: Language Server support.
|
||||
- `nvim-cmp`: Autocompletion.
|
||||
- `telescope.nvim`: Fuzzy finding.
|
||||
- `nvim-treesitter`: Advanced syntax highlighting.
|
||||
- `nvim-lint`: Code quality analysis.
|
||||
- `nvim-dap` & `nvim-dap-ui`: Integrated debugging.
|
||||
- **UI & Experience**:
|
||||
- `gitsigns.nvim`: Git status markers.
|
||||
- `lualine.nvim`: Configurable status line.
|
||||
- `which-key.nvim`: Keybinding popup.
|
||||
- **Quality of Life**:
|
||||
- `Comment.nvim`: Universal comment toggling.
|
||||
- `nvim-autopairs`: Automatic bracket closing.
|
||||
- **Themes & Switching**:
|
||||
- `catppuccin`, `tokyonight`, `gruvbox`, `dracula`, `kanagawa`, `everforest`, `onedark`.
|
||||
- `andrewberty/telescope-themes`: Telescope extension for theme switching.
|
||||
@@ -1,16 +0,0 @@
|
||||
Aider Command Line The Gold Standard. It writes code directly to your files with incredible accuracy and works perfectly with OpenRouter.
|
||||
|
||||
OpenCode Terminal UI Visual learners who want a "dashboard" feel inside their terminal.
|
||||
GEmini Cli
|
||||
|
||||
Goose Agentic / MCP The newest "power player." It uses the Model Context Protocol (MCP) to let the AI use your actual computer tools (terminal, browser, memory
|
||||
|
||||
|
||||
Aprise for letting people know - messaging.
|
||||
Obsidian
|
||||
|
||||
Tailscale
|
||||
RustDesk
|
||||
Telegram
|
||||
Thundirbird - is there an alternative?
|
||||
Flameshot
|
||||
Reference in New Issue
Block a user