mirror of
https://github.com/anotherhadi/nixy.git
synced 2026-05-20 13:22:34 +02:00
Compare commits
11 Commits
v5.0.0
...
f9d5c6ab00
| Author | SHA1 | Date | |
|---|---|---|---|
| f9d5c6ab00 | |||
| b51a78ac1c | |||
| 96b5d5e671 | |||
| a222958eea | |||
| c3f86c9831 | |||
| dc5c7dc915 | |||
| 3cbe2a1ab2 | |||
| a1ed4ebc4c | |||
| 80aa828ee5 | |||
| 28cdcb6dad | |||
| e620c5296f |
@@ -65,6 +65,21 @@
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
h-work = nixpkgs.lib.nixosSystem {
|
||||||
|
modules = [
|
||||||
|
{
|
||||||
|
nixpkgs.overlays = [];
|
||||||
|
_module.args = {
|
||||||
|
inherit inputs;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
inputs.home-manager.nixosModules.home-manager
|
||||||
|
inputs.stylix.nixosModules.stylix
|
||||||
|
inputs.nix-index-database.nixosModules.default
|
||||||
|
./hosts/work/configuration.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
# Jack is my server
|
# Jack is my server
|
||||||
jack = nixpkgs.lib.nixosSystem {
|
jack = nixpkgs.lib.nixosSystem {
|
||||||
modules = [
|
modules = [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
pkgs-stable,
|
pkgs-stable,
|
||||||
inputs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
home.packages = with pkgs-stable; [
|
home.packages = with pkgs-stable; [
|
||||||
@@ -8,12 +8,23 @@
|
|||||||
nmap
|
nmap
|
||||||
john
|
john
|
||||||
hashcat
|
hashcat
|
||||||
|
metasploit
|
||||||
|
haiti
|
||||||
|
hydra
|
||||||
|
dnsrecon
|
||||||
|
whois
|
||||||
|
dig
|
||||||
|
nosqli
|
||||||
|
jwt-cli
|
||||||
|
nuclei
|
||||||
|
|
||||||
# Web
|
# Web
|
||||||
caido
|
caido
|
||||||
nuclei
|
nuclei
|
||||||
gobuster
|
gobuster
|
||||||
dirb
|
dirb
|
||||||
|
ffuf
|
||||||
|
sqlmap
|
||||||
|
|
||||||
# Utils
|
# Utils
|
||||||
inetutils
|
inetutils
|
||||||
@@ -22,4 +33,45 @@
|
|||||||
mariadb
|
mariadb
|
||||||
redis
|
redis
|
||||||
];
|
];
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"d %h/Cyber/tmp 0755 - - -"
|
||||||
|
"d %h/Cyber/wordlists 0755 - - -"
|
||||||
|
"d %h/Cyber/wordlists/rules 0755 - - -"
|
||||||
|
];
|
||||||
|
|
||||||
|
home.file = {
|
||||||
|
"Cyber/wordlists/seclists" = {
|
||||||
|
source = pkgs.fetchFromGitHub {
|
||||||
|
owner = "danielmiessler";
|
||||||
|
repo = "SecLists";
|
||||||
|
rev = "47aa98053fce8670c6489e4f6fb57dc34881d8bd";
|
||||||
|
hash = "sha256-ojXLB/TXap1Qi0MtV5/WJlJpjNIDYx/sLY2KHm0uFKI=";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"Cyber/wordlists/fuzz4bounty" = {
|
||||||
|
source = pkgs.fetchFromGitHub {
|
||||||
|
owner = "0xPugal";
|
||||||
|
repo = "fuzz4bounty";
|
||||||
|
rev = "a805f6b434033f054312da0ddc2bc3021cc9a3b0";
|
||||||
|
hash = "sha256-wMhx1CcxIyw2E7gJXQxXAFc7m5nYt0FXNkoTZqFMQh4=";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# RULES
|
||||||
|
"Cyber/wordlists/rules/oneruletorulethemstill".source = pkgs.fetchFromGitHub {
|
||||||
|
owner = "stealthsploit";
|
||||||
|
repo = "oneruletorulethemstill";
|
||||||
|
rev = "4bfb7322e189305b5f35bb7fcd4e9cc233c3d3c6";
|
||||||
|
hash = "sha256-h7MeymIXS/6wlPRt4lzsIEqOOssP0lDx9nQip65cwZw=";
|
||||||
|
};
|
||||||
|
|
||||||
|
"Cyber/wordlists/rules/best64.rule" = {
|
||||||
|
source = pkgs.fetchurl {
|
||||||
|
url = "https://raw.githubusercontent.com/CarlosLannister/OwadeReborn/refs/heads/master/owade/fileAnalyze/hashcatLib/best64.rule%7E";
|
||||||
|
hash = "sha256-T0XkMHJZQiy63/j25nGTkaiDFjc+blmgEVGTAFgVylU=";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,466 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
bookmarkList = [
|
|
||||||
{
|
|
||||||
name = "Proton Mail";
|
|
||||||
url = "https://mail.proton.me";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Proton Drive";
|
|
||||||
url = "https://drive.proton.me";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Proton Lumo";
|
|
||||||
url = "https://lumo.proton.me";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Proton Calendar";
|
|
||||||
url = "https://calendar.proton.me";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Tools";
|
|
||||||
bookmarks = [
|
|
||||||
{
|
|
||||||
name = "tldr";
|
|
||||||
url = "https://tldr.inbrowser.app/";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Excalidraw";
|
|
||||||
url = "https://excalidraw.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Cobalt (downloader)";
|
|
||||||
url = "https://cobalt.meowing.de";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Mazanoke (image)";
|
|
||||||
url = "https://mazanoke.hadi.icu";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Stirling PDF";
|
|
||||||
url = "https://pdf.hadi.icu";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Vert";
|
|
||||||
url = "https://vert.sh";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Markdown to PDF";
|
|
||||||
url = "https://md2file.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Image to Vector";
|
|
||||||
url = "https://www.vectorcascade.com/";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "PrivateBin";
|
|
||||||
url = "https://privatebin.net";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Social";
|
|
||||||
bookmarks = [
|
|
||||||
{
|
|
||||||
name = "Bluesky";
|
|
||||||
url = "https://bsky.app";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Reddit";
|
|
||||||
url = "https://reddit.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Youtube";
|
|
||||||
url = "https://youtube.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Instagram";
|
|
||||||
url = "https://instagram.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Github";
|
|
||||||
url = "https://github.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Discord";
|
|
||||||
url = "https://discord.com/channels/@me/";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Other";
|
|
||||||
bookmarks = [
|
|
||||||
{
|
|
||||||
name = "Startpage Config";
|
|
||||||
url = "https://www.startpage.com/do/mypage.pl?prfe=45d331deb05471d659dba933e7400df51d952bb103da6f6125c0e769a6be1d65610456a479f495ceeee7e97311cf227d7c1bb198de0ceeb193d8cddf9c455c19a409cc35c3e3f542ee27bd7cecd3";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Hyprland Wiki";
|
|
||||||
url = "https://wiki.hypr.land";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "MyNixOS";
|
|
||||||
url = "https://mynixos.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Nixpkgs";
|
|
||||||
url = "https://github.com/NixOS/nixpkgs";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Claude";
|
|
||||||
url = "https://claude.ai";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Gemini";
|
|
||||||
url = "https://gemini.google.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Medium";
|
|
||||||
url = "https://medium.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Maps";
|
|
||||||
url = "https://maps.apple.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Amazon";
|
|
||||||
url = "https://amazon.fr";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Infosec";
|
|
||||||
bookmarks = [
|
|
||||||
{
|
|
||||||
name = "Nix 4 Cyber";
|
|
||||||
url = "https://n4c.hadi.icu";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Cyberchef";
|
|
||||||
url = "https://cyberchef.hadi.icu";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "TryHackMe";
|
|
||||||
url = "https://tryhackme.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Root-Me";
|
|
||||||
url = "https://root-me.org";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Exploit-DB";
|
|
||||||
url = "https://exploit-db.com";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Crack Station";
|
|
||||||
url = "https://crackstation.net";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Osint Tracker";
|
|
||||||
url = "https://app.osintracker.com";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
c = config.lib.stylix.colors;
|
|
||||||
|
|
||||||
stripProtocol = url:
|
|
||||||
lib.removePrefix "https://" (lib.removePrefix "http://" url);
|
|
||||||
|
|
||||||
mkCard = item: ''
|
|
||||||
<a href="${item.url}" class="card">
|
|
||||||
<div class="favicon-wrapper">
|
|
||||||
<span class="favicon-fallback">${builtins.substring 0 1 item.name}</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-info">
|
|
||||||
<span class="card-name">${item.name}</span>
|
|
||||||
<span class="card-url">${stripProtocol item.url}</span>
|
|
||||||
</div>
|
|
||||||
</a>'';
|
|
||||||
|
|
||||||
# Group consecutive root items so they share the same .cards grid
|
|
||||||
grouped = let
|
|
||||||
step = acc: item:
|
|
||||||
if item ? url
|
|
||||||
then acc // {pending = acc.pending ++ [item];}
|
|
||||||
else {
|
|
||||||
groups =
|
|
||||||
acc.groups
|
|
||||||
++ lib.optional (acc.pending != []) {
|
|
||||||
isRoot = true;
|
|
||||||
items = acc.pending;
|
|
||||||
}
|
|
||||||
++ [
|
|
||||||
{
|
|
||||||
isRoot = false;
|
|
||||||
inherit item;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
pending = [];
|
|
||||||
};
|
|
||||||
result =
|
|
||||||
lib.foldl' step {
|
|
||||||
groups = [];
|
|
||||||
pending = [];
|
|
||||||
}
|
|
||||||
bookmarkList;
|
|
||||||
in
|
|
||||||
result.groups
|
|
||||||
++ lib.optional (result.pending != []) {
|
|
||||||
isRoot = true;
|
|
||||||
items = result.pending;
|
|
||||||
};
|
|
||||||
|
|
||||||
mkSection = group:
|
|
||||||
if group.isRoot
|
|
||||||
then ''
|
|
||||||
<div class="folder-section">
|
|
||||||
<div class="cards">
|
|
||||||
${lib.concatMapStrings mkCard group.items}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
''
|
|
||||||
else ''
|
|
||||||
<div class="folder-section">
|
|
||||||
<h2 class="folder-title">${group.item.name}</h2>
|
|
||||||
<div class="cards">
|
|
||||||
${lib.concatMapStrings mkCard group.item.bookmarks}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
'';
|
|
||||||
|
|
||||||
publicBookmarks =
|
|
||||||
pkgs.writeText "qutebrowser-public-bookmarks"
|
|
||||||
(lib.concatMapStrings (
|
|
||||||
item:
|
|
||||||
if item ? url
|
|
||||||
then "${item.url} ${item.name}\n"
|
|
||||||
else lib.concatMapStrings (b: "${b.url} ${item.name}/${b.name}\n") item.bookmarks
|
|
||||||
)
|
|
||||||
bookmarkList);
|
|
||||||
|
|
||||||
inherit (config.qutebrowser) privateBookmarksPath;
|
|
||||||
in {
|
|
||||||
options.qutebrowser.privateBookmarksPath = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.str;
|
|
||||||
default = null;
|
|
||||||
description = "Path to a file containing extra (private) bookmarks to append.";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
|
||||||
# Fully static HTML — order is preserved, no dependency on qutebrowser's Jinja rendering
|
|
||||||
xdg.dataFile."qutebrowser/bookmarks.html".text = ''
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Bookmarks</title>
|
|
||||||
<style>
|
|
||||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: #${c.base00};
|
|
||||||
color: #${c.base05};
|
|
||||||
font-family: 'Source Sans Pro', sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
min-height: 100vh;
|
|
||||||
padding: 2.5rem 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
max-width: 1100px;
|
|
||||||
margin: 0 auto 2rem;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-title {
|
|
||||||
font-size: 1.3rem;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #${c.base0D};
|
|
||||||
letter-spacing: -0.01em;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-bar {
|
|
||||||
flex: 1;
|
|
||||||
background-color: #${c.base01};
|
|
||||||
border: 1px solid #${c.base02};
|
|
||||||
border-radius: 8px;
|
|
||||||
color: #${c.base05};
|
|
||||||
font-family: 'Source Sans Pro', sans-serif;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
padding: 0.5rem 0.9rem;
|
|
||||||
outline: none;
|
|
||||||
transition: border-color 0.15s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-bar::placeholder { color: #${c.base03}; }
|
|
||||||
.search-bar:focus { border-color: #${c.base0D}; }
|
|
||||||
|
|
||||||
.bookmarks-container {
|
|
||||||
max-width: 1100px;
|
|
||||||
margin: 0 auto;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 1.75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.folder-title {
|
|
||||||
font-size: 0.72rem;
|
|
||||||
font-weight: 700;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: #${c.base03};
|
|
||||||
margin-bottom: 0.6rem;
|
|
||||||
padding-left: 0.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cards {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
|
||||||
gap: 0.4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.7rem;
|
|
||||||
padding: 0.6rem 0.8rem;
|
|
||||||
background-color: #${c.base01};
|
|
||||||
border: 1px solid #${c.base02};
|
|
||||||
border-radius: 10px;
|
|
||||||
text-decoration: none;
|
|
||||||
transition: background-color 0.12s ease, border-color 0.12s ease;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card:hover {
|
|
||||||
background-color: #${c.base02};
|
|
||||||
border-color: #${c.base03};
|
|
||||||
}
|
|
||||||
|
|
||||||
.favicon-wrapper { position: relative; width: 18px; height: 18px; flex-shrink: 0; }
|
|
||||||
|
|
||||||
.favicon-fallback {
|
|
||||||
position: absolute;
|
|
||||||
inset: 0;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
background-color: #${c.base02};
|
|
||||||
border-radius: 4px;
|
|
||||||
color: #${c.base04};
|
|
||||||
font-size: 10px;
|
|
||||||
font-weight: 700;
|
|
||||||
text-transform: uppercase;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-info {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 0.05rem;
|
|
||||||
overflow: hidden;
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-name {
|
|
||||||
color: #${c.base05};
|
|
||||||
font-size: 0.86rem;
|
|
||||||
font-weight: 500;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
transition: color 0.12s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card:hover .card-name { color: #${c.base0A}; }
|
|
||||||
|
|
||||||
.card-url {
|
|
||||||
color: #${c.base03};
|
|
||||||
font-family: 'Maple Mono NF', monospace;
|
|
||||||
font-size: 0.7rem;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
.no-results {
|
|
||||||
color: #${c.base03};
|
|
||||||
font-size: 0.9rem;
|
|
||||||
padding: 0.5rem 0.2rem;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="header">
|
|
||||||
<h1 class="page-title">Bookmarks</h1>
|
|
||||||
<input id="search" class="search-bar" type="text" placeholder="Search…" autocomplete="off" spellcheck="false">
|
|
||||||
</div>
|
|
||||||
<div class="bookmarks-container">
|
|
||||||
<p id="no-results" class="no-results">No results</p>
|
|
||||||
${lib.concatMapStrings mkSection grouped}
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
window.addEventListener('DOMContentLoaded', function () {
|
|
||||||
const input = document.getElementById('search');
|
|
||||||
const noResults = document.getElementById('no-results');
|
|
||||||
|
|
||||||
input.focus();
|
|
||||||
|
|
||||||
input.addEventListener('input', function () {
|
|
||||||
const query = this.value.toLowerCase().trim();
|
|
||||||
let anyVisible = false;
|
|
||||||
|
|
||||||
document.querySelectorAll('.folder-section').forEach(function (section) {
|
|
||||||
let sectionVisible = false;
|
|
||||||
section.querySelectorAll('.card').forEach(function (card) {
|
|
||||||
const name = card.querySelector('.card-name').textContent.toLowerCase();
|
|
||||||
const url = card.querySelector('.card-url').textContent.toLowerCase();
|
|
||||||
const match = !query || name.includes(query) || url.includes(query);
|
|
||||||
card.style.display = match ? ''' : 'none';
|
|
||||||
if (match) { sectionVisible = true; anyVisible = true; }
|
|
||||||
});
|
|
||||||
section.style.display = sectionVisible ? ''' : 'none';
|
|
||||||
});
|
|
||||||
|
|
||||||
noResults.style.display = anyVisible || !query ? 'none' : 'block';
|
|
||||||
});
|
|
||||||
|
|
||||||
input.addEventListener('keydown', function (e) {
|
|
||||||
if (e.key === 'Enter') {
|
|
||||||
const first = document.querySelector('.card:not([style*="none"])');
|
|
||||||
if (first) {
|
|
||||||
location.href = first.href;
|
|
||||||
} else {
|
|
||||||
const q = encodeURIComponent(this.value.trim());
|
|
||||||
if (q) location.href = 'https://www.startpage.com/sp/search?q=' + q;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (e.key === 'Escape') {
|
|
||||||
this.value = ''';
|
|
||||||
this.dispatchEvent(new Event('input'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
'';
|
|
||||||
|
|
||||||
home.activation.qutebrowserBookmarks = lib.hm.dag.entryAfter ["setupSecrets" "writeBoundary"] ''
|
|
||||||
mkdir -p ${config.home.homeDirectory}/.config/qutebrowser/bookmarks
|
|
||||||
cat ${publicBookmarks} ${lib.optionalString (privateBookmarksPath != null) ''"${privateBookmarksPath}"''} \
|
|
||||||
> ${config.home.homeDirectory}/.config/qutebrowser/bookmarks/urls
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,507 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
bookmarkList =
|
||||||
|
(import ./general.nix)
|
||||||
|
++ (import ./tools.nix)
|
||||||
|
++ (import ./social.nix)
|
||||||
|
++ (import ./infosec.nix)
|
||||||
|
++ (import ./other.nix)
|
||||||
|
++ (import ./jack.nix);
|
||||||
|
|
||||||
|
c = config.lib.stylix.colors;
|
||||||
|
|
||||||
|
stripProtocol = url:
|
||||||
|
lib.removePrefix "https://" (lib.removePrefix "http://" url);
|
||||||
|
|
||||||
|
stripDomain = url:
|
||||||
|
builtins.head (
|
||||||
|
lib.splitString "/" (stripProtocol url)
|
||||||
|
);
|
||||||
|
|
||||||
|
mkCard = item: let
|
||||||
|
domain = stripDomain item.url;
|
||||||
|
initial = builtins.substring 0 1 item.name;
|
||||||
|
in ''
|
||||||
|
<a href="${item.url}" class="card">
|
||||||
|
<div class="favicon-wrapper">
|
||||||
|
<img class="favicon" src="https://icons.duckduckgo.com/ip3/${domain}.ico" alt="" aria-hidden="true" loading="lazy" onerror="this.style.display='none';this.nextElementSibling.style.display='flex'">
|
||||||
|
<span class="favicon-fallback" style="display:none">${initial}</span>
|
||||||
|
</div>
|
||||||
|
<div class="card-info">
|
||||||
|
<span class="card-name">${item.name}</span>
|
||||||
|
<span class="card-url">${stripProtocol item.url}</span>
|
||||||
|
</div>
|
||||||
|
</a>'';
|
||||||
|
|
||||||
|
# Render a list of items (cards and/or sub-folders) inside a folder
|
||||||
|
mkFolderContent = items: let
|
||||||
|
step = acc: item:
|
||||||
|
if item ? url
|
||||||
|
then acc // {pending = acc.pending ++ [item];}
|
||||||
|
else {
|
||||||
|
chunks =
|
||||||
|
acc.chunks
|
||||||
|
++ lib.optional (acc.pending != []) {
|
||||||
|
isCards = true;
|
||||||
|
items = acc.pending;
|
||||||
|
}
|
||||||
|
++ [
|
||||||
|
{
|
||||||
|
isCards = false;
|
||||||
|
folder = item;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
pending = [];
|
||||||
|
};
|
||||||
|
result =
|
||||||
|
lib.foldl' step {
|
||||||
|
chunks = [];
|
||||||
|
pending = [];
|
||||||
|
}
|
||||||
|
items;
|
||||||
|
chunks =
|
||||||
|
result.chunks
|
||||||
|
++ lib.optional (result.pending != []) {
|
||||||
|
isCards = true;
|
||||||
|
items = result.pending;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.concatMapStrings (chunk:
|
||||||
|
if chunk.isCards
|
||||||
|
then ''
|
||||||
|
<div class="cards">
|
||||||
|
${lib.concatMapStrings mkCard chunk.items}
|
||||||
|
</div>''
|
||||||
|
else mkFolder chunk.folder)
|
||||||
|
chunks;
|
||||||
|
|
||||||
|
mkFolder = folder: let
|
||||||
|
iconHtml =
|
||||||
|
if folder ? icon
|
||||||
|
then ''<span class="material-symbols-outlined folder-icon" aria-hidden="true">${folder.icon}</span>''
|
||||||
|
else "";
|
||||||
|
in ''
|
||||||
|
<details class="folder-section" open>
|
||||||
|
<summary class="folder-title">
|
||||||
|
${iconHtml}<span class="folder-name">${folder.name}</span>
|
||||||
|
<svg class="chevron" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
|
||||||
|
</summary>
|
||||||
|
<div class="folder-content">
|
||||||
|
${mkFolderContent folder.bookmarks}
|
||||||
|
</div>
|
||||||
|
</details>'';
|
||||||
|
|
||||||
|
# Group consecutive root items so they share the same .cards grid
|
||||||
|
grouped = let
|
||||||
|
step = acc: item:
|
||||||
|
if item ? url
|
||||||
|
then acc // {pending = acc.pending ++ [item];}
|
||||||
|
else {
|
||||||
|
groups =
|
||||||
|
acc.groups
|
||||||
|
++ lib.optional (acc.pending != []) {
|
||||||
|
isRoot = true;
|
||||||
|
items = acc.pending;
|
||||||
|
}
|
||||||
|
++ [
|
||||||
|
{
|
||||||
|
isRoot = false;
|
||||||
|
inherit item;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
pending = [];
|
||||||
|
};
|
||||||
|
result =
|
||||||
|
lib.foldl' step {
|
||||||
|
groups = [];
|
||||||
|
pending = [];
|
||||||
|
}
|
||||||
|
bookmarkList;
|
||||||
|
in
|
||||||
|
result.groups
|
||||||
|
++ lib.optional (result.pending != []) {
|
||||||
|
isRoot = true;
|
||||||
|
items = result.pending;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkSection = group:
|
||||||
|
if group.isRoot
|
||||||
|
then ''
|
||||||
|
<div class="root-section">
|
||||||
|
<div class="cards">
|
||||||
|
${lib.concatMapStrings mkCard group.items}
|
||||||
|
</div>
|
||||||
|
</div>''
|
||||||
|
else mkFolder group.item;
|
||||||
|
|
||||||
|
# Recursively collect all leaf bookmarks with their full folder path
|
||||||
|
collectBookmarks = prefix: items:
|
||||||
|
lib.concatMapStrings (
|
||||||
|
item:
|
||||||
|
if item ? url
|
||||||
|
then "${item.url} ${prefix}${item.name}\n"
|
||||||
|
else collectBookmarks "${prefix}${item.name}/" item.bookmarks
|
||||||
|
)
|
||||||
|
items;
|
||||||
|
|
||||||
|
publicBookmarks =
|
||||||
|
pkgs.writeText "qutebrowser-public-bookmarks"
|
||||||
|
(collectBookmarks "" bookmarkList);
|
||||||
|
|
||||||
|
inherit (config.qutebrowser) privateBookmarksPath;
|
||||||
|
in {
|
||||||
|
options.qutebrowser.privateBookmarksPath = lib.mkOption {
|
||||||
|
type = lib.types.nullOr lib.types.str;
|
||||||
|
default = null;
|
||||||
|
description = "Path to a file containing extra (private) bookmarks to append.";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
xdg.dataFile."qutebrowser/bookmarks.html".text = ''
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Bookmarks</title>
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20,300,0,0">
|
||||||
|
<style>
|
||||||
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #${c.base00};
|
||||||
|
color: #${c.base05};
|
||||||
|
font-family: 'Source Sans Pro', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
min-height: 100vh;
|
||||||
|
padding: 2.5rem 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
max-width: 1100px;
|
||||||
|
margin: 0 auto 2rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-title {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #${c.base0D};
|
||||||
|
letter-spacing: -0.01em;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-bar {
|
||||||
|
flex: 1;
|
||||||
|
background-color: #${c.base01};
|
||||||
|
border: 1px solid #${c.base02};
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #${c.base05};
|
||||||
|
font-family: 'Source Sans Pro', sans-serif;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
padding: 0.5rem 0.9rem;
|
||||||
|
outline: none;
|
||||||
|
transition: border-color 0.15s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-bar::placeholder { color: #${c.base03}; }
|
||||||
|
.search-bar:focus { border-color: #${c.base0D}; }
|
||||||
|
|
||||||
|
.collapse-btn {
|
||||||
|
flex-shrink: 0;
|
||||||
|
background: none;
|
||||||
|
border: 1px solid #${c.base02};
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #${c.base03};
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0.47rem;
|
||||||
|
transition: color 0.15s ease, border-color 0.15s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse-btn:hover {
|
||||||
|
color: #${c.base0D};
|
||||||
|
border-color: #${c.base0D};
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse-btn svg {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bookmarks-container {
|
||||||
|
max-width: 1100px;
|
||||||
|
margin: 0 auto;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root-section {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
details.folder-section {
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
details.folder-section > summary {
|
||||||
|
list-style: none;
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
padding: 0.45rem 0.5rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
user-select: none;
|
||||||
|
transition: background-color 0.12s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
details.folder-section > summary::-webkit-details-marker { display: none; }
|
||||||
|
|
||||||
|
details.folder-section > summary:hover {
|
||||||
|
background-color: #${c.base01};
|
||||||
|
color: #${c.base0D};
|
||||||
|
}
|
||||||
|
|
||||||
|
details.folder-section > summary:hover .folder-name {
|
||||||
|
color: #${c.base0D};
|
||||||
|
}
|
||||||
|
|
||||||
|
details.folder-section > summary:hover .folder-icon {
|
||||||
|
color: #${c.base0D};
|
||||||
|
}
|
||||||
|
|
||||||
|
.folder-icon {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1;
|
||||||
|
flex-shrink: 0;
|
||||||
|
color: #${c.base04};
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.folder-name {
|
||||||
|
font-size: 0.72rem;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #${c.base03};
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chevron {
|
||||||
|
width: 13px;
|
||||||
|
height: 13px;
|
||||||
|
color: #${c.base03};
|
||||||
|
transition: transform 0.2s ease;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
details[open] > summary > .chevron {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.folder-content {
|
||||||
|
padding: 0.4rem 0 0.5rem 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nested folder indent */
|
||||||
|
.folder-content > details.folder-section > summary {
|
||||||
|
padding-left: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.folder-content > details.folder-section > .folder-content {
|
||||||
|
padding-left: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
||||||
|
gap: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.7rem;
|
||||||
|
padding: 0.6rem 0.8rem;
|
||||||
|
background-color: #${c.base01};
|
||||||
|
border: 1px solid #${c.base02};
|
||||||
|
border-radius: 10px;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: background-color 0.12s ease, border-color 0.12s ease;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card:hover {
|
||||||
|
background-color: #${c.base02};
|
||||||
|
border-color: #${c.base0D};
|
||||||
|
}
|
||||||
|
|
||||||
|
.favicon-wrapper { position: relative; width: 18px; height: 18px; flex-shrink: 0; }
|
||||||
|
|
||||||
|
.favicon {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: contain;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.favicon-fallback {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #${c.base02};
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #${c.base04};
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 700;
|
||||||
|
text-transform: uppercase;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.05rem;
|
||||||
|
overflow: hidden;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-name {
|
||||||
|
color: #${c.base05};
|
||||||
|
font-size: 0.86rem;
|
||||||
|
font-weight: 500;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
transition: color 0.12s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card:hover .card-name { color: #${c.base0D}; }
|
||||||
|
|
||||||
|
.card-url {
|
||||||
|
color: #${c.base03};
|
||||||
|
font-family: 'Maple Mono NF', monospace;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-results {
|
||||||
|
color: #${c.base03};
|
||||||
|
font-size: 0.9rem;
|
||||||
|
padding: 0.5rem 0.2rem;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<h1 class="page-title">Bookmarks</h1>
|
||||||
|
<input id="search" class="search-bar" type="text" placeholder="Search…" autocomplete="off" spellcheck="false">
|
||||||
|
<button id="collapse-btn" class="collapse-btn" title="Collapse all folders" aria-label="Collapse all folders">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polyline points="4 14 10 14 10 20"/><polyline points="20 10 14 10 14 4"/><line x1="10" y1="14" x2="3" y2="21"/><line x1="21" y1="3" x2="14" y2="10"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="bookmarks-container">
|
||||||
|
<p id="no-results" class="no-results">No results</p>
|
||||||
|
${lib.concatMapStrings mkSection grouped}
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
window.addEventListener('DOMContentLoaded', function () {
|
||||||
|
const input = document.getElementById('search');
|
||||||
|
const noResults = document.getElementById('no-results');
|
||||||
|
const collapseBtn = document.getElementById('collapse-btn');
|
||||||
|
|
||||||
|
input.focus();
|
||||||
|
|
||||||
|
collapseBtn.addEventListener('click', function () {
|
||||||
|
document.querySelectorAll('details.folder-section').forEach(function (d) {
|
||||||
|
d.open = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('input', function () {
|
||||||
|
const query = this.value.toLowerCase().trim();
|
||||||
|
let anyVisible = false;
|
||||||
|
|
||||||
|
if (query) {
|
||||||
|
document.querySelectorAll('details.folder-section').forEach(function (d) {
|
||||||
|
d.open = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.querySelectorAll('.folder-section, .root-section').forEach(function (section) {
|
||||||
|
let sectionVisible = false;
|
||||||
|
section.querySelectorAll('.card').forEach(function (card) {
|
||||||
|
const name = card.querySelector('.card-name').textContent.toLowerCase();
|
||||||
|
const url = card.querySelector('.card-url').textContent.toLowerCase();
|
||||||
|
const match = !query || name.includes(query) || url.includes(query);
|
||||||
|
card.style.display = match ? ''' : 'none';
|
||||||
|
if (match) { sectionVisible = true; anyVisible = true; }
|
||||||
|
});
|
||||||
|
section.style.display = sectionVisible ? ''' : 'none';
|
||||||
|
});
|
||||||
|
|
||||||
|
noResults.style.display = anyVisible || !query ? 'none' : 'block';
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('keydown', function (e) {
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
const val = this.value.trim();
|
||||||
|
const isUrl = /^https?:\/\//i.test(val) || /^[a-zA-Z0-9-]+(\.[a-zA-Z]{2,})(\/.*)?$/.test(val);
|
||||||
|
if (isUrl) {
|
||||||
|
location.href = /^https?:\/\//i.test(val) ? val : 'https://' + val;
|
||||||
|
} else {
|
||||||
|
const first = document.querySelector('.card:not([style*="none"])');
|
||||||
|
if (first) {
|
||||||
|
location.href = first.href;
|
||||||
|
} else {
|
||||||
|
const q = encodeURIComponent(val);
|
||||||
|
if (q) location.href = 'https://www.startpage.com/sp/search?q=' + q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (e.key === 'Escape') {
|
||||||
|
this.value = ''';
|
||||||
|
this.dispatchEvent(new Event('input'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.activation.qutebrowserBookmarks = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
||||||
|
mkdir -p ${config.home.homeDirectory}/.config/qutebrowser/bookmarks
|
||||||
|
{
|
||||||
|
cat ${publicBookmarks}
|
||||||
|
${lib.optionalString (privateBookmarksPath != null) ''
|
||||||
|
if [ -f "${privateBookmarksPath}" ]; then
|
||||||
|
cat "${privateBookmarksPath}"
|
||||||
|
fi
|
||||||
|
''}
|
||||||
|
} > ${config.home.homeDirectory}/.config/qutebrowser/bookmarks/urls
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
name = "Proton Mail";
|
||||||
|
url = "https://mail.proton.me";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Proton Drive";
|
||||||
|
url = "https://drive.proton.me";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Proton Lumo";
|
||||||
|
url = "https://lumo.proton.me";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Proton Calendar";
|
||||||
|
url = "https://calendar.proton.me";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Github";
|
||||||
|
url = "https://github.com";
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
name = "Infosec";
|
||||||
|
icon = "terminal";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Nix 4 Cyber";
|
||||||
|
url = "https://n4c.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Cyberchef";
|
||||||
|
url = "https://cyberchef.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "TryHackMe";
|
||||||
|
url = "https://tryhackme.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Root-Me";
|
||||||
|
url = "https://root-me.org";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Hack The Box";
|
||||||
|
url = "https://hackthebox.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Iknowyou";
|
||||||
|
url = "https://iknowyou-prod.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Exploit-DB";
|
||||||
|
url = "https://exploit-db.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "GTFOBins";
|
||||||
|
url = "https://gtfobins.org/";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Crack Station";
|
||||||
|
url = "https://crackstation.net";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Osint Tracker";
|
||||||
|
url = "https://app.osintracker.com";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
name = "Jack";
|
||||||
|
icon = "dns";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Glance";
|
||||||
|
url = "https://home.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Blog";
|
||||||
|
url = "https://hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Gitea";
|
||||||
|
url = "https://git.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Mealie";
|
||||||
|
url = "https://mealie.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Wallpapers";
|
||||||
|
url = "https://wallpapers.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Default Creds";
|
||||||
|
url = "https://default-creds.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Media";
|
||||||
|
icon = "subscriptions";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Radarr";
|
||||||
|
url = "https://radarr.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Sonarr";
|
||||||
|
url = "https://sonarr.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Bazarr";
|
||||||
|
url = "https://bazarr.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Prowlarr";
|
||||||
|
url = "https://prowlarr.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Transmission";
|
||||||
|
url = "https://transmission.hadi.icu";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Infrastructure";
|
||||||
|
icon = "construction";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "AdGuard";
|
||||||
|
url = "https://adguard.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Umami";
|
||||||
|
url = "https://umami.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Cloudflare";
|
||||||
|
url = "https://dash.cloudflare.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Cloudflare Zero Trust";
|
||||||
|
url = "https://one.dash.cloudflare.com";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
name = "Other";
|
||||||
|
icon = "category";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Documentation";
|
||||||
|
icon = "menu_book";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Hyprland Wiki";
|
||||||
|
url = "https://wiki.hypr.land";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Stylix Wiki";
|
||||||
|
url = "https://nix-community.github.io/stylix/";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Nixpkgs";
|
||||||
|
url = "https://github.com/NixOS/nixpkgs";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "tldr";
|
||||||
|
url = "https://tldr.inbrowser.app/";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Startpage Config";
|
||||||
|
url = "https://www.startpage.com/do/mypage.pl?prfe=45d331deb05471d659dba933e7400df51d952bb103da6f6125c0e769a6be1d65610456a479f495ceeee7e97311cf227d7c1bb198de0ceeb193d8cddf9c455c19a409cc35c3e3f542ee27bd7cecd3";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Feedly";
|
||||||
|
url = "https://feedly.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "MyNixOS";
|
||||||
|
url = "https://mynixos.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Amazon";
|
||||||
|
url = "https://amazon.fr";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
name = "Entertainment";
|
||||||
|
icon = "movie";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Youtube";
|
||||||
|
url = "https://youtube.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Jellyfin";
|
||||||
|
url = "https://media.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Seerr";
|
||||||
|
url = "https://demandemedia.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Social Media";
|
||||||
|
icon = "group";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Medium";
|
||||||
|
url = "https://medium.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Bluesky";
|
||||||
|
url = "https://bsky.app";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Reddit";
|
||||||
|
url = "https://reddit.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Instagram";
|
||||||
|
url = "https://instagram.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Discord";
|
||||||
|
url = "https://discord.com/channels/@me/";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Gitlab";
|
||||||
|
url = "https://gitlab.com/";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
name = "Tools";
|
||||||
|
icon = "handyman";
|
||||||
|
bookmarks = [
|
||||||
|
{
|
||||||
|
name = "Maps";
|
||||||
|
url = "https://maps.apple.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Excalidraw";
|
||||||
|
url = "https://excalidraw.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Cobalt (downloader)";
|
||||||
|
url = "https://cobalt.meowing.de";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Mazanoke (image)";
|
||||||
|
url = "https://mazanoke.hadi.icu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Vert";
|
||||||
|
url = "https://vert.sh";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Markdown to PDF";
|
||||||
|
url = "https://md2file.com";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Image to Vector";
|
||||||
|
url = "https://www.vectorcascade.com/";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "PrivateBin";
|
||||||
|
url = "https://privatebin.net";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Claude";
|
||||||
|
url = "https://claude.ai";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "Gemini";
|
||||||
|
url = "https://gemini.google.com";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{...}: {
|
{...}: {
|
||||||
imports = [
|
imports = [
|
||||||
./bookmarks.nix
|
./bookmarks
|
||||||
./search.nix
|
./search.nix
|
||||||
./keybindings.nix
|
./keybindings.nix
|
||||||
./settings.nix
|
./settings.nix
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
c.statusbar.padding = {'top': 6, 'bottom': 6, 'left': 8, 'right': 8}
|
c.statusbar.padding = {'top': 6, 'bottom': 6, 'left': 8, 'right': 8}
|
||||||
c.tabs.padding = {'top': 6, 'bottom': 6, 'left': 8, 'right': 8}
|
c.tabs.padding = {'top': 6, 'bottom': 6, 'left': 8, 'right': 8}
|
||||||
|
config.set('content.local_content_can_access_remote_urls', True, 'file://*')
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,29 +96,6 @@ in {
|
|||||||
else ""
|
else ""
|
||||||
}
|
}
|
||||||
|
|
||||||
function sesh-sessions() {
|
|
||||||
session=$(sesh list -t -c | fzf --height 70% --reverse)
|
|
||||||
[[ -z "$session" ]] && return
|
|
||||||
sesh connect $session
|
|
||||||
}
|
|
||||||
|
|
||||||
function chatgptfolder(){
|
|
||||||
echo "################################"
|
|
||||||
echo "### TREE ###"
|
|
||||||
echo "################################"
|
|
||||||
${pkgs.eza}/bin/eza --tree -aF --icons never
|
|
||||||
echo -e "\n\n"
|
|
||||||
echo "##############################"
|
|
||||||
echo "### CONTENT ###"
|
|
||||||
echo "##############################"
|
|
||||||
find . -type f -not -path '*/.git/*' -print0 | while IFS= read -r -d "" file; do
|
|
||||||
echo -e "\n--- DEBUT: $file ---\n"
|
|
||||||
cat "$file"
|
|
||||||
echo -e "\n--- FIN: $file ---\n"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function n4c() {
|
function n4c() {
|
||||||
category=''${1:-all}
|
category=''${1:-all}
|
||||||
shift
|
shift
|
||||||
@@ -126,11 +103,6 @@ in {
|
|||||||
nix develop "github:nix4cyber/n4c#''${category}" ''${args} -c zsh
|
nix develop "github:nix4cyber/n4c#''${category}" ''${args} -c zsh
|
||||||
}
|
}
|
||||||
|
|
||||||
zle -N sesh-sessions
|
|
||||||
bindkey -M emacs '\es' sesh-sessions
|
|
||||||
bindkey -M vicmd '\es' sesh-sessions
|
|
||||||
bindkey -M viins '\es' sesh-sessions
|
|
||||||
|
|
||||||
# search history based on what's typed in the prompt
|
# search history based on what's typed in the prompt
|
||||||
autoload -U history-search-end
|
autoload -U history-search-end
|
||||||
zle -N history-beginning-search-backward-end history-search-end
|
zle -N history-beginning-search-backward-end history-search-end
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{config, ...}: {
|
||||||
|
imports = [
|
||||||
|
# Mostly system related configuration
|
||||||
|
../../nixos/audio.nix
|
||||||
|
../../nixos/bluetooth.nix
|
||||||
|
../../nixos/fonts.nix
|
||||||
|
../../nixos/home-manager.nix
|
||||||
|
../../nixos/nix.nix
|
||||||
|
../../nixos/systemd-boot.nix
|
||||||
|
../../nixos/sddm.nix
|
||||||
|
../../nixos/users.nix
|
||||||
|
../../nixos/utils.nix
|
||||||
|
../../nixos/hyprland.nix
|
||||||
|
|
||||||
|
# You should let those lines as is
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./variables.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
home-manager.users."${config.var.username}" = import ./home.nix;
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [9001];
|
||||||
|
|
||||||
|
# Don't touch this
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
modulesPath,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod"];
|
||||||
|
boot.initrd.kernelModules = [];
|
||||||
|
boot.kernelModules = ["kvm-intel"];
|
||||||
|
boot.extraModulePackages = [];
|
||||||
|
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "/dev/disk/by-uuid/5dbf85d3-d236-4af8-b489-d6066bfe1eb7";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" = {
|
||||||
|
device = "/dev/disk/by-uuid/043E-1755";
|
||||||
|
fsType = "vfat";
|
||||||
|
options = ["fmask=0077" "dmask=0077"];
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
{config, ...}: {
|
||||||
|
imports = [
|
||||||
|
# Programs
|
||||||
|
../../home/programs/brave
|
||||||
|
../../home/programs/proton
|
||||||
|
../../home/programs/ghostty
|
||||||
|
../../home/programs/nvf
|
||||||
|
../../home/programs/shell
|
||||||
|
../../home/programs/git
|
||||||
|
../../home/programs/git/lazygit.nix
|
||||||
|
../../home/programs/spicetify
|
||||||
|
../../home/programs/thunar
|
||||||
|
../../home/programs/nixy
|
||||||
|
../../home/programs/nightshift
|
||||||
|
../../home/programs/qutebrowser
|
||||||
|
../../home/programs/nix-utils
|
||||||
|
|
||||||
|
../../home/programs/group/basic-apps.nix
|
||||||
|
../../home/programs/group/cybersecurity.nix
|
||||||
|
../../home/programs/group/dev.nix
|
||||||
|
../../home/programs/group/misc.nix
|
||||||
|
|
||||||
|
# System (Desktop environment like stuff)
|
||||||
|
../../home/system/hyprland
|
||||||
|
../../home/system/caelestia-shell
|
||||||
|
../../home/system/hyprpaper
|
||||||
|
../../home/system/mime
|
||||||
|
../../home/system/udiskie
|
||||||
|
|
||||||
|
./variables.nix # Mostly user-specific configuration
|
||||||
|
./secrets # CHANGEME: You should probably remove this line, this is where I store my secrets
|
||||||
|
];
|
||||||
|
|
||||||
|
home = {
|
||||||
|
inherit (config.var) username;
|
||||||
|
homeDirectory = "/home/" + config.var.username;
|
||||||
|
|
||||||
|
# Don't touch this
|
||||||
|
stateVersion = "24.05";
|
||||||
|
};
|
||||||
|
|
||||||
|
qutebrowser.privateBookmarksPath = config.sops.secrets.qutebrowser-bookmarks.path;
|
||||||
|
|
||||||
|
programs.home-manager.enable = true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# Those are my secrets, encrypted with sops
|
||||||
|
# You shouldn't import this file, unless you edit it
|
||||||
|
{
|
||||||
|
inputs,
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
home = config.home.homeDirectory;
|
||||||
|
in {
|
||||||
|
imports = [inputs.sops-nix.homeManagerModules.sops];
|
||||||
|
|
||||||
|
sops = {
|
||||||
|
age.keyFile = "${home}/.config/sops/age/keys.txt";
|
||||||
|
defaultSopsFile = ./secrets.yaml;
|
||||||
|
secrets = {
|
||||||
|
ssh-config = {path = "${home}/.ssh/config";};
|
||||||
|
netrc = {path = "${home}/.netrc";};
|
||||||
|
github-key = {path = "${home}/.ssh/github";};
|
||||||
|
gitlab-key = {path = "${home}/.ssh/gitlab";};
|
||||||
|
qutebrowser-bookmarks = {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file.".config/nixos/.sops.yaml".text = ''
|
||||||
|
keys:
|
||||||
|
- &primary age12yvtj49pfh3fqzqflscm0ek4yzrjhr6cqhn7x89gdxnlykq0xudq5c7334
|
||||||
|
- &work age1c8pawdsxptfslgrz2c56s39mrtnjzc5mm3hfzgr2wdwu2v6vfsdsupjsq6
|
||||||
|
creation_rules:
|
||||||
|
- path_regex: hosts/laptop/secrets/secrets.yaml$
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *primary
|
||||||
|
- path_regex: hosts/server/secrets/secrets.yaml$
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *primary
|
||||||
|
- path_regex: hosts/work/secrets/secrets.yaml$
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *work
|
||||||
|
'';
|
||||||
|
|
||||||
|
systemd.user.services.mbsync.Unit.After = ["sops-nix.service"];
|
||||||
|
home.packages = with pkgs; [sops age];
|
||||||
|
|
||||||
|
wayland.windowManager.hyprland.settings.exec-once = ["systemctl --user start sops-nix"];
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
qutebrowser-bookmarks: ENC[AES256_GCM,data:j+hW6wA9zOe84Qj4ogLCkahknugWppXWa9hTPCvVXeyY9RY+RS9LjgxyrLpKPnbFyo7OI2vUrY4524fqdJo66Cb1nynKRvB8gWukBIT1vhyDY3pfhbq7kp//Dfs8xE+Jp9mP/vx3VvOvm3C2rim/K3i7YfKOWO4GmkLMD3I1tKIsocOvZn3AitUKStZqk6oId6CE,iv:83UuH/+0w3paHMgnuAvCQsbMOILl43lNxx11UEIg5KY=,tag:EXiIE0rcLb5bq8dW0eOwgQ==,type:str]
|
||||||
|
ssh-config: ENC[AES256_GCM,data:npBcAOSwHpApUASlZmRo4stwMrOjdrdmhfYwumjbTpcq8aQ2ybV8le7cjNdVqIyxgwxUFV4/tGfmsq4nlrWIO/85spwfC5DyPGaZ848NI3UZJj8k2GKuw5qk/xGsTveNhq+vNZQcHeL4aeXF2TRmFLDHYGTku9anFL7FWkQ75MmGW78XfPUEyZJ52ylXq3gkYeVSrl6cXuwJw/QBlu+XTgFk4MM+E5BTXBFFNJOYkIt4GwWX7wdI+QqPEof8J0ENYdxUAMKMueL4pLNclWP0fu7QC7gwwRJWjauCNElJiDhpVFa6WukJV/Ut+I30FH9cJtj0rSodeu0hq2fWaiQ0wVbQudxi0JcnxJQs+B9nb6kpF+TN0MiD,iv:c7DMZSmlgMMnNlR0/kNRKPYjCzvNQJ46mZzojHppSg8=,tag:ausjsFk0H9nOiiMebHXSUg==,type:str]
|
||||||
|
netrc: ENC[AES256_GCM,data:EOpuZhDVXe7Q4P/98C3gtEvkdawI26d4oX/wRNytyp/mAdkHytXiLpFdsuO/3DADOG8h1CCo1UTs9ex+bqoD/LdChdp7INfNDSQ+aDxTiG0rLBgjvy8TIj8=,iv:tc/RbN1Upbjv+3rU5zUR3P//a1Hj1xODInLMShg4i1Y=,tag:7E9G2g4g+eMeJrwI20R/1g==,type:str]
|
||||||
|
github-key: ENC[AES256_GCM,data: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,iv:2Mvmz1CFO1112RxjIl6sxyNIDqa/cg00um6RcQaHNY8=,tag:+zygdwQdCBeBXVLvAj/jJQ==,type:str]
|
||||||
|
gitlab-key: ENC[AES256_GCM,data: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,iv:aG4nqGJ/TRiAtiWoPwqej6We+IWEWFibCqL7bGwXbkA=,tag:c5ckW2o4+2rm/5mrGF1tzg==,type:str]
|
||||||
|
sops:
|
||||||
|
age:
|
||||||
|
- recipient: age1c8pawdsxptfslgrz2c56s39mrtnjzc5mm3hfzgr2wdwu2v6vfsdsupjsq6
|
||||||
|
enc: |
|
||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVby9Wa1NUUkpyeDMwU3dM
|
||||||
|
R0EyeFVtT0tJU0pKaWtXQzRkTDBPY3JjcTFrClNIQnl2WVorS0FZZjhicTQ5V2kx
|
||||||
|
MUZTZWZtaUk2a1ZhUTBCUnhkWHFIMFUKLS0tIElLcjJLZWNLOUJYN0NNVGFNUEFN
|
||||||
|
RkMrdTYwNkY1Tlc3M3dxTFdkRXJJZUEKUlYU45jXpS9hJO9Z/uAQ6XMj9QWgMMRI
|
||||||
|
LbJxvt48+yC+Y0XKOtDE0lHAuGNzUG8R/7FB1tTD8NCamBe46KGCIg==
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
||||||
|
lastmodified: "2026-04-22T08:26:28Z"
|
||||||
|
mac: ENC[AES256_GCM,data:cengea0QNzwuranhMXH7pXu8518D9dDiDGz8ZY57IXArfkplfdQFaXAAv0t1bAWmQBDDloA/kwE+uq6XuGChhu/F41Sh2SLwmGYW0RSR29S/UfvI07UIhyImhiECUfBSJsSqPcW25vB0WP6kcM4HuYLHlxSrdGTDBIiUJsu09io=,iv:OUk4MBuNqb/wTJtXO1tCFY9aaEg/yzrwxRVvDMAj5E0=,tag:rIjhibls2vXPH67Fnwj6ow==,type:str]
|
||||||
|
unencrypted_suffix: _unencrypted
|
||||||
|
version: 3.12.2
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
# Choose your theme here:
|
||||||
|
../../themes/darkviolet.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
config.var = {
|
||||||
|
hostname = "h-work";
|
||||||
|
username = "hadrien";
|
||||||
|
configDirectory =
|
||||||
|
"/home/"
|
||||||
|
+ config.var.username
|
||||||
|
+ "/.config/nixos"; # The path of the nixos configuration directory
|
||||||
|
|
||||||
|
keyboardLayout = "fr";
|
||||||
|
|
||||||
|
location = "Paris";
|
||||||
|
timeZone = "Europe/Paris";
|
||||||
|
defaultLocale = "en_US.UTF-8";
|
||||||
|
extraLocale = "fr_FR.UTF-8";
|
||||||
|
|
||||||
|
git = {
|
||||||
|
username = "Hadi";
|
||||||
|
email = "hadi@example.com";
|
||||||
|
};
|
||||||
|
|
||||||
|
autoUpgrade = false;
|
||||||
|
autoGarbageCollector = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# DON'T TOUCH THIS
|
||||||
|
options = {
|
||||||
|
var = lib.mkOption {
|
||||||
|
type = lib.types.attrs;
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user