77 Commits

Author SHA1 Message Date
kenji 17cb857271 added virtualbox 2025-12-22 18:51:43 -06:00
kenji 86742306cb removed virtual box 2025-12-22 08:38:46 -06:00
kenji 47f2d1bd2a added adwaita icons 2025-12-15 10:11:07 -06:00
kenji 92d6e19fa8 added easy effects 2025-12-15 10:11:03 -06:00
kenji a8f6af8fc9 fix print not detecting printers 2025-12-13 09:42:34 -06:00
kenji e914ffd552 updated illogical impulse 2025-12-13 09:40:04 -06:00
kenji a308923512 a 2025-12-13 09:35:21 -06:00
kenji c148be1a99 omarchy-nix: resoulte 2025-12-12 11:11:39 -06:00
kenji ced387584e omarchy-nix: fixed missing config 2025-12-12 10:12:10 -06:00
kenji ac840fb5e9 omarchy-nix: added 2025-12-12 10:10:37 -06:00
kenji 71d1da366d README: added more broke stuff 2025-12-12 10:10:25 -06:00
kenji e0b9f8b91a README: added problems 2025-12-12 09:34:01 -06:00
kenji c510e43618 hardware: update 2025-12-12 09:33:51 -06:00
kenji fb2ae2d470 update: illogical-impulse 2025-12-12 09:33:43 -06:00
kenji 035b8522ff git: added user and email 2025-12-12 09:33:35 -06:00
kenji 4ccfeb12fe remove: fcitx5 due to weird icon 2025-12-12 09:33:22 -06:00
kenji 67adb36f6b moved lanzaboote to default modules 2025-11-24 14:25:36 -06:00
kenji 8b6d867659 removed lanzaboote 2025-11-24 14:24:38 -06:00
kenji 84ee68cb1f jovian change again 2025-11-24 14:04:30 -06:00
kenji 2d7fcc8801 force preferred monitor jovian 2025-11-24 11:11:26 -06:00
kenji ec2293db2e modified jovian environment to support preferred monitor 2025-11-24 10:58:44 -06:00
kenji b6974cb4a2 removed wireless support for now 2025-11-14 10:04:00 -06:00
kenji 3dfb455a1c added lact 2025-09-13 08:13:52 -05:00
kenji 636cac904e a 2025-08-31 21:00:02 -05:00
kenji 12da637cf8 a 2025-08-24 17:22:33 -05:00
kenji a39ffa9cc7 added sunshine at startup 2025-08-21 20:07:15 -05:00
kenji 36399861f0 added login 2025-08-21 20:03:07 -05:00
kenji ac892bcff7 a 2025-08-20 14:21:37 -05:00
kenji 9579fafceb upd ii 2025-08-19 10:02:21 -05:00
kenji 3dcc23facb upd 2025-08-19 10:01:57 -05:00
kenji 009a7145b8 updated modules 2025-08-19 09:59:20 -05:00
kenji 226b61bf21 updated solaar fix 2025-08-18 23:15:23 -05:00
kenji 4586dd1d9c updated ii 2025-08-18 23:01:51 -05:00
kenji 291f442a45 updatee ii 2025-08-17 09:46:23 -05:00
kenji 45010d5f0a minor changes 2025-08-17 09:46:09 -05:00
kenji e1cf3ad59d added lanzaboote.nix for secure boot 2025-08-14 15:13:56 -05:00
kenji bc268218a5 added security.nix for secure boot 2025-08-14 15:07:51 -05:00
kenji 9a05a5546f autostart steamOS 2025-08-14 14:40:51 -05:00
kenji cb224894b8 removed moondeck buddy 2025-08-13 18:16:22 -05:00
kenji 29453240ed vanilla changes with added nvim 2025-08-13 15:01:11 -05:00
kenji c3526e6eac added vanilla for testing 2025-08-13 14:51:15 -05:00
kenji e0ca2aa3bf organized 2025-08-13 09:11:03 -05:00
kenji 8aa7f53eca starship now works as Pure 2025-08-13 09:06:26 -05:00
kenji 9b4c4991c4 updated ii 2025-08-13 08:26:22 -05:00
kenji f040c4b610 enables starship 2025-08-13 08:14:24 -05:00
kenji fac71ff78d updated fonts 2025-08-12 08:19:22 -05:00
kenji 1aa0ab9044 fixed missing icons 2025-08-11 22:58:40 -05:00
kenji 0f17915e8c updated illogical-impulse 2025-08-11 19:30:26 -05:00
kenji 171564d6dc added solaar 2025-08-11 19:30:12 -05:00
kenji 4920a65aa2 upd 2025-08-11 17:23:25 -05:00
kenji fc71417bc7 uses apps.nix for firefox installation 2025-08-11 16:38:14 -05:00
lsoriano-mcm 1aa742d2b2 added illogical impulse 2025-08-09 13:26:38 -05:00
lsoriano-mcm d0339032fa cleaned up a lot 2025-08-09 12:29:57 -05:00
lsoriano-mcm 4f7a30197a major fix macos 2025-08-07 16:03:52 -05:00
lsoriano-mcm 2dcdd0b29a upd 2025-08-07 15:10:14 -05:00
lsoriano-mcm 638b2e54dc organized 2025-08-07 14:51:45 -05:00
lsoriano-mcm c11b7205bd reorganized boot 2025-08-07 14:43:11 -05:00
kenji caada5a969 added flatpak on conf 2025-08-03 15:55:09 -05:00
kenji ceb17c3a34 enable steam os conf 2025-08-03 14:20:35 -05:00
kenji e619754e92 test 2025-08-03 11:37:24 -05:00
kenji 068a46a9bf added mkOverride 2025-07-31 07:07:46 -05:00
kenji 2cbe32f561 t 2025-07-31 06:41:23 -05:00
kenji e90d182cde added virtualbox 2025-07-23 19:47:13 -05:00
kenji 2bede8d2bc test 2025-07-23 17:55:04 -05:00
kenji 1bb5ea283f a 2025-07-23 17:51:25 -05:00
kenji 173f9a08ca added vrr 2025-07-23 16:35:47 -05:00
kenji 61e3f29db2 test 2025-07-23 16:30:20 -05:00
kenji 9a44776d59 added config file for nixos 2025-07-23 16:30:16 -05:00
kenji c83ad31922 monitor fix 2025-07-23 15:35:53 -05:00
kenji 990b154250 enabled HDR 2025-07-23 14:10:58 -05:00
kenji 4cb03bcbbb fixed quickshell 2025-07-23 12:56:32 -05:00
kenji 5f6dbaac10 minor fixes 2025-07-23 12:46:36 -05:00
kenji 9a24848f21 fixed sunshine not installed 2025-07-22 20:08:29 -05:00
kenji 10e9e6e426 added more support 2025-07-22 20:03:46 -05:00
kenji e11b3547d4 fix unmatched sha 2025-07-22 20:03:39 -05:00
kenji d80c5c1074 added alternative to qs main menu 2025-07-22 20:03:27 -05:00
kenji 954407bfa0 modified hardware 2025-07-22 20:03:15 -05:00
176 changed files with 4614 additions and 5249 deletions
-88
View File
@@ -1,88 +0,0 @@
---
name: code-cleaner
description: Use this agent when code needs to be organized, refactored for clarity, or cleaned of redundancies. This includes situations where: duplicate code blocks exist, imports are disorganized or unused, variable names are inconsistent, code structure is messy or hard to follow, dead code needs removal, or files need general tidying after feature implementation.\n\nExamples:\n\n<example>\nContext: The user has just finished implementing a feature with multiple utility functions.\nuser: "I've added the user authentication feature with password validation"\nassistant: "I've implemented the authentication feature. Now let me use the code-cleaner agent to organize the code and remove any redundancies."\n<commentary>\nAfter implementing a feature, use the code-cleaner agent to ensure the code is well-organized and free of duplication.\n</commentary>\n</example>\n\n<example>\nContext: The user notices their codebase has become messy over time.\nuser: "This file has gotten really messy, can you clean it up?"\nassistant: "I'll use the code-cleaner agent to organize this file and eliminate any redundancies."\n<commentary>\nWhen explicitly asked to clean or organize code, delegate to the code-cleaner agent for thorough refactoring.\n</commentary>\n</example>\n\n<example>\nContext: The user has merged multiple branches and the code has duplicate implementations.\nuser: "After merging those branches, I think we have some duplicate helper functions"\nassistant: "I'll launch the code-cleaner agent to identify and consolidate the duplicate implementations."\n<commentary>\nWhen duplicate code is suspected or known to exist, use the code-cleaner agent to find and eliminate redundancies.\n</commentary>\n</example>
model: sonnet
color: green
---
You are an elite Code Cleaner—a meticulous software craftsman specializing in code organization, refactoring, and the elimination of redundancies. You have an exceptional eye for identifying patterns, inconsistencies, and opportunities to simplify without changing functionality.
## Your Core Mission
Transform messy, redundant, or disorganized code into clean, maintainable, and elegant implementations while preserving exact functionality.
## Operational Principles
### 1. Analysis First
Before making any changes:
- Read and understand the complete context of the code
- Identify all redundancies, duplications, and organizational issues
- Map dependencies to ensure changes won't break functionality
- Document what you plan to change and why
### 2. Types of Cleaning You Perform
**Import Organization:**
- Remove unused imports
- Group imports logically (standard library, third-party, local)
- Sort imports alphabetically within groups
- Consolidate multiple imports from the same module
**Redundancy Elimination:**
- Identify and consolidate duplicate code blocks into reusable functions
- Remove dead code (unreachable code, commented-out blocks, unused variables)
- Simplify overly complex conditional chains
- Eliminate redundant type conversions or operations
**Code Structure:**
- Organize functions/methods in logical order (public before private, related functions grouped)
- Ensure consistent indentation and spacing
- Break up overly long functions into smaller, focused units
- Move misplaced code to appropriate locations
**Naming Consistency:**
- Standardize naming conventions throughout the file
- Rename unclear variables to be more descriptive
- Ensure consistent casing (camelCase, snake_case, etc.) per language conventions
**Pattern Consolidation:**
- Extract repeated patterns into helper functions
- Replace verbose constructs with idiomatic alternatives
- Consolidate similar conditional blocks
### 3. What You Must NOT Do
- Change the external behavior or API of the code
- Add new features or functionality
- Remove code that appears unused but may be used via reflection/dynamic calls
- Make stylistic changes that contradict the project's established conventions
- Optimize for performance unless it also improves readability
### 4. Quality Verification
After each cleaning operation:
- Verify all function signatures remain unchanged
- Confirm all exports/public interfaces are preserved
- Check that no referenced variables or functions were accidentally removed
- Ensure the code would still pass existing tests
### 5. Output Standards
When presenting cleaned code:
- Show the complete cleaned file, not just snippets
- Provide a brief summary of changes made
- Categorize changes (e.g., "Removed 3 unused imports", "Consolidated 2 duplicate functions")
- Flag any areas where you chose not to make changes and explain why
### 6. Decision Framework
When uncertain about a change, ask yourself:
1. Does this change preserve exact functionality? If no → don't do it
2. Does this change improve readability? If no → reconsider
3. Does this change follow the project's existing patterns? If no → adapt or skip
4. Could this change break something not visible in the current context? If yes → flag it and ask
### 7. Communication Style
- Be concise but thorough in explanations
- Use bullet points for listing changes
- Provide before/after comparisons for significant refactors
- Ask clarifying questions if the scope of cleaning is unclear
You take pride in leaving code cleaner than you found it, treating every file as an opportunity to demonstrate the art of clean code. Your changes are surgical, purposeful, and always in service of maintainability.
-91
View File
@@ -1,91 +0,0 @@
---
name: nixos-config-researcher
description: Use this agent when you need to find documentation, configuration options, module syntax, or best practices for NixOS configuration. This includes researching Nix language features, Home Manager options, flake patterns, specific package configurations, or debugging NixOS module issues. Examples:\n\n- User: "How do I configure Hyprland in NixOS?"\n Assistant: "Let me use the nixos-config-researcher agent to find the proper configuration options for Hyprland in NixOS."\n <uses Task tool to launch nixos-config-researcher>\n\n- User: "What's the correct syntax for SOPS secrets in NixOS?"\n Assistant: "I'll research this using the nixos-config-researcher agent to find the official documentation."\n <uses Task tool to launch nixos-config-researcher>\n\n- User: "I'm getting an error with my NixOS module, it says 'infinite recursion encountered'"\n Assistant: "Let me use the nixos-config-researcher agent to find documentation on this error and common solutions."\n <uses Task tool to launch nixos-config-researcher>\n\n- User: "How do I set up Stylix theming?"\n Assistant: "I'll have the nixos-config-researcher agent look up the Stylix documentation and configuration options."\n <uses Task tool to launch nixos-config-researcher>
model: sonnet
color: blue
---
You are an expert NixOS configuration researcher with deep knowledge of the Nix ecosystem, NixOS modules, Home Manager, and flake-based configurations. Your primary mission is to find accurate, up-to-date information about NixOS configuration by searching authoritative sources.
## Research Priority Order
Always search sources in this priority order:
1. **Official Documentation First**
- NixOS Manual (nixos.org/manual/nixos)
- NixOS Options Search (search.nixos.org/options)
- NixOS Packages Search (search.nixos.org/packages)
- Nix Reference Manual (nixos.org/manual/nix)
- Home Manager Manual and Options (nix-community.github.io/home-manager)
- Nixpkgs Manual (nixos.org/manual/nixpkgs)
2. **Project-Specific Documentation**
- GitHub repositories of specific projects (READMEs, wikis)
- Official project documentation sites
- Flake documentation for community flakes
3. **Community Resources**
- NixOS Wiki (nixos.wiki)
- NixOS Discourse (discourse.nixos.org)
- Nix community GitHub discussions
4. **Last Resort Sources**
- Blog posts and tutorials (verify against official docs)
- Stack Overflow answers
- Reddit r/NixOS discussions
## Research Methodology
1. **Understand the Query**: Parse what specific aspect of NixOS configuration is being asked about - is it a module option, a package configuration, a flake pattern, or a general concept?
2. **Search Strategically**: Use specific search terms including:
- "nixos" + the specific topic
- "home-manager" if it's user-level configuration
- Module paths like "services.x" or "programs.y"
- Include "option" or "module" for configuration questions
3. **Verify Information**:
- Cross-reference findings with official NixOS options search when possible
- Check the Nix version relevance (some options change between versions)
- Prefer declarative/flake-based solutions over imperative ones
4. **Contextualize for the User's Setup**: When relevant, consider:
- Flake-based configurations (the modern approach)
- Home Manager integration
- System vs user-level configuration distinctions
## Output Format
When presenting research findings:
1. **Source Attribution**: Always cite where the information comes from
2. **Code Examples**: Provide Nix code snippets when applicable
3. **Option Paths**: Include full option paths (e.g., `services.openssh.enable`)
4. **Confidence Level**: Indicate if information is from official docs vs community sources
5. **Version Notes**: Mention if configuration syntax is version-specific
## Quality Standards
- Never fabricate NixOS options or module paths - verify they exist
- Prefer showing the actual option type and default values when available
- Include import statements or flake input requirements when relevant
- Warn about deprecated options or patterns when encountered
- If official documentation is insufficient, clearly state this and explain the alternative source used
## Example Response Structure
```
**Source**: [Official/Community] - [specific URL or reference]
**Configuration**:
```nix
# Example code
```
**Key Options**:
- `option.path` (type): description
**Notes**: Any caveats, version requirements, or additional context
```
You are thorough, accurate, and always prioritize official documentation. When you cannot find definitive answers, you clearly communicate the limitations of available information rather than guessing.
-147
View File
@@ -1,147 +0,0 @@
---
name: security-paranoid-advisor
description: Use this agent when you need a thorough security review of code, configurations, dependencies, or architectural decisions. This includes reviewing pull requests for security vulnerabilities, auditing existing codebases for potential exploits, analyzing authentication/authorization implementations, checking for data exposure risks, reviewing API endpoints for attack vectors, examining dependency chains for known vulnerabilities, or whenever security implications of any code change need to be assessed. This agent should be called proactively after writing code that handles user input, authentication, file operations, network requests, database queries, or any sensitive data processing.\n\nExamples:\n\n<example>\nContext: User just wrote a login authentication function\nuser: "Please implement a user login function that checks username and password"\nassistant: "Here is the login implementation:"\n<function implementation of login handler>\nassistant: "Now let me use the security-paranoid-advisor agent to review this authentication code for vulnerabilities"\n<commentary>\nSince authentication code was just written, use the security-paranoid-advisor agent to check for timing attacks, SQL injection, credential handling issues, and session management vulnerabilities.\n</commentary>\n</example>\n\n<example>\nContext: User is adding a file upload feature\nuser: "Add an endpoint that lets users upload profile pictures"\nassistant: "I'll implement the file upload endpoint"\n<function implementation of upload handler>\nassistant: "Let me invoke the security-paranoid-advisor agent to audit this file upload implementation for potential attack vectors"\n<commentary>\nFile uploads are high-risk features. Use the security-paranoid-advisor agent to check for path traversal, file type validation bypass, malicious file execution, and storage vulnerabilities.\n</commentary>\n</example>\n\n<example>\nContext: User asks for a security review of recent changes\nuser: "Can you check if there are any security issues in the code I just wrote?"\nassistant: "I'll use the security-paranoid-advisor agent to perform a comprehensive security audit of the recent code changes"\n<commentary>\nDirect security review request - use the security-paranoid-advisor agent to perform deep analysis of all recent modifications.\n</commentary>\n</example>
model: sonnet
color: red
---
You are an elite security advisor with decades of experience in offensive security, penetration testing, and secure code review. You have discovered zero-day vulnerabilities, led red team operations, and reviewed code for financial institutions and government agencies. Your paranoia has saved countless systems from catastrophic breaches. You think like an attacker but protect like a guardian.
## Your Mandate
You exist to find what others miss. Every line of code is a potential attack surface. Every assumption is a vulnerability waiting to be exploited. Trust nothing. Verify everything. Your job is to be the adversary before the real adversaries arrive.
## Core Security Domains You Must Scrutinize
### Input Validation & Injection Attacks
- SQL injection (including second-order, blind, and time-based variants)
- Command injection and OS command execution
- LDAP, XML, XPath, and NoSQL injection
- Template injection (SSTI)
- Header injection and CRLF attacks
- Path traversal and local/remote file inclusion
- Prototype pollution in JavaScript
- Deserialization vulnerabilities
### Authentication & Session Management
- Credential storage (plaintext, weak hashing, missing salt)
- Timing attacks on authentication
- Session fixation and hijacking
- JWT vulnerabilities (algorithm confusion, weak secrets, missing expiration)
- OAuth/OIDC misconfigurations
- Multi-factor authentication bypasses
- Password reset flow vulnerabilities
- Brute force and credential stuffing exposure
### Authorization & Access Control
- Broken object-level authorization (IDOR)
- Function-level access control failures
- Privilege escalation paths
- Missing authorization checks on sensitive operations
- Role-based access control gaps
- Horizontal and vertical privilege escalation
### Data Exposure & Privacy
- Sensitive data in logs, errors, or responses
- PII exposure and GDPR/privacy violations
- Secrets in code, configs, or version control
- Information disclosure through verbose errors
- Cache poisoning and sensitive data caching
- Backup file exposure
### Cryptographic Failures
- Weak or deprecated algorithms (MD5, SHA1 for security, DES, RC4)
- Hardcoded keys and secrets
- Improper random number generation
- Missing or improper certificate validation
- Encryption without authentication (use AEAD)
- Key management vulnerabilities
### API & Network Security
- Rate limiting and denial of service vectors
- CORS misconfigurations
- SSRF (Server-Side Request Forgery)
- Mass assignment vulnerabilities
- GraphQL-specific attacks (introspection, batching, depth attacks)
- WebSocket security issues
- HTTP security headers (CSP, HSTS, X-Frame-Options)
### Dependency & Supply Chain
- Known vulnerable dependencies (CVEs)
- Typosquatting risks
- Dependency confusion attacks
- Outdated packages with security patches
- Malicious package indicators
### Infrastructure & Configuration
- Debug mode in production
- Default credentials
- Exposed admin interfaces
- Insecure file permissions
- Docker/container security misconfigurations
- Cloud IAM and resource policy issues
- Environment variable exposure
## Your Review Methodology
1. **Map the Attack Surface**: Identify all entry points, data flows, trust boundaries, and external integrations.
2. **Assume Breach Mentality**: Consider what damage could be done if each component were compromised.
3. **Trace Data Flows**: Follow user-controlled data from input to storage to output. Every transformation is a potential vulnerability.
4. **Check the Obvious AND the Obscure**: Attackers exploit both simple oversights and complex logic flaws.
5. **Consider Chained Attacks**: Low-severity issues can combine into critical exploits.
6. **Review Error Handling**: Errors often leak sensitive information or create unexpected states.
7. **Examine Race Conditions**: Look for TOCTOU (time-of-check to time-of-use) vulnerabilities.
8. **Verify Negative Cases**: Ensure the code handles malicious input, not just valid input.
## Output Format
For each finding, provide:
### [SEVERITY: CRITICAL|HIGH|MEDIUM|LOW|INFO] - Brief Title
**Location**: File path and line numbers
**Vulnerability Type**: CWE category if applicable
**Description**: What the vulnerability is and why it's dangerous
**Attack Scenario**: Concrete example of how an attacker would exploit this
**Evidence**: The specific code or configuration that's vulnerable
**Remediation**: Exact steps to fix, with code examples when helpful
**References**: Relevant security resources or documentation
---
## Behavioral Guidelines
- **Be Thorough**: Check every file, every function, every configuration. The vulnerability you skip is the one that gets exploited.
- **Be Specific**: Vague warnings are useless. Point to exact lines, provide exact attack payloads, give exact fixes.
- **Be Paranoid**: If something could be abused, assume it will be. Defense in depth is not optional.
- **Prioritize Ruthlessly**: Critical vulnerabilities that are easily exploitable come first. But report everything.
- **Explain the Impact**: Help developers understand why this matters. "An attacker could..." is more compelling than "This is insecure."
- **Consider the Context**: A vulnerability in an internal tool differs from one in a public-facing API, but both matter.
- **Don't Trust Mitigations Elsewhere**: If input validation exists at the frontend, verify it exists at the backend too.
- **Check Comments and TODOs**: Developers often leave security debt documented in comments.
- **Examine Test Files**: They sometimes contain hardcoded credentials or reveal security assumptions.
- **Review Git History When Relevant**: Security fixes sometimes get reverted or contain remnants of vulnerabilities.
You are the last line of defense before code reaches production. Miss nothing. Question everything. Protect this repository as if your reputation depends on it—because it does.
-7
View File
@@ -1,7 +0,0 @@
keys:
- &user_kenji age1dhmt5tdyxd9zam542zkr9hq4tku7lzmf6j057sjtepk80deky5fqemczs5
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *user_kenji
-79
View File
@@ -1,79 +0,0 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Build Commands
```bash
# Rebuild and switch to new configuration
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase
# Manage SOPS secrets
nix-shell -p sops --run "sops secrets/secrets.yaml"
nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
```
## Architecture Overview
This is a modular, flake-based NixOS configuration for a single host (`hakase`).
### Key Entry Points
- `flake.nix` - Declares inputs and creates NixOS configuration
- `config.nix` - Central configuration values (username, hostname, paths, theme settings, bookmarks)
- `hosts/hakase/configuration.nix` - Host-level entry point that imports system modules
### Module Organization
**Two-tier module system:**
- `modules/nixos/` - NixOS system-level modules (boot, kernel, services, hardware)
- `modules/home/` - Home Manager user-level modules (imported via `home/hakase.nix`)
**Application configs:** Each application has its own directory in `apps/` with a `default.nix` and optional sub-modules (e.g., `apps/hyprland/hypr/*.nix` for Hyprland settings).
### Configuration Flow
```
flake.nix
└─ nixosConfigurations.hakase
├─ hosts/hakase/configuration.nix
│ └─ modules/nixos/default.nix (imports all system modules)
└─ home-manager
└─ home/hakase.nix
└─ modules/home/* → apps/*
```
### Module Pattern
Modules receive these parameters:
```nix
{ pkgs, config, myConfig, inputs, ... }:
```
Access configuration values via `myConfig`:
```nix
myConfig.nixos.username # "hakase"
myConfig.nixos.hostname # "hakase"
myConfig.terminal.default # Terminal emulator
myConfig.hyprland.monitors # Monitor configuration
```
### Secrets Management
Uses SOPS for encrypted secrets. Keys stored at `~/.config/sops/age/keys.txt`.
Access secrets in modules:
```nix
config.sops.secrets.secret_name.path
```
## Key Technologies
- **Hyprland** with UWSM (systemd session management)
- **Stylix** for system-wide theming from wallpaper colors
- **Home Manager** for user environment
- **nixovim** flake for Neovim configuration
## Git Commit Convention
Use conventional commits: `feat(scope):`, `fix(scope):`, `refactor:`, `add:`, `remove:`, `cleanup:`
-65
View File
@@ -1,65 +0,0 @@
# HakaseOS - NixOS Configuration
This is a modular, flake-based NixOS configuration for a single host (`hakase`). It features a custom Hyprland desktop environment, automated theming via Matugen, and strict separation of concerns using a custom `myConfig` object.
## Project Structure
* **`flake.nix`**: The entry point. Defines inputs (Hyprland, Chaotic, Home Manager, etc.) and creates the system configuration.
* **`config.nix`**: Central source of truth. Defines global variables (user details, monitor config, theme settings) exposed as `myConfig`.
* **`hosts/hakase/`**: Host-specific configuration.
* `configuration.nix`: Main system entry point.
* **`modules/`**: Reusable modules.
* `nixos/`: System-level modules (boot, hardware, services).
* `home/`: Home-manager modules (UI, apps, user services).
* **`apps/`**: Application-specific configurations. Each app has its own directory (e.g., `hyprland`, `firefox`, `ghostty`) with a `default.nix`.
* **`assets/`**: Static assets like wallpapers (`firewatch.png`).
* **`secrets/`**: Encrypted secrets managed by SOPS.
## Architecture & Conventions
### 1. The `myConfig` Object
Global configuration is not hardcoded in modules. Instead, it is defined in `config.nix` and passed to all modules via `specialArgs`.
**Usage Pattern:**
```nix
# In any module
{ pkgs, config, myConfig, ... }:
{
# Access values
home.username = myConfig.nixos.username;
}
```
### 2. Module Hierarchy
* **System**: `flake.nix` -> `hosts/hakase/configuration.nix` -> `modules/nixos/default.nix` -> `modules/nixos/*.nix`
* **User**: `modules/nixos/user.nix` (or similar) -> `home-manager` -> `home/hakase.nix` -> `modules/home/*.nix` -> `apps/*/default.nix`
### 3. Application Configuration
Do not dump config into one large file. Create a dedicated folder in `apps/<app_name>/` with a `default.nix`.
* Example: `apps/ghostty/default.nix`
## Key Commands
### System Management
* **Rebuild & Switch**:
```bash
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase
# or alias:
update
```
### Secrets (SOPS)
* **Edit Secrets**:
```bash
nix-shell -p sops --run "sops secrets/secrets.yaml"
```
* **Update Keys**:
```bash
nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
```
## Development Guidelines
* **Matugen**: used for theming. Templates are located in `apps/matugen/templates/`.
* **Hyprland**: Config is split into `apps/hyprland/hypr/*.nix`.
* **Formatting**: Follow existing indentation (2 spaces usually).
* **Commits**: Use Conventional Commits (e.g., `feat(hyprland): add new bind`).
+56 -95
View File
@@ -1,102 +1,63 @@
# HakaseOS
# Nix Sakamoto
A rewrite of the original Sakamoto NixOS configuration.
A modular, flake-based NixOS configuration for a single host (`hakase`). Heavily inspired by [OmarchyOS](https://omarchy.org/).
## Installation
Installing Sakamoto Nix configuration may vary on your current operating system.
## Features
| Hosts | Description |
|----------|--------------|
| hakase | gaming desktop (linux) |
| sakamoto | \[unavailable] server that uses containers (linux) |
| nano | \[unavailable] windows configuration |
| macos | macos configuration |
- **Hyprland** compositor with UWSM (systemd session management)
- **Matugen** for automatic system-wide theming from wallpaper colors
- **Multi-monitor support** for intuitive desktop management
- **Hardened Firefox** with custom bookmarks and new tab page
- **Vim keybindings** throughout the system
- **SOPS** for encrypted secrets management
- **CachyOS kernel** via chaotic-nyx for performance optimizations
**Note: Replace `${Hosts}` with one of the options from the table above.**
## 🚧 TODO
- LUKS designed
### Linux Installation
## Screenshots
1. Install [Nix](https://nixos.org).
2. Clone this directory.
```sh
$ git clone https://git.sakamoto.dev/kenji/nixos.git ~/.config/nixos
```
3. Create a hardware-configuration.conf
```sh
$ sudo nixos-generate-config --dir ~/.config/nixos/hosts/${Hosts}/
```
4. ⚠️ Modify `config.nix` that suits your configuration. **Be sure to edit `config.nix`! Most especially `myConfig.essentials.Username`. Otherwise, your OS could break!!!**
5. Rebuild.
```sh
$ sudo nixos-rebuild switch --flake ~/.config/nixos/hosts/#${Hosts}
```
6. Install unstable channel (fixes `pkgs.fish` misconfiguration).
```sh
$ nix-channel --add https://nixos.org/channels/nixos-unstable nixos nix-channel --update
```
7. (Optional) You can install `proton-ge` by running the following command:
```sh
protonup
```
8. (Optional) Add Decky Loader for Steam via this command:
```sh
touch ~/.steam/steam/.cef-enable-remote-debugging
![Display overview](assets/example/desktop_display.png)
```
### MacOS (Darwin) Installation
1. Install [Nix](https://nixos.org).
2. Clone this directory.
```sh
$ git clone https://git.sakamoto.dev/kenji/nixos.git ~/.config/nixos
```
3. ⚠️ Modify `config.nix` that suits your configuration. **Be sure to edit `config.nix`! Most especially `myConfig.essentials.Username`. Otherwise, configuration would not work!!!**
4. Rebuild.
```sh
$ sudo nix run nix-darwin --extra-experimental-features "nix-command flakes" -- switch --flake ~/.config/nixos#macos
```
![Terminal windows](assets/example/desktop_terminals.png)
![Lockscreen](assets/example/lockscreen.png)
![Desktop Music](assets/example/desktop_music.png)
![Desktop with Hakase](assets/example/desktop_hakase.png)
## Structure
```
.
├── flake.nix # Flake inputs and NixOS configuration
├── config.nix # Central configuration values
├── hosts/
│ └── hakase/ # Host-specific configuration
├── modules/
│ ├── nixos/ # System-level modules (boot, kernel, services)
│ └── home/ # Home Manager modules
├── apps/ # Per-application configurations
│ ├── hyprland/ # Hyprland window manager
│ ├── waybar/ # Status bar
│ ├── firefox/ # Browser configuration
│ ├── ghostty/ # Terminal emulator
│ ├── neovim/ # Editor (via nixovim flake)
│ ├── vicinae/ # Application launcher
│ └── ... # And many more
├── secrets/ # SOPS encrypted secrets
└── assets/ # Wallpapers and other assets
```
## Usage
### Rebuild System
```bash
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase
```
Or use the configured alias:
```bash
update
```
### Manage Secrets
```bash
# Edit secrets
nix-shell -p sops --run "sops secrets/secrets.yaml"
# Update keys
nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
```
## Configuration
Central configuration values are defined in `config.nix`:
- `myConfig.nixos` - System settings (username, hostname, timezone)
- `myConfig.git` - Git configuration
- `myConfig.terminal` - Default terminal and aliases
- `myConfig.hyprland` - Monitor configuration and wallpaper
- `myConfig.firefox` - Bookmarks and new tab settings
## Flake Inputs
| Input | Description |
|-------|-------------|
| nixpkgs | NixOS unstable |
| home-manager | User environment management |
| hyprland | Wayland compositor |
| chaotic | CachyOS kernel and packages |
| sops-nix | Secrets management |
| nixovim | Neovim configuration |
| matugen | System-wide theming |
| vicinae | Application launcher |
| textfox | Firefox CSS theme |
## License
Personal configuration - use at your own discretion.
## Problems:
* XDG defaults (file manager default is terminal)
* File Manager must be TUI
* Bluetooth and WiFi should open at TUI
* Steam and Heroic incompatible
* Broken switchwall.sh
* Box fonts
-3
View File
@@ -1,3 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [delfin];
}
-14
View File
@@ -1,14 +0,0 @@
​ ⣇⣿⠘⣿⣿⣿⡿⡿⣟⣟⢟⢟⢝⠵⡝⣿⡿⢂⣼⣿⣷⣌⠩⡫⡻⣝⠹⢿⣿⣷
​ ⡆⣿⣆⠱⣝⡵⣝⢅⠙⣿⢕⢕⢕⢕⢝⣥⢒⠅⣿⣿⣿⡿⣳⣌⠪⡪⣡⢑⢝⣇
​ ⡆⣿⣿⣦⠹⣳⣳⣕⢅⠈⢗⢕⢕⢕⢕⢕⢈⢆⠟⠋⠉⠁⠉⠉⠁⠈⠼⢐⢕⢽
​ ⡗⢰⣶⣶⣦⣝⢝⢕⢕⠅⡆⢕⢕⢕⢕⢕⣴⠏⣠⡶⠛⡉⡉⡛⢶⣦⡀⠐⣕⢕
​ ⡝⡄⢻⢟⣿⣿⣷⣕⣕⣅⣿⣔⣕⣵⣵⣿⣿⢠⣿⢠⣮⡈⣌⠨⠅⠹⣷⡀⢱⢕
​ ⡝⡵⠟⠈⢀⣀⣀⡀⠉⢿⣿⣿⣿⣿⣿⣿⣿⣼⣿⢈⡋⠴⢿⡟⣡⡇⣿⡇⡀⢕
​ ⡝⠁⣠⣾⠟⡉⡉⡉⠻⣦⣻⣿⣿⣿⣿⣿⣿⣿⣿⣧⠸⣿⣦⣥⣿⡇⡿⣰⢗⢄
​ ⠁⢰⣿⡏⣴⣌⠈⣌⠡⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣬⣉⣉⣁⣄⢖⢕⢕⢕
​ ⡀⢻⣿⡇⢙⠁⠴⢿⡟⣡⡆⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣵⣵⣿
​ ⡻⣄⣻⣿⣌⠘⢿⣷⣥⣿⠇⣿⣿⣿⣿⣿⣿⠛⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
​ ⣷⢄⠻⣿⣟⠿⠦⠍⠉⣡⣾⣿⣿⣿⣿⣿⣿⢸⣿⣦⠙⣿⣿⣿⣿⣿⣿⣿⣿⠟
​ ⡕⡑⣑⣈⣻⢗⢟⢞⢝⣻⣿⣿⣿⣿⣿⣿⣿⠸⣿⠿⠃⣿⣿⣿⣿⣿⣿⡿⠁⣠
​ ⡝⡵⡈⢟⢕⢕⢕⢕⣵⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣿⣿⣿⣿⣿⠿⠋⣀⣈⠙
​ ⡝⡵⡕⡀⠑⠳⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⡠⡲⡫⡪⡪⡣
-113
View File
@@ -1,113 +0,0 @@
{pkgs, ...}: {
programs.fastfetch = {
enable = true;
settings = {
"$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json";
logo = {
source = "~/.config/fastfetch/animo.txt";
padding = {
top = 1;
};
};
display = {
separator = " : ";
};
modules = [
{
type = "command";
key = " ";
keyColor = "blue";
text = "splash=$(hakase-hyprlock-text-generator);echo $splash";
}
{
type = "custom";
format = "";
}
{
type = "os";
key = " 󰣇 OS";
format = "{2}";
keyColor = "red";
}
{
type = "kernel";
key = " 󰌽 Kernel";
format = "{2}";
keyColor = "red";
}
{
type = "packages";
key = " 󰏗 Pkgs";
keyColor = "green";
}
{
type = "terminal";
key = " 󰆍 Terminal";
keyColor = "yellow";
}
{
type = "wm";
key = " 󱗃 WM";
format = "{2}";
keyColor = "yellow";
}
{
type = "custom";
format = "";
}
"break"
{
type = "title";
key = " ";
format = "{6} {7} {8}";
}
{
type = "custom";
format = "";
}
{
type = "cpu";
format = "{1} @ {7}";
key = " 󰻠 CPU";
keyColor = "blue";
}
{
type = "gpu";
format = "{1} {2}";
key = " 󰊴 GPU";
keyColor = "blue";
hideType = "integrated";
}
{
type = "memory";
key = " 󰍛 Memory";
keyColor = "magenta";
}
{
type = "disk";
key = " 󰃭 OS Age";
folders = "/";
keyColor = "red";
format = "{days} days";
}
{
type = "uptime";
key = " 󰅐 Uptime";
keyColor = "red";
}
{
type = "custom";
format = "";
}
{
type = "colors";
paddingLeft = 2;
symbol = "circle";
}
"break"
];
};
};
home.file.".config/fastfetch/animo.txt".source = ./animo.txt;
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
wayland.windowManager.hyprland.settings.exec-once = [
"fcitx5 -d --replace"
];
}
-148
View File
@@ -1,148 +0,0 @@
{
pkgs,
myConfig,
inputs,
...
}: {
wayland.windowManager.hyprland.settings = {
exec-once = [
"uwsm app -- pywalfox start"
];
bindd = [
"SUPER, W, Open Browser, exec, uwsm app -- firefox"
"SUPER, Y, Toggle YouTube, togglespecialworkspace, youtube"
"SUPER SHIFT, Y, Move to YouTube Special Workspace, movetoworkspace, special:youtube"
];
workspace = [
"special:youtube, on-created-empty:uwsm app -- firefox -P YouTube --name youtube"
];
windowrulev2 = [
"workspace special:youtube, class:^(youtube)$"
];
};
imports = [
inputs.textfox.homeManagerModules.default
./textfox.nix
];
home.packages = with pkgs; [
pywalfox-native
tridactyl-native
];
home.file.".config/tridactyl/tridactylrc".text = ''
set focusbypass true
set smoothscroll true
bind J tabnext
bind K tabprev
unbind <C-e>
'';
programs.firefox = {
enable = true;
languagePacks = ["en-US"];
nativeMessagingHosts = [
pkgs.pywalfox-native
pkgs.tridactyl-native
];
profiles = {
youtube = import ./profiles/youtube.nix {inherit pkgs myConfig;};
hakase = {
search.force = true;
isDefault = true;
search.default = "ddg";
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
ublock-origin
bitwarden
];
bookmarks = {
force = true;
settings = [
{
name = "Toolbar Bookmarks";
toolbar = true;
bookmarks = myConfig.firefox.bookmarks;
}
];
};
settings = {
# --- Privacy & Hardening ---
"browser.contentblocking.category" = "strict";
"geo.enabled" = false;
"media.peerconnection.enabled" = false; # Prevents WebRTC IP leaks
"network.dns.disablePrefetch" = true;
"network.prefetch-next" = false;
"privacy.resistFingerprinting" = true; # Note: Spoofs timezone and caps FPS to 60
"privacy.trackingprotection.enabled" = true;
# --- NixOS / Hyprland Integration ---
"widget.use-xdg-desktop-portal.file-picker" = 1; # Use native file picker
# --- UI & Behavior ---
"accessibility.typeaheadfind" = false;
"browser.compactmode.show" = true;
"browser.formfill.enable" = false;
"browser.newtabpage.activity-stream.feeds.section.topstories" = false;
"browser.newtabpage.activity-stream.feeds.snippets" = false;
"browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
"browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
"browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
"browser.newtabpage.activity-stream.showSponsored" = false;
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
"browser.newtabpage.activity-stream.system.showSponsored" = false;
"browser.search.suggest.enabled" = false;
"browser.search.suggest.enabled.private" = false;
"browser.tabs.closeWindowWithLastTab" = false;
"browser.topsites.contile.enabled" = false;
"browser.urlbar.showSearchSuggestionsFirst" = false;
"browser.urlbar.suggest.searches" = false;
"extensions.pocket.enabled" = false;
"extensions.screenshots.disabled" = true;
# --- Homepage & Navigation ---
"browser.newtabpage.pinned" = myConfig.firefox.newtabpage;
"browser.startup.homepage" = "https://dash.sakamoto.dev";
# --- DNS over HTTPS (Quad9) ---
"network.trr.mode" = 2; # Use DoH with system fallback
"network.trr.uri" = "https://dns.quad9.net/dns-query";
};
};
};
policies = {
DisableTelemetry = true;
DisableFirefoxStudies = true;
EnableTrackingProtection = {
Value = true;
Locked = false;
Cryptomining = true;
Fingerprinting = true;
};
DisablePocket = true;
DisableFirefoxAccounts = true;
DisableAccounts = true;
DisableFirefoxScreenshots = true;
OverrideFirstRunPage = "";
OverridePostUpdatePage = "";
DontCheckDefaultBrowser = true;
DisplayBookmarksToolbar = "always";
SearchBar = "unified";
# Power User Messaging
UserMessaging = {
ExtensionRecommendations = false;
SkipOnboarding = true;
FeatureRecommendations = false;
UrlbarInterventions = false;
WhatsNew = false;
};
};
};
}
-120
View File
@@ -1,120 +0,0 @@
{
pkgs,
myConfig,
...
}: {
id = 1;
name = "YouTube";
search.force = true;
search.default = "ddg";
extensions.force = true;
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
ublock-origin
bitwarden
tridactyl
];
settings = {
# --- Privacy & Hardening ---
"browser.contentblocking.category" = "strict";
"privacy.trackingprotection.enabled" = true;
"privacy.resistFingerprinting" = true; # Note: Spoofs timezone and caps FPS to 60
"geo.enabled" = false;
"media.peerconnection.enabled" = false; # Prevents WebRTC IP leaks
"network.dns.disablePrefetch" = true;
"network.prefetch-next" = false;
# --- NixOS / Hyprland Integration ---
"widget.use-xdg-desktop-portal.file-picker" = 1; # Use native file picker
# --- UI & Behavior ---
"browser.compactmode.show" = true;
"browser.tabs.closeWindowWithLastTab" = false;
"extensions.pocket.enabled" = false;
"extensions.screenshots.disabled" = true;
"browser.topsites.contile.enabled" = false;
"browser.formfill.enable" = false;
"browser.search.suggest.enabled" = false;
"browser.search.suggest.enabled.private" = false;
"browser.urlbar.suggest.searches" = false;
"browser.urlbar.showSearchSuggestionsFirst" = false;
"browser.newtabpage.activity-stream.feeds.section.topstories" = false;
"browser.newtabpage.activity-stream.feeds.snippets" = false;
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
"browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
"browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
"browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
"browser.newtabpage.activity-stream.showSponsored" = false;
"browser.newtabpage.activity-stream.system.showSponsored" = false;
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"extensions.autoDisableScopes" = 0; # Enable extensions by default
# --- Homepage & Navigation ---
"browser.startup.homepage" = "https://youtube.com";
"browser.newtabpage.pinned" = myConfig.firefox.newtabpage;
# --- DNS over HTTPS (Quad9) ---
"network.trr.mode" = 2; # Use DoH with system fallback
"network.trr.uri" = "https://dns.quad9.net/dns-query";
};
userChrome = ''
/* --- Floating Autohide Toolbox (Tabs Only) --- */
/* Take toolbox out of the document flow so web content is 100% height */
#navigator-toolbox {
position: fixed !important;
top: 0;
left: 0;
width: 100%;
z-index: 9999 !important;
background-color: var(--toolbar-bgcolor, #1c1b22) !important;
/* Start hidden */
transform: translateY(-100%) !important;
opacity: 0 !important;
transition: transform 0.2s ease, opacity 0.2s ease !important;
}
/* Trigger zone */
#navigator-toolbox::after {
content: "";
position: absolute;
top: 100%;
left: 0;
width: 100%;
height: 10px;
z-index: 10000 !important;
}
/* Reveal when hovering */
#navigator-toolbox:hover {
transform: translateY(0) !important;
opacity: 1 !important;
}
/* --- Hide specific bars --- */
/* Hide Navigation Bar (Address Bar) COMPLETELY */
#nav-bar {
visibility: collapse !important;
height: 0px !important;
min-height: 0px !important;
padding: 0 !important;
margin: 0 !important;
}
/* Hide Bookmarks Toolbar */
#PersonalToolbar { visibility: collapse !important; }
/* Hide Titlebar */
#titlebar { appearance: none !important; }
/* Ensure TabsToolbar looks okay on its own */
#TabsToolbar {
border: none !important;
background: transparent !important;
}
'';
}
-48
View File
@@ -1,48 +0,0 @@
{
textfox = {
enable = true;
profile = "hakase";
config = {
# background = {
# color = "#123456";
# };
# border = {
# color = "#654321";
# width = "4px";
# transition = "1.0s ease";
# radius = "3px";
# };
# displayWindowControls = true;
# displayNavButtons = true;
# displayUrlbarIcons = true;
# displaySidebarTools = false;
displayTitles = true;
# newtabLogo = " __ __ ____ \A / /____ _ __/ /_/ __/___ _ __\A / __/ _ \\| |/_/ __/ /_/ __ \\| |/_/\A / /_/ __/> </ /_/ __/ /_/ /> < \A \\__/\\___/_/|_|\\__/_/ \\____/_/|_| ";
# font = {
# family = "Fira Code";
# size = "15px";
# accent = "#654321";
# };
tabs = {
horizontal.enable = false;
# horizontal.enable = true;
# vertical.enable = true;
# vertical.margin = "1.0rem";
};
# navbar = {
# margin = "8px 8px 2px";
# padding = "4px";
# };
bookmarks = {
alignment = "left";
};
# icons = {
# toolbar.extensions.enable = true;
# context.extensions.enable = true;
# context.firefox.enable = true;
# };
# textTransform = "uppercase";
# extraConfig = "/* custom css here */";
};
};
}
-74
View File
@@ -1,74 +0,0 @@
{
config,
pkgs,
...
}: {
home.packages = [
# TODO: will rewrite later
(pkgs.writeShellScriptBin "tte-loop" ''
trap 'printf "\e[?25h"; exit 0' INT
printf '\e[?25l'
effects=(beams binarypath blackhole bouncyballs bubbles burn colorshift crumble decrypt errorcorrect expand fireworks highlight laseretch matrix middleout orbittingvolley overflow pour print rain randomsequence rings scattered slice slide spotlights spray swarm sweep synthgrid unstable vhstape waves wipe)
while true; do
clear
cols=$(tput cols)
lines=$(tput lines)
effect="''${effects[RANDOM % ''${#effects[@]}]}"
printf '\e[?25l'
${pkgs.terminaltexteffects}/bin/tte --input-file ${config.home.homeDirectory}/.config/nixos/assets/branding.txt --anchor-canvas c --anchor-text c --canvas-width "$cols" --canvas-height "$((lines-2))" --frame-rate 120 "$effect"
printf '\e[?25l'
sleep 2
done
'')
(pkgs.writeShellScriptBin "tte-screensaver" ''
# Get all monitors
monitors=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[].name')
# Launch ghostty on each monitor one at a time
for monitor in $monitors; do
${pkgs.hyprland}/bin/hyprctl dispatch focusmonitor "$monitor"
sleep 0.3
${pkgs.ghostty}/bin/ghostty --config-file=${config.home.homeDirectory}/.config/ghostty/screensaver --fullscreen -e tte-loop &
sleep 1
done
# Monitor for any input and exit when detected
${pkgs.libinput}/bin/libinput debug-events 2>/dev/null | head -n 1 >/dev/null
# Input detected, kill all screensaver instances
${pkgs.procps}/bin/pkill -f "ghostty.*tte-loop"
'')
];
home.file.".config/ghostty/screensaver".text = ''
window-padding-x = 0
window-padding-y = 0
window-padding-color = "extend-always"
'';
programs.ghostty = {
enable = true;
package =
if pkgs.stdenv.isDarwin
then pkgs.ghostty-bin
else pkgs.ghostty;
enableFishIntegration = true;
settings = {
confirm-close-surface = false;
app-notifications = false;
window-padding-x = 15;
window-padding-y = 15;
window-padding-balance = true;
};
};
wayland.windowManager.hyprland.settings.bindd = [
"SUPER, P, Toggle Preload, togglespecialworkspace, preload"
"SUPER SHIFT, P, Move to Preload Special Workspace, movetoworkspace, special:preload"
];
wayland.windowManager.hyprland.settings.exec-once = [
"[workspace special:preload silent] uwsm app -- xdg-terminal-exec"
"[workspace 1] uwsm app -- ghostty -e bash -c 'fastfetch; exec $SHELL'" # TODO: must be xdg-terminal-exec, or default user terminal
];
}
View File
-16
View File
@@ -1,16 +0,0 @@
{myConfig, ...}: {
programs.git = {
enable = true;
settings = {
user.name = "${myConfig.git.username}";
user.email = "${myConfig.git.email}";
init.defaultBranch = "${myConfig.git.defaultBranch}";
};
};
programs.ssh = {
enable = true;
includes = [
"/run/secrets/ssh_extra_config"
];
};
}
-38
View File
@@ -1,38 +0,0 @@
{pkgs, ...}: {
wayland.windowManager.hyprland.settings = {
exec-once = [
"uwsm app -- hypridle"
];
};
services.hypridle = {
enable = true;
settings = {
general = {
after_sleep_cmd = "hyprctl dispatch dpms on";
ignore_dbus_inhibit = false;
lock_cmd = "hyprlock";
before_sleep_cmd = "loginctl lock-session"; # lock before suspend
};
listener = [
# {
# timeout = 180; # 3min
# on-timeout = "tte-screensaver";
# }
{
timeout = 300; # 5min
on-timeout = "loginctl lock-session"; # lock screen when timeout has passed
}
{
timeout = 330; # 5.5min
on-timeout = "hyprctl dispatch dpms off"; # screen off when timeout has passed
on-resume = "hyprctl dispatch dpms on"; # screen on when activity is detected after timeout has passed
}
{
timeout = 1800; # 30min
on-timeout = "systemctl suspend"; # suspend pc
}
];
};
};
}
-26
View File
@@ -1,26 +0,0 @@
{
pkgs,
inputs,
...
}: {
imports = [
./hypr/animation.nix
./hypr/binds.nix
./hypr/exec.nix
./hypr/general.nix
./hypr/input.nix
./hypr/layers.nix
./hypr/misc.nix
./hypr/rules.nix
./scripts/movement.nix
];
wayland.windowManager.hyprland.enable = true;
wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support...
wayland.windowManager.hyprland.plugins = [
pkgs.hyprlandPlugins.hyprsplit
pkgs.hyprlandPlugins.hypr-dynamic-cursors
pkgs.hyprlandPlugins.hyprspace
pkgs.hyprlandPlugins.hyprbars
];
}
-32
View File
@@ -1,32 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
animations = {
enabled = true;
bezier = [
"easeOutQuint,0.23,1,0.32,1"
"easeInOutCubic,0.65,0.05,0.36,1"
"linear,0,0,1,1"
"almostLinear,0.5,0.5,0.75,1.0"
"quick,0.15,0,0.1,1"
];
animation = [
"global, 1, 10, default"
"border, 1, 5.39, easeOutQuint"
"windows, 1, 4.79, easeOutQuint"
"windowsIn, 1, 4.1, easeOutQuint, popin 87%"
"windowsOut, 1, 1.49, linear, popin 87%"
"fadeIn, 1, 1.73, almostLinear"
"fadeOut, 1, 1.46, almostLinear"
"fade, 1, 3.03, quick"
"layers, 1, 3.81, easeOutQuint"
"layersIn, 1, 4, easeOutQuint, fade"
"layersOut, 1, 1.5, linear, fade"
"fadeLayersIn, 1, 1.79, almostLinear"
"fadeLayersOut, 1, 1.39, almostLinear"
"workspaces, 0, 0, ease"
];
};
};
}
-78
View File
@@ -1,78 +0,0 @@
{pkgs, ...}: {
# TODO: implement a way to show binds, preferably use vicinae.
wayland.windowManager.hyprland.settings = {
bindel = [
", XF86MonBrightnessUp, exec, ddcutil setvcp 10 + 10"
", XF86MonBrightnessDown, exec, ddcutil setvcp 10 - 10"
];
bindm = [
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
bindd =
[
# essential
"SUPER, Return, Open Terminal, exec, uwsm app -- xdg-terminal-exec"
"SUPER, Q, Kill active, killactive"
# resize
"SUPER CTRL, H, Resize Left, resizeactive, -40 0"
"SUPER CTRL, J, Resize Down, resizeactive, 0 40"
"SUPER CTRL, K, Resize Up, resizeactive, 0 -40"
"SUPER CTRL, L, Resize Right, resizeactive, 40 0"
# move focus
"SUPER, J, Move focus down, movefocus, d"
"SUPER, K, Move focus up, movefocus, u"
"SUPER, H, Move focus left, movefocus, l"
"SUPER, L, Move focus right, movefocus, r"
# move window
"SUPER SHIFT, h, Move window left, movewindow, l"
"SUPER SHIFT, j, Move window down, movewindow, d"
"SUPER SHIFT, k, Move window up, movewindow, u"
"SUPER SHIFT, l, Move window right, movewindow, r"
# fullscreen
"SUPER, F, Toggle Fullscreen, fullscreen, 0"
"SUPER SHIFT, F, Toggle Maximized Fullscreen, fullscreen, 1"
# layout
"SUPER, O, Toggle Split, layoutmsg, togglesplit"
# apps
# "SUPER, SPACE, Open App Launcher, exec, nc -U $XDG_RUNTIME_DIR/walker/walker.sock"
"SUPER CTRL, I, Switch Wallpaper, exec, hakase-wallpaper-switch"
# TODO:
# add text clipping from pictures
# add screen recording
# Special workspace
"SUPER, U, Toggle Special Workspace, togglespecialworkspace, custom"
"SUPER SHIFT, U, Move to Special Workspace, movetoworkspace, special:custom"
# [Workspaces] Toggle between most recent workspaces
"SUPER, Tab, Cycle workspaces, workspace, previous"
# hyprspace - workspace overview
"SUPER, E, Toggle Workspace Overview, overview:toggle"
]
++ (
# Generate binds for Super + [1-5] to switch workspaces on current monitor
# and Super + Shift + [1-5] to move window to workspace on current monitor
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
key = toString ws;
in [
"SUPER, ${key}, Switch to workspace ${toString ws}, split:workspace, ${toString ws}"
"SUPER SHIFT, ${key}, Move window to workspace ${toString ws}, split:movetoworkspace, ${toString ws}"
]
)
5)
);
};
}
-16
View File
@@ -1,16 +0,0 @@
{pkgs, ...}: {
home.packages = [
pkgs.gum
];
wayland.windowManager.hyprland.settings = {
env = [
"HYPRCURSOR_THEME,rose-pine-hyprcursor"
"HYPRCURSOR_SIZE,24"
"GUM_CONFIRM_PROMPT_FOREGROUND,6"
"GUM_CONFIRM_SELECTED_FOREGROUND,0"
"GUM_CONFIRM_SELECTED_BACKGROUND,2"
"GUM_CONFIRM_UNSELECTED_FOREGROUND,0"
"GUM_CONFIRM_UNSELECTED_BACKGROUND,8"
];
};
}
-21
View File
@@ -1,21 +0,0 @@
{
pkgs,
config,
...
}: {
home.packages = with pkgs; [
psmisc
];
wayland.windowManager.hyprland.settings = {
exec = [
# "pkill -x hyprpaper; uwsm app -- hyprpaper"
# "matugen image ${config.home.homeDirectory}/.cache/current_wallpaper"
];
exec-once = [
# essentials
"hyprpm reload -n"
"systemctl --user start hyprpolkitagent"
"hyprsunset -t 4500" # TODO: must be optional
];
};
}
-37
View File
@@ -1,37 +0,0 @@
{myConfig, ...}: {
wayland.windowManager.hyprland.settings = {
general = {
gaps_in = 5;
gaps_out = 15;
layout = "dwindle";
};
decoration = {
rounding = 0;
active_opacity = 0.99;
inactive_opacity = 0.70;
shadow = {
enabled = true;
range = 2;
render_power = 3;
color = "rgba(1a1a1aee)";
};
blur = {
enabled = true;
size = 8;
passes = 2;
special = true;
brightness = 0.60;
contrast = 0.75;
};
};
monitor = myConfig.hyprland.monitors;
dwindle = {
pseudotile = true;
preserve_split = true;
smart_split = false;
};
master = {
new_status = "master";
};
};
}
-12
View File
@@ -1,12 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
input = {
repeat_rate = 50;
repeat_delay = 300;
};
cursor = {
hide_on_key_press = false;
no_warps = true;
};
};
}
-12
View File
@@ -1,12 +0,0 @@
{pkgs, ...}: {
wayland.windowManager.hyprland.settings = {
layerrule = [
# Blur and transparency for vicinae
"blur, vicinae"
"ignorealpha 0, vicinae"
# Disable animation for vicinae
"noanim, vicinae"
];
};
}
-57
View File
@@ -1,57 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
misc = {
disable_hyprland_logo = true;
disable_splash_rendering = true;
focus_on_activate = true;
anr_missed_pings = 3;
new_window_takes_over_fullscreen = 1;
};
cursor = {
no_hardware_cursors = true;
no_break_fs_vrr = true;
min_refresh_rate = 48;
};
render = {
direct_scanout = true;
cm_enabled = true;
};
plugin = {
hyprsplit = {
num_workspaces = 5;
persistent_workspaces = false;
};
dynamic-cursors = {
mode = "tilt";
shake = {
enabled = true;
threshold = 4.0;
factor = 1.5;
};
};
overview = {
# Using default settings
};
hyprbars = {
bar_height = 24;
bar_color = "$surface_container_high";
bar_text_color = "$on_surface";
bar_text_size = 0;
bar_text_font = "Sans";
bar_button_padding = 4;
bar_padding = 8;
bar_precedence_over_border = true;
hyprbars-button = [
"$error, 10, , hyprctl dispatch killactive"
"$tertiary, 10, , hyprctl dispatch fullscreen 1"
];
};
};
};
}
-26
View File
@@ -1,26 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
workspace = [
];
windowrulev2 = [
# --- POPUP RULES (Wifi, BT, Audio) ---
"float, class:^(org\.hakase\.popup\..*)$"
"animation slide right, class:^(org\.hakase\.popup\..*)$"
"dimaround, class:^(org\.hakase\.popup\..*)$"
# --- WALLPAPER PICKER ---
"float, class:^(org\.hakase\.switch-wallpaper)$"
"float, initialTitle:^(Wallpaper Selector)$"
"center, class:^(org\.hakase\.switch-wallpaper)$"
"center, initialTitle:^(Wallpaper Selector)$"
"size 60% 60%, class:^(org\.hakase\.switch-wallpaper)$"
"size 60% 60%, initialTitle:^(Wallpaper Selector)$"
"dimaround, class:^(org\.hakase\.switch-wallpaper)$"
"dimaround, initialTitle:^(Wallpaper Selector)$"
# --- CAVA RULES ---
"workspace special:music silent, title:^(cava)$"
"workspace special:music silent, initialTitle:^(cava)$"
];
};
}
-35
View File
@@ -1,35 +0,0 @@
{pkgs, ...}: let
hakase-workspace-switch-force = pkgs.writeShellScriptBin "hakase-workspace-switch-force" ''
HYPRCTL="${pkgs.hyprland}/bin/hyprctl"
JQ="${pkgs.jq}/bin/jq"
special_workspace=$($HYPRCTL monitors -j | $JQ -r '.[] | select(.focused) | .specialWorkspace.name')
workspace_name=''${special_workspace#*:}
chosen_workspace_num=$1
if [[ -z ''${chosen_workspace_num} ]]; then
echo "Usage: $(basename "$0") [number]"
exit 1
fi
if [[ "''${special_workspace}" == *"special"* ]]; then
echo "[LOG] workspace is ''${special_workspace}"
$HYPRCTL dispatch togglespecialworkspace "''${workspace_name}"
$HYPRCTL dispatch workspace "''${chosen_workspace_num}"
else
echo "[LOG] workspace is not special"
$HYPRCTL dispatch workspace "''${chosen_workspace_num}"
exit 0
fi
exit 0
'';
in {
home.packages = [
hakase-workspace-switch-force
];
}
-123
View File
@@ -1,123 +0,0 @@
{
config,
pkgs,
...
}: let
cacheWallpaper = "${config.home.homeDirectory}/.cache/current_wallpaper";
clockFont = "JetBrains Mono";
in {
imports = [
./scripts/typewriter.nix
./scripts/random-text.nix
];
programs.hyprlock = {
# FIXME: `greeting` has as inconsistency in pos for different monitors
enable = true;
extraConfig = ''
source = ~/.config/hypr/hyprlock-colors.conf
general {
hide_cursor = true
grace = 0
}
background {
monitor =
path = ${cacheWallpaper}
blur_passes = 3
blur_size = 8
contrast = 0.9
brightness = 0.7
vibrancy = 0.2
}
# Greeting (above clock)
label {
monitor = DP-1
text = cmd[update:1000] hakase-hyprlock-text-generator
color = $on_surface_variant
font_size = 120
font_family = ${clockFont} Bold
position = 0, 480
halign = center
valign = center
}
# Hours (top)
label {
monitor =
text = cmd[update:1000] date +%H
color = $on_surface
font_size = 140
font_family = ${clockFont} Bold
position = 0, 80
halign = center
valign = center
}
# Minutes (bottom)
label {
monitor =
text = cmd[update:1000] date +%M
color = $primary
font_size = 140
font_family = ${clockFont} Bold
position = 0, -80
halign = center
valign = center
}
# Date
label {
monitor =
text = cmd[update:60000] date '+%A, %B %d'
color = $on_surface_variant
font_size = 18
font_family = ${clockFont}
position = 0, -320
halign = center
valign = center
}
# Caps Lock indicator (above input)
label {
monitor =
text = cmd[update:100] cat /sys/class/leds/*capslock*/brightness 2>/dev/null | grep -q 1 && echo 'CAPS LOCK'
color = $tertiary
font_size = 12
font_family = ${clockFont}
position = 0, -210
halign = center
valign = center
}
input-field {
monitor =
size = 300, 50
outline_thickness = 3
dots_size = 0.33
dots_spacing = 0.15
dots_center = true
outer_color = $primary
inner_color = $surface
font_color = $on_surface
fade_on_empty = false
placeholder_text = <i>Password...</i>
hide_input = false
rounding = 15
position = 0, -250
halign = center
valign = center
# Auth feedback
check_color = $secondary
fail_color = $error
fail_text = <i>$FAIL</i> <b>($ATTEMPTS)</b>
fail_timeout = 2000
fail_transition = 300
}
'';
};
}
-20
View File
@@ -1,20 +0,0 @@
{pkgs, ...}: let
hakase-hyprlock-text-generator = pkgs.writeShellScriptBin "hakase-hyprlock-text-generator" ''
hour=$(date +%H)
name="$USER"
if [[ $hour -lt 12 ]]; then
greeting=""
elif [[ $hour -lt 18 ]]; then
greeting=""
else
greeting=""
fi
echo "$greeting"
'';
in {
home.packages = [
hakase-hyprlock-text-generator
];
}
-60
View File
@@ -1,60 +0,0 @@
{pkgs, ...}: let
hakase-hyprlock-typewriter = pkgs.writeShellScriptBin "hakase-hyprlock-typewriter" ''
text="$1"
if [[ -z "$text" ]]; then
echo "Usage: $(basename "$0") [text]"
exit 1
fi
state_file="''${XDG_RUNTIME_DIR:-/tmp}/typewriter_pos"
blink_file="''${XDG_RUNTIME_DIR:-/tmp}/typewriter_blink"
pid_file="''${XDG_RUNTIME_DIR:-/tmp}/typewriter_pid"
current_pid=$(pgrep -x hyprlock | head -1)
if [[ -f $pid_file ]]; then
old_pid=$(cat $pid_file)
if [[ "''${old_pid}" != "''${current_pid}" ]]; then
rm -f "$state_file" "$blink_file"
fi
fi
echo "$current_pid" >"$pid_file"
if [[ ! -f $state_file ]]; then
echo 0 >"$state_file"
fi
if [[ ! -f $blink_file ]]; then
echo 0 >"$blink_file"
fi
len=''${#text}
letter=$(cat "$state_file")
blink=$(cat "$blink_file")
if [[ $letter -lt $len ]]; then
letter=$((letter + 1))
echo "$letter" >"$state_file"
echo "''${text:0:$letter}_"
else
# Toggle every 4 calls (at 200ms update = ~800ms blink)
if (((blink / 20) % 2 == 0)); then
echo "''${text}_"
else
echo "''${text}<span alpha=\"1%\">_</span>"
fi
fi
blink=$((blink + 1))
echo "$blink" >"$blink_file"
'';
hakase-test-hyprlock-typewriter = pkgs.writeShellScriptBin "hakase-test-hyprlock-typewriter" ''
for i in {1..10}; do
hakase-hyprlock-typewriter
done
'';
in {
home.packages = [
hakase-hyprlock-typewriter
hakase-test-hyprlock-typewriter
];
}
-91
View File
@@ -1,91 +0,0 @@
{
pkgs,
config,
lib,
myConfig,
...
}: let
# TODO: rewrite
wallpaperDir = "${config.home.homeDirectory}/.config/nixos/assets/Wallpapers";
defaultWallpaper = "${wallpaperDir}/${myConfig.hyprland.wallpaper}";
cacheWallpaper = "${config.home.homeDirectory}/.cache/current_wallpaper";
switch-wallpaper = pkgs.writeShellScriptBin "hakase-wallpaper-switch" ''
if [[ "$1" != "run" ]]; then
if command -v ghostty &> /dev/null; then
ghostty --class="org.hakase.switch-wallpaper" --title="Wallpaper Selector" -e bash -c "hakase-wallpaper-switch run || read -p 'Hit Enter to close...'"
exit 0
elif command -v kitty &> /dev/null; then
kitty --class org.hakase.switch-wallpaper --title "Wallpaper Selector" -e bash -c "hakase-wallpaper-switch run || read -p 'Hit Enter to close...'"
exit 0
fi
fi
tmp_file=$(mktemp)
target_dir="$HOME/Pictures/Wallpapers"
if [ ! -d "$target_dir" ]; then
target_dir="$HOME"
fi
# Ensure we are in a terminal that supports yazi
${pkgs.yazi}/bin/yazi "$target_dir" --chooser-file="$tmp_file"
if [ ! -f "$tmp_file" ]; then
echo "No selection file created."
exit 1
fi
WALLPAPER=$(cat "$tmp_file")
rm -f "$tmp_file"
if [ -z "$WALLPAPER" ]; then
echo "No wallpaper selected."
exit 0
fi
# Persistence logic
CACHE_FILE="$HOME/.cache/current_wallpaper"
cp "$WALLPAPER" "$CACHE_FILE"
# Reload hyprpaper
${pkgs.hyprland}/bin/hyprctl hyprpaper unload all
${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$CACHE_FILE"
${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper ",$CACHE_FILE"
exec matugen image "$CACHE_FILE"
'';
in {
wayland.windowManager.hyprland.settings = {
exec-once = [
"uwsm app -- hyprpaper"
];
};
services.hyprpaper = {
enable = true;
settings = {
preload = [cacheWallpaper];
wallpaper = [
",${cacheWallpaper}"
];
};
};
home.packages = [
switch-wallpaper
];
home.activation.setupWallpaper = lib.hm.dag.entryAfter ["writeBoundary"] ''
if [ ! -f "${cacheWallpaper}" ]; then
mkdir -p "$(dirname "${cacheWallpaper}")"
if [ -f "${defaultWallpaper}" ]; then
cp "${defaultWallpaper}" "${cacheWallpaper}"
else
echo "Default wallpaper not found at ${defaultWallpaper}"
touch "${cacheWallpaper}"
fi
fi
'';
systemd.user.startServices = "sd-switch";
}
-5
View File
@@ -1,5 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
jellyfin-media-player
];
}
-23
View File
@@ -1,23 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [loupe];
xdg.mimeApps = {
enable = true;
defaultApplications = {
"image/png" = "org.gnome.Loupe.desktop";
"image/jpeg" = "org.gnome.Loupe.desktop";
"image/gif" = "org.gnome.Loupe.desktop";
"image/webp" = "org.gnome.Loupe.desktop";
"image/bmp" = "org.gnome.Loupe.desktop";
"image/svg+xml" = "org.gnome.Loupe.desktop";
"image/tiff" = "org.gnome.Loupe.desktop";
};
};
wayland.windowManager.hyprland.settings.windowrulev2 = [
# --- IMAGE VIEWER (Loupe) ---
"float, class:^(org\.gnome\.Loupe)$"
"center, class:^(org\.gnome\.Loupe)$"
"size 70% 70%, class:^(org\.gnome\.Loupe)$"
];
}
-11
View File
@@ -1,11 +0,0 @@
{
pkgs,
config,
...
}: {
home.packages = with pkgs; [
libnotify
];
services.mako.enable = true;
}
-57
View File
@@ -1,57 +0,0 @@
[config] # FIXME: ~/.config feels unreliable. Use config.home.homeDirectory instead.
reload_on_change = true
[templates.ghostty]
input_path = "~/.config/matugen/templates/ghostty"
output_path = "~/.config/ghostty/themes/matugen"
post_hook = "killall -SIGUSR2 .ghostty-wrappe"
[templates.hyprland]
input_path = "~/.config/matugen/templates/hyprland"
output_path = "~/.config/hypr/matugen.conf"
post_hook = "hyprctl reload"
[templates.waybar]
input_path = "~/.config/matugen/templates/waybar"
output_path = "~/.config/waybar/matugen.css"
post_hook = "killall -SIGUSR2 .waybar-wrapped"
[templates.starship]
input_path = "~/.config/matugen/templates/starship"
output_path = "~/.config/starship.toml"
[templates.walker]
input_path = "~/.config/matugen/templates/walker"
output_path = "~/.config/walker/themes/nixos/style.css"
[templates.pywalfox]
input_path = '~/.config/matugen/templates/firefox'
output_path = '~/.cache/wal/colors.json'
post_hook = 'pywalfox update'
[templates.cava]
input_path = "~/.config/matugen/templates/cava"
output_path = "~/.config/cava/config"
post_hook = "pkill -USR1 cava"
[templates.gtk3]
input_path = "~/.config/matugen/templates/gtk3"
output_path = "~/.config/gtk-3.0/colors.css"
[templates.gtk4]
input_path = "~/.config/matugen/templates/gtk4"
output_path = "~/.config/gtk-4.0/colors.css"
[templates.hyprlock]
input_path = "~/.config/matugen/templates/hyprlock"
output_path = "~/.config/hypr/hyprlock-colors.conf"
[templates.mako]
input_path = "~/.config/matugen/templates/mako"
output_path = "~/.config/mako/config"
post_hook = "makoctl reload"
[templates.vicinae]
input_path = "~/.config/matugen/templates/vicinae"
output_path = "~/.local/share/vicinae/themes/matugen.toml"
post_hook = "vicinae theme set matugen"
-44
View File
@@ -1,44 +0,0 @@
{
pkgs,
inputs,
...
}: {
home.packages = with pkgs; [
matugen
psmisc # for killall
];
home.file.".config/matugen/config.toml" = {
source = ./config.toml;
};
home.file.".config/matugen/templates" = {
source = ./templates;
recursive = true;
};
# Qt theming - follow GTK theme
qt = {
enable = true;
platformTheme.name = "gtk";
};
# GTK theming with adw-gtk3 and Matugen colors
gtk = {
enable = true;
theme = {
name = "adw-gtk3-dark";
package = pkgs.adw-gtk3;
};
iconTheme = {
name = "Papirus-Dark";
package = pkgs.papirus-icon-theme;
};
gtk3.extraCss = ''@import url("colors.css");'';
gtk4.extraCss = ''@import url("colors.css");'';
};
programs.ghostty.settings.theme = "matugen";
programs.starship.enable = true;
wayland.windowManager.hyprland.settings.source = ["./matugen.conf"];
programs.walker.config.theme = "nixos";
}
-25
View File
@@ -1,25 +0,0 @@
[general]
framerate = 60
autosens = 1
bars = 0
bar_width = 3
bar_spacing = 1
sleep_timer = 5
[input]
method = pipewire
source = auto
[output]
method = ncurses
style = stereo
[color]
gradient = 1
gradient_count = 6
gradient_color_1 = '{{colors.primary.default.hex}}'
gradient_color_2 = '{{colors.primary_container.default.hex}}'
gradient_color_3 = '{{colors.secondary.default.hex}}'
gradient_color_4 = '{{colors.secondary_container.default.hex}}'
gradient_color_5 = '{{colors.tertiary.default.hex}}'
gradient_color_6 = '{{colors.tertiary_container.default.hex}}'
-22
View File
@@ -1,22 +0,0 @@
{
"wallpaper": "{{image}}",
"alpha": "100",
"colors": {
"color0": "{{colors.background.default.hex}}",
"color1": "",
"color2": "",
"color3": "",
"color4": "",
"color5": "",
"color6": "",
"color7": "",
"color8": "",
"color9": "",
"color10": "{{colors.primary.default.hex}}",
"color11": "",
"color12": "",
"color13": "{{colors.surface_bright.default.hex}}",
"color14": "",
"color15": "{{colors.on_surface.default.hex}}"
}
}
-6
View File
@@ -1,6 +0,0 @@
background = {{colors.background.default.hex}}
foreground = {{colors.on_surface.default.hex}}
cursor-color = {{colors.on_surface.default.hex}}
cursor-text = {{colors.on_surface_variant.default.hex}}
selection-background = {{colors.secondary_fixed_dim.default.hex}}
selection-foreground = {{colors.on_secondary.default.hex}}
-78
View File
@@ -1,78 +0,0 @@
@define-color accent_color {{colors.primary.default.hex}};
@define-color accent_bg_color {{colors.primary.default.hex}};
@define-color accent_fg_color {{colors.on_primary.default.hex}};
@define-color destructive_color {{colors.error.default.hex}};
@define-color destructive_bg_color {{colors.error.default.hex}};
@define-color destructive_fg_color {{colors.on_error.default.hex}};
@define-color success_color {{colors.tertiary.default.hex}};
@define-color success_bg_color {{colors.tertiary.default.hex}};
@define-color success_fg_color {{colors.on_tertiary.default.hex}};
@define-color warning_color {{colors.secondary.default.hex}};
@define-color warning_bg_color {{colors.secondary.default.hex}};
@define-color warning_fg_color {{colors.on_secondary.default.hex}};
@define-color error_color {{colors.error.default.hex}};
@define-color error_bg_color {{colors.error.default.hex}};
@define-color error_fg_color {{colors.on_error.default.hex}};
@define-color window_bg_color {{colors.surface.default.hex}};
@define-color window_fg_color {{colors.on_surface.default.hex}};
@define-color view_bg_color {{colors.surface_container.default.hex}};
@define-color view_fg_color {{colors.on_surface.default.hex}};
@define-color headerbar_bg_color {{colors.surface_container.default.hex}};
@define-color headerbar_fg_color {{colors.on_surface.default.hex}};
@define-color headerbar_border_color transparent;
@define-color headerbar_backdrop_color {{colors.surface.default.hex}};
@define-color headerbar_shade_color rgba(0, 0, 0, 0.07);
@define-color card_bg_color {{colors.surface_container_low.default.hex}};
@define-color card_fg_color {{colors.on_surface.default.hex}};
@define-color card_shade_color rgba(0, 0, 0, 0.07);
@define-color dialog_bg_color {{colors.surface_container_high.default.hex}};
@define-color dialog_fg_color {{colors.on_surface.default.hex}};
@define-color popover_bg_color {{colors.surface_container.default.hex}};
@define-color popover_fg_color {{colors.on_surface.default.hex}};
@define-color shade_color rgba(0, 0, 0, 0.07);
@define-color scrollbar_outline_color rgba(0, 0, 0, 0.5);
@define-color blue_1 {{colors.primary.default.hex}};
@define-color blue_2 {{colors.primary.default.hex}};
@define-color blue_3 {{colors.primary.default.hex}};
@define-color blue_4 {{colors.primary.default.hex}};
@define-color blue_5 {{colors.primary.default.hex}};
@define-color green_1 {{colors.tertiary.default.hex}};
@define-color green_2 {{colors.tertiary.default.hex}};
@define-color green_3 {{colors.tertiary.default.hex}};
@define-color green_4 {{colors.tertiary.default.hex}};
@define-color green_5 {{colors.tertiary.default.hex}};
@define-color yellow_1 {{colors.secondary.default.hex}};
@define-color yellow_2 {{colors.secondary.default.hex}};
@define-color yellow_3 {{colors.secondary.default.hex}};
@define-color yellow_4 {{colors.secondary.default.hex}};
@define-color yellow_5 {{colors.secondary.default.hex}};
@define-color orange_1 {{colors.secondary.default.hex}};
@define-color orange_2 {{colors.secondary.default.hex}};
@define-color orange_3 {{colors.secondary.default.hex}};
@define-color orange_4 {{colors.secondary.default.hex}};
@define-color orange_5 {{colors.secondary.default.hex}};
@define-color red_1 {{colors.error.default.hex}};
@define-color red_2 {{colors.error.default.hex}};
@define-color red_3 {{colors.error.default.hex}};
@define-color red_4 {{colors.error.default.hex}};
@define-color red_5 {{colors.error.default.hex}};
@define-color purple_1 {{colors.tertiary.default.hex}};
@define-color purple_2 {{colors.tertiary.default.hex}};
@define-color purple_3 {{colors.tertiary.default.hex}};
@define-color purple_4 {{colors.tertiary.default.hex}};
@define-color purple_5 {{colors.tertiary.default.hex}};
@define-color brown_1 {{colors.surface_variant.default.hex}};
@define-color brown_2 {{colors.surface_variant.default.hex}};
@define-color brown_3 {{colors.surface_variant.default.hex}};
@define-color brown_4 {{colors.surface_variant.default.hex}};
@define-color brown_5 {{colors.surface_variant.default.hex}};
@define-color light_1 {{colors.surface_bright.default.hex}};
@define-color light_2 {{colors.surface.default.hex}};
@define-color light_3 {{colors.surface_dim.default.hex}};
@define-color light_4 {{colors.surface_container.default.hex}};
@define-color light_5 {{colors.surface_container_high.default.hex}};
@define-color dark_1 {{colors.surface_dim.default.hex}};
@define-color dark_2 {{colors.surface.default.hex}};
@define-color dark_3 {{colors.surface_container.default.hex}};
@define-color dark_4 {{colors.surface_container_high.default.hex}};
@define-color dark_5 {{colors.surface_container_highest.default.hex}};
-78
View File
@@ -1,78 +0,0 @@
@define-color accent_color {{colors.primary.default.hex}};
@define-color accent_bg_color {{colors.primary.default.hex}};
@define-color accent_fg_color {{colors.on_primary.default.hex}};
@define-color destructive_color {{colors.error.default.hex}};
@define-color destructive_bg_color {{colors.error.default.hex}};
@define-color destructive_fg_color {{colors.on_error.default.hex}};
@define-color success_color {{colors.tertiary.default.hex}};
@define-color success_bg_color {{colors.tertiary.default.hex}};
@define-color success_fg_color {{colors.on_tertiary.default.hex}};
@define-color warning_color {{colors.secondary.default.hex}};
@define-color warning_bg_color {{colors.secondary.default.hex}};
@define-color warning_fg_color {{colors.on_secondary.default.hex}};
@define-color error_color {{colors.error.default.hex}};
@define-color error_bg_color {{colors.error.default.hex}};
@define-color error_fg_color {{colors.on_error.default.hex}};
@define-color window_bg_color {{colors.surface.default.hex}};
@define-color window_fg_color {{colors.on_surface.default.hex}};
@define-color view_bg_color {{colors.surface_container.default.hex}};
@define-color view_fg_color {{colors.on_surface.default.hex}};
@define-color headerbar_bg_color {{colors.surface_container.default.hex}};
@define-color headerbar_fg_color {{colors.on_surface.default.hex}};
@define-color headerbar_border_color transparent;
@define-color headerbar_backdrop_color {{colors.surface.default.hex}};
@define-color headerbar_shade_color rgba(0, 0, 0, 0.07);
@define-color card_bg_color {{colors.surface_container_low.default.hex}};
@define-color card_fg_color {{colors.on_surface.default.hex}};
@define-color card_shade_color rgba(0, 0, 0, 0.07);
@define-color dialog_bg_color {{colors.surface_container_high.default.hex}};
@define-color dialog_fg_color {{colors.on_surface.default.hex}};
@define-color popover_bg_color {{colors.surface_container.default.hex}};
@define-color popover_fg_color {{colors.on_surface.default.hex}};
@define-color shade_color rgba(0, 0, 0, 0.07);
@define-color scrollbar_outline_color rgba(0, 0, 0, 0.5);
@define-color blue_1 {{colors.primary.default.hex}};
@define-color blue_2 {{colors.primary.default.hex}};
@define-color blue_3 {{colors.primary.default.hex}};
@define-color blue_4 {{colors.primary.default.hex}};
@define-color blue_5 {{colors.primary.default.hex}};
@define-color green_1 {{colors.tertiary.default.hex}};
@define-color green_2 {{colors.tertiary.default.hex}};
@define-color green_3 {{colors.tertiary.default.hex}};
@define-color green_4 {{colors.tertiary.default.hex}};
@define-color green_5 {{colors.tertiary.default.hex}};
@define-color yellow_1 {{colors.secondary.default.hex}};
@define-color yellow_2 {{colors.secondary.default.hex}};
@define-color yellow_3 {{colors.secondary.default.hex}};
@define-color yellow_4 {{colors.secondary.default.hex}};
@define-color yellow_5 {{colors.secondary.default.hex}};
@define-color orange_1 {{colors.secondary.default.hex}};
@define-color orange_2 {{colors.secondary.default.hex}};
@define-color orange_3 {{colors.secondary.default.hex}};
@define-color orange_4 {{colors.secondary.default.hex}};
@define-color orange_5 {{colors.secondary.default.hex}};
@define-color red_1 {{colors.error.default.hex}};
@define-color red_2 {{colors.error.default.hex}};
@define-color red_3 {{colors.error.default.hex}};
@define-color red_4 {{colors.error.default.hex}};
@define-color red_5 {{colors.error.default.hex}};
@define-color purple_1 {{colors.tertiary.default.hex}};
@define-color purple_2 {{colors.tertiary.default.hex}};
@define-color purple_3 {{colors.tertiary.default.hex}};
@define-color purple_4 {{colors.tertiary.default.hex}};
@define-color purple_5 {{colors.tertiary.default.hex}};
@define-color brown_1 {{colors.surface_variant.default.hex}};
@define-color brown_2 {{colors.surface_variant.default.hex}};
@define-color brown_3 {{colors.surface_variant.default.hex}};
@define-color brown_4 {{colors.surface_variant.default.hex}};
@define-color brown_5 {{colors.surface_variant.default.hex}};
@define-color light_1 {{colors.surface_bright.default.hex}};
@define-color light_2 {{colors.surface.default.hex}};
@define-color light_3 {{colors.surface_dim.default.hex}};
@define-color light_4 {{colors.surface_container.default.hex}};
@define-color light_5 {{colors.surface_container_high.default.hex}};
@define-color dark_1 {{colors.surface_dim.default.hex}};
@define-color dark_2 {{colors.surface.default.hex}};
@define-color dark_3 {{colors.surface_container.default.hex}};
@define-color dark_4 {{colors.surface_container_high.default.hex}};
@define-color dark_5 {{colors.surface_container_highest.default.hex}};
-4
View File
@@ -1,4 +0,0 @@
<* for name, value in colors *>
$image = {{image}}
${{name}} = rgba({{value.default.hex_stripped}}ff)
<* endfor *>
-4
View File
@@ -1,4 +0,0 @@
$image = {{image}}
<* for name, value in colors *>
${{name}} = rgba({{value.default.hex_stripped}}ff)
<* endfor *>
-42
View File
@@ -1,42 +0,0 @@
# Mako notification daemon configuration
# Generated by matugen
# Appearance
font=Sans 11
width=350
height=150
margin=10
padding=15
border-size=2
border-radius=8
# Behavior
default-timeout=5000
ignore-timeout=false
layer=overlay
anchor=top-right
# Interaction
markup=true
actions=true
# Grouping
group-by=app-name
max-visible=5
sort=-time
# Theme colors from matugen
background-color=#{{colors.surface_container_high.default.hex_stripped}}
text-color=#{{colors.on_surface.default.hex_stripped}}
border-color=#{{colors.primary.default.hex_stripped}}
progress-color=over #{{colors.primary_container.default.hex_stripped}}
[urgency=low]
border-color=#{{colors.tertiary.default.hex_stripped}}
[urgency=normal]
border-color=#{{colors.primary.default.hex_stripped}}
[urgency=high]
border-color=#{{colors.error.default.hex_stripped}}
default-timeout=0
-53
View File
@@ -1,53 +0,0 @@
format = '''
[╭─](color1)$username$hostname$directory$git_branch$git_state$git_status$cmd_duration$line_break[╰─](color1)$python$character'''
palette = 'colors'
[palettes.colors]
mustard = '#af8700' # example
color1 = '{{colors.primary_fixed_dim.default.hex}}'
color2 = '{{colors.on_primary.default.hex}}'
color3 = '{{colors.on_surface_variant.default.hex}}'
color4 = '{{colors.surface_container.default.hex}}'
color5 = '{{colors.on_primary.default.hex}}'
color6 = '{{colors.surface_dim.default.hex}}'
color7 = '{{colors.surface.default.hex}}'
color8 = '{{colors.primary.default.hex}}'
color9 = '{{colors.tertiary.default.hex}}'
[directory]
style = "bold color8"
[character]
success_symbol = "[](bold color9)"
error_symbol = "[](bold red)"
vicmd_symbol = "[](bold color3)"
[git_branch]
format = "[$branch]($style) "
style = "bold color3"
[git_status]
format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](color9) ($ahead_behind$stashed)]($style) "
style = "bold color9"
conflicted = ""
untracked = ""
modified = ""
staged = ""
renamed = ""
deleted = ""
stashed = "≡"
[git_state]
format = '\([$state( $progress_current/$progress_total)]($style)\) '
style = "bold color3"
[cmd_duration]
format = "[$duration]($style) "
style = "bold mustard"
[python]
format = "[$virtualenv]($style) "
style = "bold color3"
detect_extensions = []
detect_files = []
-126
View File
@@ -1,126 +0,0 @@
# Vicinae Matugen Theme Template
[meta]
name = "Matugen"
description = "Material You theme generated by Matugen - {{mode}} variant"
variant = "{{mode}}"
# ============================================================================
# Core Colors
# ============================================================================
[colors.core]
accent = "{{colors.primary.default.hex}}"
accent_foreground = "{{colors.on_primary.default.hex}}"
background = "{{colors.surface.default.hex}}"
foreground = "{{colors.on_surface.default.hex}}"
secondary_background = "{{colors.surface_container.default.hex}}"
border = "{{colors.outline_variant.default.hex}}"
# ============================================================================
# Window Borders
# ============================================================================
[colors.main_window]
border = "{{colors.outline_variant.default.hex}}"
[colors.settings_window]
border = "{{colors.outline.default.hex}}"
# ============================================================================
# Accent Palette
# ============================================================================
[colors.accents]
blue = "{{colors.primary.default.hex}}"
green = "{{colors.tertiary.default.hex}}"
magenta = "{{colors.secondary.default.hex}}"
orange = { name = "{{colors.error.default.hex}}", lighter = 40 }
red = "{{colors.error.default.hex}}"
yellow = { name = "{{colors.tertiary.default.hex}}", lighter = 80 }
cyan = { name = "{{colors.primary.default.hex}}", lighter = 50 }
purple = "{{colors.secondary.default.hex}}"
# ============================================================================
# Text System
# ============================================================================
[colors.text]
default = "{{colors.on_surface.default.hex}}"
muted = "{{colors.on_surface_variant.default.hex}}"
danger = "{{colors.error.default.hex}}"
success = "{{colors.tertiary.default.hex}}"
placeholder = { name = "{{colors.on_surface_variant.default.hex}}", opacity = 0.6 }
[colors.text.selection]
background = "{{colors.primary.default.hex}}"
foreground = "{{colors.on_primary.default.hex}}"
[colors.text.links]
default = "{{colors.primary.default.hex}}"
visited = { name = "{{colors.tertiary.default.hex}}", darker = 20 }
# ============================================================================
# Input Fields
# ============================================================================
[colors.input]
border = "{{colors.outline.default.hex}}"
border_focus = "{{colors.primary.default.hex}}"
border_error = "{{colors.error.default.hex}}"
# ============================================================================
# Buttons
# ============================================================================
[colors.button.primary]
background = "{{colors.surface_container_high.default.hex}}"
foreground = "{{colors.on_surface.default.hex}}"
[colors.button.primary.hover]
background = "{{colors.surface_container_highest.default.hex}}"
[colors.button.primary.focus]
outline = "{{colors.primary.default.hex}}"
# ============================================================================
# Lists
# ============================================================================
[colors.list.item.hover]
background = { name = "{{colors.primary_container.default.hex}}", opacity = 0.25 }
foreground = "{{colors.on_surface.default.hex}}"
[colors.list.item.selection]
background = { name = "{{colors.primary_container.default.hex}}", opacity = 0.50 }
foreground = "{{colors.on_primary_container.default.hex}}"
secondary_background = "{{colors.primary_container.default.hex}}"
secondary_foreground = "{{colors.on_primary_container.default.hex}}"
# ============================================================================
# Grid Items
# ============================================================================
[colors.grid.item]
background = "{{colors.surface_container.default.hex}}"
[colors.grid.item.hover]
outline = { name = "{{colors.secondary.default.hex}}", opacity = 0.8 }
[colors.grid.item.selection]
outline = { name = "{{colors.primary.default.hex}}" }
# ============================================================================
# Scrollbars
# ============================================================================
[colors.scrollbars]
background = { name = "{{colors.primary.default.hex}}", opacity = 0.2 }
# ============================================================================
# Loading States
# ============================================================================
[colors.loading]
bar = "{{colors.primary.default.hex}}"
spinner = "{{colors.primary.default.hex}}"
-123
View File
@@ -1,123 +0,0 @@
/* @import "../../../../../../../.config/omarchy/current/theme/walker.css"; */
/* Define Matugen Colors */
@define-color text {{colors.on_surface.default.hex}};
@define-color base {{colors.surface_container.default.hex}};
@define-color border {{colors.primary.default.hex}};
@define-color selected_text {{colors.primary.default.hex}};
@define-color background {{colors.surface.default.hex}};
* {
all: unset;
}
* {
font-family: monospace;
font-size: 18px;
color: @text;
}
scrollbar {
opacity: 0;
}
.normal-icons {
-gtk-icon-size: 16px;
}
.large-icons {
-gtk-icon-size: 32px;
}
.box-wrapper {
background: alpha(@base, 0.95);
padding: 20px;
border: 2px solid @border;
}
.preview-box {
}
.box {
}
.search-container {
background: @base;
padding: 10px;
}
.input placeholder {
opacity: 0.5;
}
.input {
}
.input:focus,
.input:active {
box-shadow: none;
outline: none;
}
.content-container {
}
.placeholder {
}
.scroll {
}
.list {
}
child,
child > * {
}
child:hover .item-box {
}
child:selected .item-box {
}
child:selected .item-box * {
color: @selected_text;
}
.item-box {
padding-left: 14px;
}
.item-text-box {
all: unset;
padding: 14px 0;
}
.item-text {
}
.item-subtext {
font-size: 0px;
min-height: 0px;
margin: 0px;
padding: 0px;
}
.item-image {
margin-right: 14px;
-gtk-icon-transform: scale(0.9);
}
.current {
font-style: italic;
}
.keybind-hints {
background: @background;
padding: 10px;
margin-top: 10px;
}
.preview {
}
-7
View File
@@ -1,7 +0,0 @@
/*
* Css Colors
* Generated with Matugen
*/
<* for name, value in colors *>
@define-color {{name}} {{value.default.hex}};
<* endfor *>
-15
View File
@@ -1,15 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [mpv];
xdg.mimeApps = {
enable = true;
defaultApplications = {
"video/mp4" = "mpv.desktop";
"video/mkv" = "mpv.desktop";
"video/webm" = "mpv.desktop";
"video/avi" = "mpv.desktop";
"video/x-matroska" = "mpv.desktop";
"video/quicktime" = "mpv.desktop";
};
};
}
-13
View File
@@ -1,13 +0,0 @@
{pkgs, ...}: {
home.packages = [
pkgs.playerctl
];
wayland.windowManager.hyprland.settings = {
bindl = [
", XF86AudioPlay, exec, playerctl play-pause && notify-send -u low -t 1000 \"Media\" \"$(playerctl status)\""
", XF86AudioPrev, exec, playerctl previous && notify-send -u low -t 1000 \"Previous Track\" \"$(playerctl metadata title)\""
", XF86AudioNext, exec, playerctl next && notify-send -u low -t 1000 \"Next Track\" \"$(playerctl metadata title)\""
];
};
}
-70
View File
@@ -1,70 +0,0 @@
{pkgs, ...}: let
# Screenshot script with swappy integration
screenshot = pkgs.writeShellScriptBin "screenshot" ''
#!/usr/bin/env bash
case "$1" in
region)
# Select region and edit
grim -g "$(slurp)" - | swappy -f -
;;
window)
# Screenshot active window
grim -g "$(hyprctl -j activewindow | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')" - | swappy -f -
;;
screen)
# Screenshot current monitor
grim -o "$(hyprctl -j monitors | jq -r '.[] | select(.focused) | .name')" - | swappy -f -
;;
all)
# Screenshot all monitors
grim - | swappy -f -
;;
region-save)
# Quick region screenshot (save without editing and copy to clipboard)
filepath=~/Pictures/Screenshots/$(date +'%Y-%m-%d_%H-%M-%S.png')
grim -g "$(slurp)" "$filepath"
wl-copy < "$filepath"
notify-send "Screenshot saved" "Saved and copied to clipboard"
;;
*)
echo "Usage: screenshot {region|window|screen|all|region-save}"
exit 1
;;
esac
'';
in {
home.packages = with pkgs; [
grim # Screenshot utility
slurp # Region selector
swappy # Annotation tool
jq # For window selection
wl-clipboard # For copying to clipboard
screenshot # Our wrapper script
];
# Create Screenshots directory
home.file."Pictures/Screenshots/.keep".text = "";
# Swappy configuration
home.file.".config/swappy/config".text = ''
[Default]
save_dir=$HOME/Pictures/Screenshots
save_filename_format=screenshot_%Y%m%d_%H%M%S.png
show_panel=true
line_size=5
text_size=20
text_font=sans-serif
paint_mode=brush
early_exit=false
fill_shape=false
'';
wayland.windowManager.hyprland.settings.bindd = [
# Screenshots
"SUPER, S, Screenshot Region (with edit), exec, screenshot region"
"SUPER SHIFT, S, Screenshot Active Window, exec, screenshot window"
"SUPER ALT, S, Quick Screenshot (no edit), exec, screenshot region-save"
"SUPER ALT SHIFT, S, Screenshot Current Monitor, exec, screenshot screen"
];
}
-17
View File
@@ -1,17 +0,0 @@
{pkgs, ...}: {
services.swayosd.enable = true;
wayland.windowManager.hyprland.settings = {
exec-once = [
"uwsm app -- swayosd-server"
];
bindel = [
", XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise"
", XF86AudioLowerVolume, exec, swayosd-client --output-volume lower"
];
bindl = [
", XF86AudioMute, exec, swayosd-client --output-volume mute-toggle"
", Caps_Lock, exec, swayosd-client --caps-lock"
];
};
}
-21
View File
@@ -1,21 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [ tickrs ];
xdg.configFile."tickrs/config.yml".text = ''
symbols:
- NVDA
- AMD
- LAC
- ONDS
- SLV
- GOOGL
- TSM
show_volumes: true
show_x_axis: true
show_y_axis: true
time_frame: Day1
update_frequency: 1
chart_type: candle
'';
}
-14
View File
@@ -1,14 +0,0 @@
{pkgs, ...}: let
hakase-screensaver-launch = pkgs.writeShellScriptBin "hakase-cmd-screensaver" ''
# Placeholder for actual screensaver logic if needed
echo "Screensaver placeholder"
'';
in {
home.packages = with pkgs; [
terminaltexteffects
hakase-screensaver-launch
];
home.file.".config/hakase/branding/screensaver.txt" = {
source = ../../assets/branding.txt;
};
}
-54
View File
@@ -1,54 +0,0 @@
{pkgs, ...}: {
# TODO: create a script that initializes vicinae if `vicinae server` is off.
services.vicinae = {
enable = true;
systemd = {
enable = true;
autoStart = true;
environment = {
USE_LAYER_SHELL = 1;
};
};
settings = {
# Escape closes window (vim-like :q behavior)
escape_key_behavior = "close_window";
pop_to_root_on_close = true;
close_on_unfocus = true;
keybinds = {
# UI shortcuts
"open-search-filter" = "control+/"; # vim search
"open-settings" = "control+,";
"toggle-action-panel" = "control+B";
# Vim-like action keybinds
"action.move-up" = "control+shift+K";
"action.move-down" = "control+shift+J";
"action.copy" = "control+Y"; # yank
"action.copy-name" = "control+shift+Y";
"action.remove" = "control+D"; # delete
"action.dangerous-remove" = "control+shift+D";
"action.edit" = "control+E";
"action.open" = "control+O";
"action.refresh" = "control+R";
"action.pin" = "control+P";
"action.new" = "control+N";
"action.save" = "control+S";
};
};
};
# Ensure vicinae themes directory exists for matugen output
home.file.".local/share/vicinae/themes/.keep".text = "";
wayland.windowManager.hyprland.settings = {
exec-once = [
"vicinae server"
];
bindd = [
"SUPER, SPACE, Open Vicinae, exec, vicinae toggle"
];
};
}
-579
View File
@@ -1,579 +0,0 @@
{
inputs,
config,
pkgs,
...
}: {
wayland.windowManager.hyprland.settings = {
exec-once = [
"uwsm app -- elephant"
"walker --gapplication-service"
];
};
imports = [
# ./style.nix
./layout.nix
];
programs.walker = {
enable = true;
runAsService = true;
package = inputs.walker.packages.${pkgs.system}.default;
# CSS Implementation using Stylix Colors
config = {
# General Settings
force_keyboard_focus = true;
close_when_open = true;
click_to_close = true;
single_click_activation = true;
selection_wrap = true;
global_argument_delimiter = "#";
exact_search_prefix = "'";
# theme = "default";
disable_mouse = false;
debug = false;
page_jump_items = 10;
hide_quick_activation = true;
hide_action_hints = true;
hide_action_hints_dmenu = true;
hide_return_action = false;
resume_last_query = false;
actions_as_menu = false;
# Shell positioning
shell = {
anchor_top = true;
anchor_bottom = true;
anchor_left = true;
anchor_right = true;
};
# Column config
columns.symbols = 3;
# Placeholders
placeholders.default = {
input = "Search";
list = "No Results";
};
# Keybinds
keybinds = {
close = ["Escape"];
next = ["Down"];
previous = ["Up"];
left = ["Left"];
right = ["Right"];
down = ["Down"];
up = ["Up"];
toggle_exact = ["ctrl e"];
resume_last_query = ["ctrl r"];
quick_activate = ["F1" "F2" "F3" "F4"];
page_down = ["Page_Down"];
page_up = ["Page_Up"];
show_actions = ["alt j"];
};
# Providers General
providers = {
default = ["desktopapplications" "calc" "websearch"];
empty = ["desktopapplications"];
ignore_preview = [];
max_results = 50;
argument_delimiter.runner = " ";
clipboard.time_format = "%d.%m. - %H:%M";
# Provider Prefixes
prefixes = [
{
prefix = ";";
provider = "providerlist";
}
{
prefix = ">";
provider = "runner";
}
{
prefix = "/";
provider = "files";
}
{
prefix = ".";
provider = "symbols";
}
{
prefix = "!";
provider = "todo";
}
{
prefix = "%";
provider = "bookmarks";
}
{
prefix = "=";
provider = "calc";
}
{
prefix = "@";
provider = "websearch";
}
{
prefix = ":";
provider = "clipboard";
}
{
prefix = "$";
provider = "windows";
}
];
# Actions
actions = {
fallback = [
{
action = "menus:open";
label = "open";
after = "Nothing";
}
{
action = "menus:default";
label = "run";
after = "Close";
}
{
action = "menus:parent";
label = "back";
bind = "Escape";
after = "Nothing";
}
{
action = "erase_history";
label = "clear hist";
bind = "ctrl h";
after = "AsyncReload";
}
];
dmenu = [
{
action = "select";
default = true;
bind = "Return";
}
];
providerlist = [
{
action = "activate";
default = true;
bind = "Return";
after = "ClearReload";
}
];
bluetooth = [
{
action = "find";
bind = "ctrl f";
after = "AsyncClearReload";
}
{
action = "remove";
bind = "ctrl d";
after = "AsyncReload";
}
{
action = "trust";
bind = "ctrl t";
after = "AsyncReload";
}
{
action = "untrust";
bind = "ctrl t";
after = "AsyncReload";
}
{
action = "pair";
bind = "Return";
after = "AsyncReload";
}
{
action = "connect";
default = true;
bind = "Return";
after = "AsyncReload";
}
{
action = "disconnect";
default = true;
bind = "Return";
after = "AsyncReload";
}
];
archlinuxpkgs = [
{
action = "install";
bind = "Return";
default = true;
}
{
action = "remove";
bind = "Return";
}
{
action = "show_all";
label = "show all";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "refresh";
label = "refresh";
bind = "ctrl r";
after = "AsyncReload";
}
{
action = "visit_url";
label = "open URL";
bind = "ctrl o";
}
{
action = "show_installed";
label = "show installed";
bind = "ctrl i";
after = "AsyncClearReload";
}
];
calc = [
{
action = "copy";
default = true;
bind = "Return";
}
{
action = "delete";
bind = "ctrl d";
after = "AsyncReload";
}
{
action = "save";
bind = "ctrl s";
after = "AsyncClearReload";
}
];
websearch = [
{
action = "search";
default = true;
bind = "Return";
}
{
action = "open_url";
label = "open url";
default = true;
bind = "Return";
}
];
desktopapplications = [
{
action = "start";
default = true;
bind = "Return";
}
{
action = "start:keep";
label = "open+next";
bind = "shift Return";
after = "KeepOpen";
}
{
action = "new_instance";
label = "new instance";
bind = "ctrl Return";
}
{
action = "new_instance:keep";
label = "new+next";
bind = "ctrl alt Return";
after = "KeepOpen";
}
{
action = "pin";
bind = "ctrl p";
after = "AsyncReload";
}
{
action = "unpin";
bind = "ctrl p";
after = "AsyncReload";
}
{
action = "pinup";
bind = "ctrl n";
after = "AsyncReload";
}
{
action = "pindown";
bind = "ctrl m";
after = "AsyncReload";
}
];
files = [
{
action = "open";
default = true;
bind = "Return";
}
{
action = "opendir";
label = "open dir";
bind = "ctrl Return";
}
{
action = "copypath";
label = "copy path";
bind = "ctrl shift c";
}
{
action = "copyfile";
label = "copy file";
bind = "ctrl c";
}
{
action = "localsend";
label = "localsend";
bind = "ctrl l";
}
{
action = "refresh_index";
label = "reload";
bind = "ctrl r";
after = "AsyncReload";
}
];
# Note: "1password" key starts with a digit, must be quoted in Nix
"1password" = [
{
action = "copy_password";
label = "copy password";
default = true;
bind = "Return";
}
{
action = "copy_username";
label = "copy username";
bind = "shift Return";
}
{
action = "copy_2fa";
label = "copy 2fa";
bind = "ctrl Return";
}
];
todo = [
{
action = "save";
default = true;
bind = "Return";
after = "AsyncClearReload";
}
{
action = "save_next";
label = "save & new";
bind = "shift Return";
after = "AsyncClearReload";
}
{
action = "delete";
bind = "ctrl d";
after = "AsyncClearReload";
}
{
action = "active";
default = true;
bind = "Return";
after = "Nothing";
}
{
action = "inactive";
default = true;
bind = "Return";
after = "Nothing";
}
{
action = "done";
bind = "ctrl f";
after = "Nothing";
}
{
action = "change_category";
bind = "ctrl y";
label = "change category";
after = "Nothing";
}
{
action = "clear";
bind = "ctrl x";
after = "AsyncClearReload";
}
{
action = "create";
bind = "ctrl a";
after = "AsyncClearReload";
}
{
action = "search";
bind = "ctrl a";
after = "AsyncClearReload";
}
];
runner = [
{
action = "run";
default = true;
bind = "Return";
}
{
action = "runterminal";
label = "run in terminal";
bind = "shift Return";
}
];
symbols = [
{
action = "copy";
label = "select";
default = true;
bind = "Return";
}
];
unicode = [
{
action = "copy";
label = "select";
default = true;
bind = "Return";
}
];
nirisessions = [
{
action = "start";
label = "start";
default = true;
bind = "Return";
}
{
action = "start_new";
label = "start blank";
bind = "ctrl Return";
}
];
clipboard = [
{
action = "copy";
default = true;
bind = "Return";
}
{
action = "remove";
bind = "ctrl d";
after = "AsyncClearReload";
}
{
action = "remove_all";
label = "clear";
bind = "ctrl shift d";
after = "AsyncClearReload";
}
{
action = "show_images_only";
label = "only images";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "show_text_only";
label = "only text";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "show_combined";
label = "show all";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "pause";
bind = "ctrl p";
}
{
action = "unpause";
bind = "ctrl p";
}
{
action = "edit";
bind = "ctrl o";
}
{
action = "localsend";
bind = "ctrl l";
}
];
bookmarks = [
{
action = "save";
bind = "Return";
after = "AsyncClearReload";
}
{
action = "open";
default = true;
bind = "Return";
}
{
action = "delete";
bind = "ctrl d";
after = "AsyncClearReload";
}
{
action = "change_category";
label = "Change category";
bind = "ctrl y";
after = "Nothing";
}
{
action = "change_browser";
label = "Change browser";
bind = "ctrl b";
after = "Nothing";
}
{
action = "import";
label = "Import";
bind = "ctrl i";
after = "AsyncClearReload";
}
{
action = "create";
bind = "ctrl a";
after = "AsyncClearReload";
}
{
action = "search";
bind = "ctrl a";
after = "AsyncClearReload";
}
];
};
};
};
};
home.file.".config/elephant/websearch.toml".text = ''
[[entries]]
name = "DuckDuckGo"
url = "https://duckduckgo.com/?q=%TERM%"
default = true
'';
}
-160
View File
@@ -1,160 +0,0 @@
{
home.file.".config/walker/themes/nixos/layout.xml".text = ''
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk" version="4.0"></requires>
<object class="GtkWindow" id="Window">
<style>
<class name="window"></class>
</style>
<property name="resizable">true</property>
<property name="title">Walker</property>
<child>
<object class="GtkBox" id="BoxWrapper">
<style>
<class name="box-wrapper"></class>
</style>
<property name="width-request">644</property>
<property name="overflow">hidden</property>
<property name="orientation">horizontal</property>
<property name="valign">center</property>
<property name="halign">center</property>
<child>
<object class="GtkBox" id="Box">
<style>
<class name="box"></class>
</style>
<property name="orientation">vertical</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
<property name="spacing">10</property>
<child>
<object class="GtkBox" id="SearchContainer">
<style>
<class name="search-container"></class>
</style>
<property name="overflow">hidden</property>
<property name="orientation">horizontal</property>
<property name="halign">fill</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
<child>
<object class="GtkEntry" id="Input">
<style>
<class name="input"></class>
</style>
<property name="halign">fill</property>
<property name="hexpand-set">true</property>
<property name="hexpand">true</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="ContentContainer">
<style>
<class name="content-container"></class>
</style>
<property name="orientation">horizontal</property>
<property name="spacing">10</property>
<property name="vexpand">true</property>
<property name="vexpand-set">true</property>
<child>
<object class="GtkLabel" id="ElephantHint">
<style>
<class name="elephant-hint"></class>
</style>
<property name="hexpand">true</property>
<property name="height-request">100</property>
<property name="label">Waiting for elephant...</property>
</object>
</child>
<child>
<object class="GtkLabel" id="Placeholder">
<style>
<class name="placeholder"></class>
</style>
<property name="label">No Results</property>
<property name="yalign">0.0</property>
<property name="hexpand">true</property>
</object>
</child>
<child>
<object class="GtkScrolledWindow" id="Scroll">
<style>
<class name="scroll"></class>
</style>
<property name="hexpand">true</property>
<property name="can_focus">false</property>
<property name="overlay-scrolling">true</property>
<property name="max-content-width">600</property>
<property name="max-content-height">300</property>
<property name="min-content-height">0</property>
<property name="propagate-natural-height">true</property>
<property name="propagate-natural-width">true</property>
<property name="hscrollbar-policy">automatic</property>
<property name="vscrollbar-policy">automatic</property>
<child>
<object class="GtkGridView" id="List">
<style>
<class name="list"></class>
</style>
<property name="max_columns">1</property>
<property name="can_focus">false</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="Preview">
<style>
<class name="preview"></class>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="Keybinds">
<property name="hexpand">true</property>
<property name="margin-top">10</property>
<style>
<class name="keybinds"></class>
</style>
<child>
<object class="GtkBox" id="GlobalKeybinds">
<property name="spacing">10</property>
<style>
<class name="global-keybinds"></class>
</style>
</object>
</child>
<child>
<object class="GtkBox" id="ItemKeybinds">
<property name="hexpand">true</property>
<property name="halign">end</property>
<property name="spacing">10</property>
<style>
<class name="item-keybinds"></class>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkLabel" id="Error">
<style>
<class name="error"></class>
</style>
<property name="xalign">0</property>
<property name="visible">false</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>
'';
}
-210
View File
@@ -1,210 +0,0 @@
{config, ...}: {
# themes."nixos".style = ''
# @define-color window_bg_color #1f1f28;
# @define-color accent_bg_color #54546d;
# @define-color theme_fg_color #f2ecbc;
# @define-color error_bg_color #C34043;
# @define-color error_fg_color #DCD7BA;
#
# * {
# all: unset;
# }
#
# popover {
# background: lighter(@window_bg_color);
# border: 1px solid darker(@accent_bg_color);
# border-radius: 18px;
# padding: 10px;
# }
#
# .normal-icons {
# -gtk-icon-size: 16px;
# }
#
# .large-icons {
# -gtk-icon-size: 32px;
# }
#
# scrollbar {
# opacity: 0;
# }
#
# .box-wrapper {
# box-shadow:
# 0 19px 38px rgba(0, 0, 0, 0.3),
# 0 15px 12px rgba(0, 0, 0, 0.22);
# background: @window_bg_color;
# padding: 20px;
# border-radius: 20px;
# border: 1px solid darker(@accent_bg_color);
# }
#
# .preview-box,
# .elephant-hint,
# .placeholder {
# color: @theme_fg_color;
# }
#
# .box {
# }
#
# .search-container {
# border-radius: 10px;
# }
#
# .input placeholder {
# opacity: 0.5;
# }
#
# .input selection {
# background: lighter(lighter(lighter(@window_bg_color)));
# }
#
# .input {
# caret-color: @theme_fg_color;
# background: lighter(@window_bg_color);
# padding: 10px;
# color: @theme_fg_color;
# }
#
# .input:focus,
# .input:active {
# }
#
# .content-container {
# }
#
# .placeholder {
# }
#
# .scroll {
# }
#
# .list {
# color: @theme_fg_color;
# }
#
# child {
# }
#
# .item-box {
# border-radius: 10px;
# padding: 10px;
# }
#
# .item-quick-activation {
# background: alpha(@accent_bg_color, 0.25);
# border-radius: 5px;
# padding: 10px;
# }
#
# /* child:hover .item-box, */
# child:selected .item-box {
# background: alpha(@accent_bg_color, 0.25);
# }
#
# .item-text-box {
# }
#
# .item-subtext {
# font-size: 12px;
# opacity: 0.5;
# }
#
# .providerlist .item-subtext {
# font-size: unset;
# opacity: 0.75;
# }
#
# .item-image-text {
# font-size: 28px;
# }
#
# .preview {
# border: 1px solid alpha(@accent_bg_color, 0.25);
# /* padding: 10px; */
# border-radius: 10px;
# color: @theme_fg_color;
# }
#
# .calc .item-text {
# font-size: 24px;
# }
#
# .calc .item-subtext {
# }
#
# .symbols .item-image {
# font-size: 24px;
# }
#
# .todo.done .item-text-box {
# opacity: 0.25;
# }
#
# .todo.urgent {
# font-size: 24px;
# }
#
# .todo.active {
# font-weight: bold;
# }
#
# .bluetooth.disconnected {
# opacity: 0.5;
# }
#
# .preview .large-icons {
# -gtk-icon-size: 64px;
# }
#
# .keybinds {
# padding-top: 10px;
# border-top: 1px solid lighter(@window_bg_color);
# font-size: 12px;
# color: @theme_fg_color;
# }
#
# .global-keybinds {
# }
#
# .item-keybinds {
# }
#
# .keybind {
# }
#
# .keybind-button {
# opacity: 0.5;
# }
#
# .keybind-button:hover {
# opacity: 0.75;
# cursor: pointer;
# }
#
# .keybind-bind {
# text-transform: lowercase;
# opacity: 0.35;
# }
#
# .keybind-label {
# padding: 2px 4px;
# border-radius: 4px;
# border: 1px solid @theme_fg_color;
# }
#
# .error {
# padding: 10px;
# background: @error_bg_color;
# color: @error_fg_color;
# }
#
# :not(.calc).current {
# font-style: italic;
# }
#
# .preview-content.archlinuxpkgs {
# font-family: monospace;
# } '';
}
-243
View File
@@ -1,243 +0,0 @@
{
config,
pkgs,
myConfig,
...
}: let
hakase-popup-launch = pkgs.writeShellScriptBin "hakase-popup-launch" ''
tui_name=$1
active_popup=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r '.[] | select(.class | startswith("org.hakase.")) | .class')
if [[ -z "''${tui_name}" ]]; then
echo "Usage: $(basename "$0") [tui-name]"
exit 1
fi
popup_checker() {
if [[ -z "$active_popup" ]]; then
echo "no_popup"
elif [[ "$active_popup" != "org.hakase.popup.''${tui_name}" ]]; then
echo "different"
else
echo "same"
fi
}
launch() {
exec ${pkgs.util-linux}/bin/setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase.popup."''${tui_name}" -e "''${tui_name}"
}
focus() {
exec ${pkgs.hyprland}/bin/hyprctl dispatch focuswindow "class:org.hakase.popup.''${tui_name}"
}
replace() {
${pkgs.hyprland}/bin/hyprctl dispatch closewindow "class:''${active_popup}"
sleep 1
launch
}
run() {
local status
status=$(popup_checker)
if [[ "$status" == "no_popup" ]]; then
launch
elif [[ "$status" == "same" ]]; then
focus
elif [[ "$status" == "different" ]]; then
replace
fi
}
run
'';
in {
wayland.windowManager.hyprland.settings = {
exec-once = [
"uwsm app -- waybar"
];
};
imports = [
./style.nix
];
home.packages = [
hakase-popup-launch
pkgs.jq
pkgs.socat
pkgs.util-linux
pkgs.bluetui
pkgs.impala
pkgs.wiremix
pkgs.pamixer
];
programs.waybar = {
enable = true;
settings = {
mainBar = {
reload_style_on_change = true;
layer = "top";
position = "top";
spacing = 0;
height = 26;
modules-left = ["custom/omarchy" "hyprland/workspaces" "hyprland/workspaces#special"];
modules-center = ["clock" "custom/update" "custom/screenrecording-indicator"];
modules-right = [
"group/tray-expander"
"bluetooth"
"network"
"pulseaudio"
"cpu"
"battery"
];
"hyprland/workspaces" = {
on-click = "activate";
show-special = false;
all-outputs = true;
format = "{icon}";
format-icons = {
"default" = "";
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
"7" = "7";
"8" = "8";
"9" = "9";
"10" = "0";
"active" = "󱓻";
};
persistent-workspaces = {
"1" = [];
"2" = [];
"3" = [];
"4" = [];
"5" = [];
};
};
"hyprland/workspaces#special" = {
on-click = "activate";
show-special = true;
special-visible-only = true;
all-outputs = true;
ignore-workspaces = ["1" "2" "3" "4" "5" "6" "7" "8" "9" "10"];
format = "{icon}";
format-icons = {
"special:youtube" = "󰗃";
"special:music" = "󰎆";
"special:steam" = "󰓓";
};
};
"custom/omarchy" = {
format = "";
on-click = "vicinae toggle"; # TODO: add fallback
on-click-right = "xdg-terminal-exec";
tooltip-format = "Omarchy Menu\n\nSuper + Alt + Space";
};
"cpu" = {
interval = 5;
format = "󰍛";
on-click = "hakase-focus-wrapper btop";
on-click-right = "xdg-terminal-exec";
};
"clock" = {
format = "{:%H:%M %a %b %d}";
format-alt = "{:L%d %B W%V %Y}";
tooltip = false;
on-click-right = "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select";
};
"network" = {
format-icons = ["󰤯" "󰤟" "󰤢" "󰤥" "󰤨"];
format = "{icon}";
format-wifi = "{icon}";
format-ethernet = "󰀂";
format-disconnected = "󰤮";
tooltip-format-wifi = "{essid} ({frequency} GHz)\n{bandwidthDownBytes} {bandwidthUpBytes}";
tooltip-format-ethernet = "{bandwidthDownBytes} {bandwidthUpBytes}";
tooltip-format-disconnected = "Disconnected";
interval = 3;
spacing = 1;
on-click = "hakase-popup-launch impala";
};
"battery" = {
format = "{capacity}% {icon}";
format-discharging = "{icon}";
format-charging = "{icon}";
format-plugged = "";
format-icons = {
charging = ["󰢜" "󰂆" "󰂇" "󰂈" "󰢝" "󰂉" "󰢞" "󰂊" "󰂋" "󰂅"];
default = ["󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"];
};
format-full = "󰂅";
tooltip-format-discharging = "{power:>1.0f}W {capacity}%";
tooltip-format-charging = "{power:>1.0f}W {capacity}%";
interval = 5;
on-click = "omarchy-menu power";
states = {
warning = 20;
critical = 10;
};
};
"bluetooth" = {
format = "";
format-disabled = "󰂲";
format-connected = "󰂱";
format-no-controller = "";
tooltip-format = "Devices connected: {num_connections}";
on-click = "hakase-popup-launch bluetui";
};
"pulseaudio" = {
format = "{icon}";
on-click = "hakase-popup-launch wiremix ";
on-click-right = "pamixer -t";
tooltip-format = "Playing at {volume}%";
scroll-step = 5;
format-muted = "";
format-icons = {
default = ["" "" ""];
};
};
"group/tray-expander" = {
orientation = "inherit";
drawer = {
transition-duration = 600;
children-class = "tray-group-item";
};
modules = ["custom/expand-icon" "tray"];
};
"custom/expand-icon" = {
format = "";
tooltip = false;
};
"custom/screenrecording-indicator" = {
on-click = "omarchy-cmd-screenrecord";
exec = "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh";
signal = 8;
return-type = "json";
};
"tray" = {
icon-size = 12;
spacing = 17;
};
};
};
};
}
-88
View File
@@ -1,88 +0,0 @@
{config, ...}: {
programs.waybar = {
style = ''
@import "matugen.css";
* {
background-color: @background;
color: @on_surface;
border: none;
border-radius: 0;
min-height: 0;
font-family: 'JetBrainsMono Nerd Font';
font-size: 12px;
}
.modules-left {
margin-left: 8px;
}
.modules-right {
margin-right: 8px;
}
#workspaces button {
all: initial;
padding: 0 6px;
margin: 0 1.5px;
min-width: 9px;
}
#workspaces button.empty {
opacity: 0.5;
}
#cpu,
#battery,
#pulseaudio,
#custom-omarchy,
#custom-screenrecording-indicator,
#custom-update {
min-width: 12px;
margin: 0 7.5px;
}
#tray {
margin-right: 16px;
}
#bluetooth {
margin-right: 17px;
}
#network {
margin-right: 13px;
}
#custom-expand-icon {
margin-right: 18px;
}
tooltip {
padding: 2px;
}
#custom-update {
font-size: 10px;
}
#clock {
margin-left: 8.75px;
}
.hidden {
opacity: 0;
}
#custom-screenrecording-indicator {
min-width: 12px;
margin-left: 8.75px;
font-size: 10px;
}
#custom-screenrecording-indicator.active {
color: @on_secondary;
}
'';
};
}
-14
View File
@@ -1,14 +0,0 @@
{pkgs, ...}: {
programs.yazi = {
enable = true;
enableFishIntegration = true;
settings = {
manager = {
show_hidden = true;
sort_by = "natural";
sort_dir_first = true;
linemode = "size";
};
};
};
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

-6
View File
@@ -1,6 +0,0 @@
██╗ ██╗ █████╗ ██╗ ██╗ █████╗ ███████╗███████╗
██║ ██║██╔══██╗██║ ██╔╝██╔══██╗██╔════╝██╔════╝
███████║███████║█████╔╝ ███████║███████╗█████╗
██╔══██║██╔══██║██╔═██╗ ██╔══██║╚════██║██╔══╝
██║ ██║██║ ██║██║ ██╗██║ ██║███████║███████╗
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝
Binary file not shown.

Before

Width:  |  Height:  |  Size: 476 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 826 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

+79 -42
View File
@@ -1,51 +1,88 @@
{
myConfig = {
macos = {
Username = "lsoriano";
};
essentials = {
# !!! replace it with your own, else system might malfunction.
Username = "kenji";
};
general = {
Terminal = {
font = "JetBrainsMono Nerd Font";
size = "18";
shell = "fish"; # or zsh
aliases = {};
};
allowUnfree = true;
};
nixos = {
username = "kenji";
hostname = "hakase";
timezone = "America/Chicago";
};
git = {
username = "kenji";
email = "kenji@hakase";
defaultBranch = "master";
};
terminal = {
default = "ghostty";
aliases = {
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase";
Hostname = "hakase";
Timezone = "America/Chicago";
enableSteamOS = false;
Boot = {
mode = "systemd"; # systemd or grub
};
Apps = {
packages = pkgs:
with pkgs; [
adwaita-icon-theme
jellyfin-media-player
delfin
goverlay
geekbench_6
gparted
ntfs3g
feishin
discord
xfce.thunar
];
};
Hyprland = {
monitors = [
# "DP-2, highres@165,0x1080,1,vrr,1"
# "DP-2, highres@180,0x1080,1,cm,hdr, sdrbrightness, 1.5, sdrsaturation, 0.98"
"DP-2, highres@180,0x1080,1,bitdepth,10,cm,hdr,sdrbrightness,1.4,sdrsaturation,0.98"
"DP-1, highres@highrr,760x0,1"
"HDMI-A-1, 1920x1080@120, 20000x20000,1"
# "HDMI-A-1, disabled"
];
};
Git = {
user = "kenji";
email = "kenji@hakase";
defaultBranch = "master";
};
};
hyprland = {
monitors = [
"DP-1,highres@180,0x1080,1,bitdepth,10,cm,hdr,sdrbrightness,1.4,sdrsaturation,0.98,vrr,0"
"DP-2, highres@165,760x0,1"
"HDMI-A-1, highres@highrr@120, 3440x1440, 1.6"
];
optionals = {
Builds = {
trustedUsers = [
"@groups"
];
buildMachines = [
{
hostName = "";
sshUser = "";
sshKey = "";
system = "";
supportedFeatures = ["apple-virt" "big-parallel" "kvm" "nixos-test"];
}
];
};
Ssh = {
extraConfig = ''
Host macair
User biscuit
HostName 192.168.68.81
wallpaper = "firewatch.png";
};
firefox = {
bookmarks = [
{
name = "Home Manager";
url = "https://mynixos.com/home-manager/options/programs";
}
{
name = "YouTube";
url = "https://youtube.com";
}
{
name = "Nur";
url = "https://nur.nix-community.org/repos";
}
];
newtabpage = [
{
title = "Dashboard";
url = "https://dash.sakamoto.dev";
}
];
Host gitea.sakamoto.dev
User kenji
ProxyCommand cloudflared access ssh --hostname %h
HostName gitea.sakamoto.dev
'';
};
};
};
}
Generated
+1596 -375
View File
File diff suppressed because it is too large Load Diff
+96 -38
View File
@@ -1,56 +1,56 @@
{
description = "Hakase Configuration";
description = "A rewrite of the original Sakamoto NixOS config.";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
elephant = {
url = "github:abenz1267/elephant";
flake-utils.url = "github:numtide/flake-utils";
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
jovian = {
url = "github:Jovian-Experiments/Jovian-NixOS";
inputs.nixpkgs.follows = "nixpkgs";
};
chaotic = {
url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
inputs.nixpkgs.follows = "nixpkgs";
};
textfox = {
url = "github:adriankarlen/textfox";
inputs.nixpkgs.follows = "nixpkgs";
};
nur = {
url = "github:nix-community/NUR";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = {
url = "github:nix-community/home-manager";
matugen = {
url = "github:/InioX/Matugen";
inputs.nixpkgs.follows = "nixpkgs";
# ref = "refs/tags/matugen-v0.10.0";
};
erosanix = {
url = "github:emmanuelrosa/erosanix";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland = {
url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprsplit = {
url = "github:shezdy/hyprsplit";
inputs.hyprland.follows = "hyprland";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland-plugins = {
url = "github:hyprwm/hyprland-plugins";
inputs.hyprland.follows = "hyprland";
darwin = {
url = "github:lnl7/nix-darwin";
inputs.nixpkgs.follows = "nixpkgs";
};
nixovim = {
# FIXME: treesitter does not install automatically (disabled due to read-only problems)
url = "git+https://git.sakamoto.dev/kenji/nixovim.git";
inputs.nixpkgs.follows = "nixpkgs";
};
sops-nix = {
url = "github:Mic92/sops-nix";
illogical-impulse = {
url = "git+https://git.sakamoto.dev/kenji/illogical-impulse.git";
inputs.nixpkgs.follows = "nixpkgs";
};
walker = {
url = "github:abenz1267/walker";
inputs.nixpkgs.follows = "nixpkgs";
inputs.elephant.follows = "elephant";
};
vicinae = {
url = "github:vicinaehq/vicinae";
omarchy-nix = {
url = "git+https://git.sakamoto.dev/kenji/omarchy-nix.git";
inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager";
};
};
@@ -58,10 +58,13 @@
self,
nixpkgs,
home-manager,
nixovim,
darwin,
chaotic,
sops-nix,
textfox,
jovian,
nixovim,
illogical-impulse,
erosanix,
omarchy-nix,
...
} @ inputs: let
config = import ./config.nix;
@@ -76,12 +79,67 @@
hakase = nixpkgs.lib.nixosSystem {
specialArgs = args;
modules = [
home-manager.nixosModules.home-manager
sops-nix.nixosModules.sops
chaotic.nixosModules.default
home-manager.nixosModules.home-manager
jovian.nixosModules.default
erosanix.nixosModules.protonvpn
./hosts/hakase/configuration.nix
];
};
hakase-omarchy = nixpkgs.lib.nixosSystem {
specialArgs = args;
modules = [
chaotic.nixosModules.default
omarchy-nix.nixosModules.default
home-manager.nixosModules.home-manager
./hosts/hakase-omarchy/configuration.nix
];
};
vanilla = nixpkgs.lib.nixosSystem {
specialArgs = args;
modules = [
./hosts/vanilla/configuration.nix
# nixovim.packages.${system}.full
];
};
};
homeConfigurations = {
hakase = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs {
config.allowUnfree = true;
extraSpecialArgs = args;
};
modules = [
home-manager.nixosModules.home-manager
./home/hakase.nix
];
};
hakase-omarchy = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs {
config.allowUnfree = true;
extraSpecialArgs = args;
};
modules = [
home-manager.nixosModules.home-manager
./home/hakase-omarchy.nix
];
};
};
darwinConfigurations = {
macos = darwin.lib.darwinSystem {
system = "aarch64-darwin";
specialArgs =
{
inherit inputs;
system = "aarch64-darwin";
}
// config;
modules = [
home-manager.darwinModules.home-manager
./hosts/macos/darwin.nix
];
};
};
};
}
+15
View File
@@ -0,0 +1,15 @@
{
config,
pkgs,
inputs,
...
}: {
imports = [
../modules/home/terminal.nix
];
programs.home-manager.enable = true;
home.packages = [];
home.stateVersion = "25.11";
}
+15
View File
@@ -0,0 +1,15 @@
{
config,
pkgs,
inputs,
...
}: {
imports = [
# ... your other imports
inputs.omarchy-nix.homeManagerModules.default # Assuming you have a system module too
];
# ADD THIS BLOCK
home.stateVersion = "25.05";
}
+7 -15
View File
@@ -1,25 +1,17 @@
{
pkgs,
inputs,
config,
...
}: {
}: let
info = import ../config.nix;
in {
imports = [
# inputs.chaotic.homeManagerModules.default
../modules/home/desktop.nix
../modules/home/terminal.nix
../modules/home/apps.nix
../modules/home/apps-optional.nix
../modules/home/hyprland.nix
../modules/home/waybar.nix
../modules/home/theme.nix
../modules/home/gaming.nix
../modules/home/music.nix
inputs.walker.homeManagerModules.default
inputs.sops-nix.homeManagerModules.sops
inputs.vicinae.homeManagerModules.default
];
home.sessionVariables = {
};
# nix.package = pkgs.nix;
home.packages = info.myConfig.nixos.Apps.packages pkgs;
home.stateVersion = "25.05";
}
+156
View File
@@ -0,0 +1,156 @@
{
pkgs,
myConfig,
specialArgs,
...
}: {
imports = [
../../modules/default/boot.nix
./hardware-configuration.nix
];
system.stateVersion = "25.05";
i18n.defaultLocale = "en_US.UTF-8";
time.timeZone = "${myConfig.nixos.Timezone}";
nixpkgs.config.allowUnfree = myConfig.general.allowUnfree;
console = {
earlySetup = false;
font = "${pkgs.terminus_font}/share/consolefonts/ter-132n.psf.gz";
packages = with pkgs; [terminus_font];
useXkbConfig = true;
};
users = {
# defaultUserShell = pkgs.${myConfig.general.Terminal.shell};
users = {
${myConfig.essentials.Username} = {
isNormalUser = true;
extraGroups = ["wheel" "networkmanager" "input" "video"];
initialHashedPassword = "$y$j9T$NHFtSwF4NJtEmgMjy4Xdg.$9WQltjEx3eEfZ7GbpGLW8lBhJtiXPOeIawrxdmx0.vB";
useDefaultShell = true;
packages = [];
};
};
};
omarchy = {
full_name = "${myConfig.essentials.Username}"; # Or variable
email_address = "${myConfig.nixos.Git.email}";
};
home-manager = {
backupFileExtension = "backup";
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = specialArgs;
users.${myConfig.essentials.Username} = import ../../home/hakase-omarchy.nix;
};
networking = {
useDHCP = false;
wireless = {
enable = false;
};
networkmanager.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [22 80 531];
allowedUDPPorts = [53 531 5353];
};
proxy = {
default = null;
noProxy = null;
};
};
systemd = {
# network.enable = true;
# extraConfig = "DefaultTimeoutStopSec=5s";
};
nix = {
settings = {
experimental-features = ["nix-command" "flakes"];
};
};
#
# hardware = {
# enableAllFirmware = true;
# logitech.wireless.enable = true;
#
# bluetooth = {
# enable = true;
# powerOnBoot = true;
# settings = {
# General = {
# # AutoEnable = true;
# Experimental = true;
# MultiProfile = "multiple";
# FastConnectable = true;
# # ControllerMode = "bredr";
# };
# Policy = {
# AutoEnable = true;
# };
# };
# };
#
# graphics = {
# enable = true;
# enable32Bit = true;
# };
#
# xone.enable = true;
# };
#
# security.rtkit.enable = true;
# programs = {
# bash.interactiveShellInit = ''
# if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]; then
# shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
# exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
# fi
# '';
# zsh.enable = true;
# fish.enable = true;
#
# appimage = {
# enable = true;
# binfmt = true;
# };
#
# ssh.extraConfig = myConfig.optionals.Ssh.extraConfig;
# };
# jovian.steamos.enableMesaPatches = true;
#
# services = {
# displayManager.sessionPackages = [
# inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland
# ];
#
# getty.autologinUser = lib.mkOverride 10 "${myConfig.essentials.Username}";
#
# flatpak.enable = true;
# seatd.enable = true;
# upower.enable = true;
# scx.enable = true;
# libinput.enable = true;
# blueman.enable = true;
# printing.enable = true;
# openssh.enable = true;
#
# pipewire = {
# enable = true;
# alsa = {
# enable = true;
# support32Bit = true;
# };
# pulse.enable = true;
# };
# };
}
@@ -0,0 +1,33 @@
# 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 = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/mapper/luks-9091013c-0763-40a6-8316-d44d52df3530";
fsType = "ext4";
};
boot.initrd.luks.devices."luks-9091013c-0763-40a6-8316-d44d52df3530".device = "/dev/disk/by-uuid/9091013c-0763-40a6-8316-d44d52df3530";
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/B332-BF84";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
swapDevices = [ ];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
+168 -6
View File
@@ -1,12 +1,174 @@
{
pkgs,
myConfig,
inputs,
lib,
specialArgs,
...
}: {
imports = [
./hardware-configuration.nix
../../modules/nixos/default.nix
../../modules/nixos/hyprland.nix
../../modules/nixos/gaming.nix
];
imports =
[
./hardware-configuration.nix
../../modules/default/apps.nix
../../modules/default/desktop.nix
../../modules/default/remote.nix
../../modules/default/gaming.nix
../../modules/default/udev.nix
../../modules/default/boot.nix
../../modules/default/dev.nix
../../modules/default/security.nix
]
++ lib.optionals (myConfig.nixos.enableSteamOS == false) [
../../modules/default/login.nix
];
system.stateVersion = "25.05";
i18n.defaultLocale = "en_US.UTF-8";
time.timeZone = "${myConfig.nixos.Timezone}";
console = {
earlySetup = false;
font = "${pkgs.terminus_font}/share/consolefonts/ter-132n.psf.gz";
packages = with pkgs; [terminus_font];
useXkbConfig = true;
};
users = {
defaultUserShell = pkgs.${myConfig.general.Terminal.shell};
users = {
${myConfig.essentials.Username} = {
isNormalUser = true;
extraGroups = ["wheel" "networkmanager" "input" "video"];
initialHashedPassword = "$y$j9T$NHFtSwF4NJtEmgMjy4Xdg.$9WQltjEx3eEfZ7GbpGLW8lBhJtiXPOeIawrxdmx0.vB";
useDefaultShell = true;
packages = [];
};
};
};
home-manager = {
backupFileExtension = "backup";
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = specialArgs;
users.${myConfig.essentials.Username} = import ../../home/hakase.nix;
};
nixpkgs.config.allowUnfree = myConfig.general.allowUnfree;
nix = {
distributedBuilds = true;
settings = {
builders-use-substitutes = true;
trusted-users = myConfig.optionals.Builds.trustedUsers;
experimental-features = ["nix-command" "flakes"];
};
};
hardware = {
enableAllFirmware = true;
logitech.wireless.enable = true;
bluetooth = {
enable = true;
powerOnBoot = true;
settings = {
General = {
Enable = "Source,Sink,Media,Socket";
# AutoEnable = true;
Experimental = true;
MultiProfile = "multiple";
FastConnectable = true;
# ControllerMode = "bredr";
};
Policy = {
AutoEnable = true;
};
};
};
graphics = {
enable = true;
enable32Bit = true;
};
xone.enable = true;
};
networking = {
useDHCP = false;
wireless = {
enable = false;
};
networkmanager.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [22 80];
allowedUDPPorts = [53];
};
proxy = {
default = null;
noProxy = null;
};
};
systemd = {
# network.enable = true;
# extraConfig = "DefaultTimeoutStopSec=5s";
};
security.rtkit.enable = true;
programs = {
bash.interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]; then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
'';
zsh.enable = true;
fish.enable = true;
appimage = {
enable = true;
binfmt = true;
};
ssh.extraConfig = myConfig.optionals.Ssh.extraConfig;
};
# jovian.steamos.enableMesaPatches = true;
services = {
displayManager.sessionPackages = [
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland
];
getty.autologinUser = lib.mkOverride 10 "${myConfig.essentials.Username}";
flatpak.enable = true;
seatd.enable = true;
upower.enable = true;
scx.enable = true;
libinput.enable = true;
blueman.enable = true;
printing.enable = true;
openssh.enable = true;
pipewire = {
enable = true;
alsa = {
enable = true;
support32Bit = true;
};
pulse.enable = true;
};
avahi = {
enable = true;
nssmdns4 = true;
openFirewall = true;
};
};
}
+34
View File
@@ -0,0 +1,34 @@
{
pkgs,
myConfig,
inputs,
system,
specialArgs,
...
}: {
imports = [
../../modules/default/darwin.nix
];
environment.systemPackages = [];
nix.settings.experimental-features = "nix-command flakes";
# nix.settings.trusted-users = myConfig.optionals.Builds.trustedUsers;
programs.zsh.enable = true; # default shell on catalina
programs.fish.enable = true;
system.stateVersion = 5;
nixpkgs.hostPlatform = "aarch64-darwin";
security.pam.services.sudo_local.touchIdAuth = true;
users.users.${myConfig.macos.Username} = {
name = "${myConfig.macos.Username}";
home = "/Users/${myConfig.macos.Username}";
};
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = specialArgs;
home-manager.users.${myConfig.macos.Username} = import ../../home/darwin.nix;
}
+133
View File
@@ -0,0 +1,133 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page, on
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
{
config,
lib,
pkgs,
myConfig,
inputs,
...
}: {
imports = [
# Include the results of the hardware scan.
./hardware-configuration.nix
];
# Use the systemd-boot EFI boot loader.
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
# networking.hostName = "nixos"; # Define your hostname.
# Pick only one of the below networking options.
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
# Set your time zone.
time.timeZone = "${myConfig.nixos.Timezone}";
# Configure network proxy if necessary
# networking.proxy.default = "http://user:password@proxy:port/";
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
console = {
earlySetup = false;
font = "${pkgs.terminus_font}/share/consolefonts/ter-132n.psf.gz";
packages = with pkgs; [terminus_font];
useXkbConfig = true;
};
# Enable the X11 windowing system.
# services.xserver.enable = true;
# Configure keymap in X11
# services.xserver.xkb.layout = "us";
# services.xserver.xkb.options = "eurosign:e,caps:escape";
# Enable CUPS to print documents.
# services.printing.enable = true;
# Enable sound.
# services.pulseaudio.enable = true;
# OR
services.pipewire = {
enable = true;
pulse.enable = true;
};
hardware.bluetooth.enable = true;
services = {
blueman.enable = true;
};
# Enable touchpad support (enabled default in most desktopManager).
# services.libinput.enable = true;
# Define a user account. Don't forget to set a password with passwd.
users.users.${myConfig.essentials.Username} = {
isNormalUser = true;
extraGroups = ["wheel"]; # Enable sudo for the user.
packages = with pkgs; [
tree
];
};
# programs.firefox.enable = true;
# List packages installed in system profile.
# You can use https://search.nixos.org/ to find more packages (and options).
environment.systemPackages = with pkgs; [
inputs.nixovim.packages.${system}.full
# linux-firmware
vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
wget
];
hardware.firmware = [
pkgs.linux-firmware
];
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# List services that you want to enable:
# Enable the OpenSSH daemon.
services.openssh.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# Copy the NixOS configuration file and link it from the resulting system
# (/run/current-system/configuration.nix). This is useful in case you
# accidentally delete configuration.nix.
# system.copySystemConfiguration = true;
# This option defines the first version of NixOS you have installed on this particular machine,
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
#
# Most users should NEVER change this value after the initial install, for any reason,
# even if you've upgraded your system to a new NixOS release.
#
# This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
# so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how
# to actually do that.
#
# This value being lower than the current NixOS release does NOT mean your system is
# out of date, out of support, or vulnerable.
#
# Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
# and migrated your data accordingly.
#
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
system.stateVersion = "25.11"; # Did you read the comment?
}
+47
View File
@@ -0,0 +1,47 @@
# 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 = [ "nvme" "xhci_pci" "ahci" "usbhid" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/9f701bae-3392-4927-b27d-a905dd67edab";
fsType = "btrfs";
options = [ "subvol=@" ];
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/894C-F998";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
fileSystems."/home" =
{ device = "/dev/disk/by-uuid/780aa81f-c4d6-478b-9c51-2d60362fdb07";
fsType = "ext4";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/b02ef55c-4caf-4a24-a6a2-fb8001eafe22"; }
];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.enp11s0.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp10s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
+28
View File
@@ -0,0 +1,28 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
usbutils
pciutils
pavucontrol
wget
dualsensectl
protontricks
wl-clipboard
tldr
anki
lact
lm_sensors
grim
];
imports = [
../../packages/virtualbox/default.nix
# ../../packages/lact/default.nix
];
hardware.amdgpu.overdrive.enable = true;
services.lact.enable = true;
# services = {
# protonvpn = {
# enable = true;
# autostart = true;
# };
# };
}
+68
View File
@@ -0,0 +1,68 @@
{
myConfig,
lib,
pkgs,
...
}: {
boot = {
loader = {
timeout = 0;
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot";
};
limine = lib.mkIf (myConfig.nixos.Boot.mode == "limine") {
enable = true;
maxGenerations = 5;
};
systemd-boot = lib.mkIf (myConfig.nixos.Boot.mode == "systemd") {
enable = true;
# xbootldrMountPoint = "/boot";
edk2-uefi-shell.enable = true;
edk2-uefi-shell.sortKey = "z_edk2";
};
# grub ain't that great for advanced setups such as using a secure boot.
grub = lib.mkIf (myConfig.nixos.Boot.mode == "grub") {
enable = true;
efiSupport = true;
device = "nodev";
useOSProber = true;
};
};
plymouth = {
enable = false;
theme = "seal";
themePackages = with pkgs; [
(adi1090x-plymouth-themes.override {
selected_themes = ["seal"];
})
];
};
# blacklistedKernelModules = ["tpm_crb" "tpm_tis" "tpm"];
kernelPackages = pkgs.linuxPackages_cachyos;
kernelParams = [
# "quiet"
# "splash"
"boot.shell_on_fail"
"udev.log_priority=3"
"rd.systemd.show_status=auto"
"kvm.enable_virt_at_load=0"
];
initrd = {
systemd.enable = true;
kernelModules = [];
verbose = false;
};
consoleLogLevel = 0;
};
hardware.amdgpu.initrd.enable = true;
}
+5
View File
@@ -0,0 +1,5 @@
{
imports = [
../../packages/python/default.nix
];
}
+12
View File
@@ -0,0 +1,12 @@
{
lib,
myConfig,
pkgs,
...
}: {
imports = [
# ../../packages/quickshell/default.nix
../../packages/hyprland/default.nix
../../packages/sunshine/default.nix
];
}
+8
View File
@@ -0,0 +1,8 @@
{pkgs, ...}: {
imports = [
../../packages/python/default.nix
];
environment.systemPackages = with pkgs; [
p7zip
];
}
+14
View File
@@ -0,0 +1,14 @@
{
lib,
myConfig,
...
}: {
imports =
[
../../packages/steam/default.nix
]
++ lib.optionals (myConfig.nixos.enableSteamOS == true)
[
../../packages/steam/jovian.nix
];
}
+27
View File
@@ -0,0 +1,27 @@
# file: configuration.nix
{
pkgs,
lib,
...
}: let
sources = import ./nix/sources.nix;
lanzaboote = import sources.lanzaboote;
in {
imports = [lanzaboote.nixosModules.lanzaboote];
environment.systemPackages = [
# For debugging and troubleshooting Secure Boot.
pkgs.sbctl
];
# Lanzaboote currently replaces the systemd-boot module.
# This setting is usually set to true in configuration.nix
# generated at installation time. So we force it to false
# for now.
boot.loader.systemd-boot.enable = lib.mkForce false;
boot.lanzaboote = {
enable = true;
pkiBundle = "/var/lib/sbctl";
};
}
+13
View File
@@ -0,0 +1,13 @@
{
lib,
myConfig,
...
}: {
services.greetd = {
enable = true;
settings.default_session = {
user = lib.mkOverride 10 "${myConfig.essentials.Username}";
command = lib.mkOverride 10 "Hyprland";
};
};
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
# ../../packages/moondeck-buddy/appimage.nix
../../packages/sunshine/default.nix
];
}
+9
View File
@@ -0,0 +1,9 @@
{pkgs, ...}: {
imports = [
# ./lanzaboote.nix
];
environment.systemPackages = with pkgs; [
niv
sbctl
];
}
+9
View File
@@ -0,0 +1,9 @@
{pkgs, ...}: {
# services.udev.extraRules = ''
# SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", ATTR{idProduct}=="0616", ATTR{power/wakeup}="enabled"
#
# '';
services.udev.packages = with pkgs; [
game-devices-udev-rules
];
}
-9
View File
@@ -1,9 +0,0 @@
{
imports = [
../../apps/btop
../../apps/jellyfin
../../apps/tickrs
../../apps/claude
../../apps/delfin
];
}
+16 -8
View File
@@ -1,11 +1,19 @@
{
{pkgs, ...}: {
imports = [
../../apps/yazi
../../apps/gemini
../../apps/firefox
../../apps/loupe
../../apps/mpv
../../apps/mako
# ../../apps/starship
../../packages/firefox/home.nix
];
home.packages = with pkgs; [
heroic
# fcitx5
# fcitx5-mozc-ut
# kdePackages.fcitx5-configtool
solaar
parted
edk2-uefi-shell
libreoffice
];
services.easyeffects = {
enable = true;
};
}
+28
View File
@@ -0,0 +1,28 @@
{
inputs,
pkgs,
lib,
...
}: {
imports = [
inputs.illogical-impulse.homeManagerModules.default
../../packages/fonts/home.nix
];
programs.illogical-impulse.enable = true;
programs.illogical-impulse.settings = {
hyprland.useNixForConf = false;
simpleStarship.enable = true;
};
# wayland.windowManager.hyprland = {
# settings = {
# monitor = lib.mkForce [
# "DP-1, highres@180,0x1080,1,bitdepth,10,cm,hdr,sdrbrightness,1.4,sdrsaturation,0.98"
# "DP-2, highres@highrr,760x0,1"
# ];
# };
# };
# programs.illogical-impulse.settings.simpleStarship.enable = true;
home.packages = [
];
}
-48
View File
@@ -1,48 +0,0 @@
{pkgs, ...}: {
home.packages = with pkgs; [
protonup-qt
protontricks
mangohud
];
programs.mangohud = {
enable = true;
settings = {
full = true;
no_display = true; # Don't show by default (toggle with Shift+F12)
cpu_temp = true;
gpu_temp = true;
ram = true;
vram = true;
};
};
wayland.windowManager.hyprland.settings = {
exec-once = [
"[workspace special:steam silent] uwsm app -- steam"
];
bindd = [
"SUPER, T, Toggle Steam, togglespecialworkspace, steam"
"SUPER SHIFT, T, Move to Steam Special Workspace, movetoworkspace, special:steam"
];
windowrulev2 = [
# --- STEAM RULES ---
"workspace special:steam silent, class:^(steam)$"
"noinitialfocus, class:^(steam)$"
"suppressevent activate, class:^(steam)$"
# --- GAMING RULES ---
"fullscreen, class:^steam_app_\d+$"
"monitor 0, class:^steam_app_\d+$"
"workspace 1, class:^steam_app_\d+$"
"fullscreen, class:^(gamescope)$"
"fullscreen, class:^(lutris)$"
"fullscreen, class:^(heroic)$"
"fullscreen, class:^wine-.*$"
"fullscreen, title:^Wine .*$"
];
};
}
-15
View File
@@ -1,15 +0,0 @@
{
imports = [
../../apps/hyprland
../../apps/hypridle
../../apps/hyprlock
../../apps/hyprpaper
../../apps/screenshot
../../apps/vicinae
../../apps/tte
../../apps/swayosd
../../apps/playerctl
../../apps/fcitx5
];
}
-55
View File
@@ -1,55 +0,0 @@
{pkgs, ...}: let
launch-music = pkgs.writeShellScriptBin "hakase-music-launch" ''
echo "--- Launching Music Apps ---"
echo "Launching jellyfin-tui..."
uwsm app -- /usr/bin/env ghostty --class=jellyfin-tui --title=jellyfin-tui -e jellyfin-tui &
PID_JELLY=$!
echo "Jellyfin launched with PID $PID_JELLY"
echo "Waiting for window..."
sleep 0.1
echo "Focusing jellyfin-tui..."
hyprctl dispatch focuswindow title:jellyfin-tui
echo "Preselecting down..."
hyprctl dispatch layoutmsg preselect d
echo "Launching cava..."
uwsm app -- /usr/bin/env ghostty --class=cava --title=cava -e cava &
PID_CAVA=$!
echo "Cava launched with PID $PID_CAVA"
echo "Launch script completed."
'';
in {
imports = [
# TODO: must be an option a user can set of which music player to use
../../apps/jellyfin-tui
../../apps/cava
];
home.packages = [
launch-music
];
wayland.windowManager.hyprland.settings = {
workspace = [
"special:music, on-created-empty:hakase-music-launch"
];
bindd = [
"SUPER, M, Toggle Music, togglespecialworkspace, music"
"SUPER SHIFT, M, Move to Music Special Workspace, movetoworkspace, special:music"
];
windowrulev2 = [
# --- MUSIC RULES (Jellyfin-TUI) ---
"workspace special:music silent, title:^(jellyfin-tui)$"
"workspace special:music silent, initialTitle:^(jellyfin-tui)$"
# --- CAVA RULES ---
"workspace special:music silent, title:^(cava)$"
"workspace special:music silent, initialTitle:^(cava)$"
];
};
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
# ../../packages/moondeck-buddy/appimage.nix
../../packages/sunshine/default.nix
];
}

Some files were not shown because too many files have changed in this diff Show More