Compare commits

...

126 Commits

Author SHA1 Message Date
marc
e87b0ddd24 Added screenshots module 2025-10-05 18:23:02 +02:00
marc
18cfc610e1 Add anki 2025-10-05 15:43:21 +02:00
marc
7277d5b080 Add input modules (greek and japanese) 2025-10-05 15:43:04 +02:00
marc
ed00a90dda Better emoji support in emacs (+ other) 2025-09-20 16:48:38 +02:00
marc
97b58f141a Change theme 2025-09-20 16:47:58 +02:00
marc
d388d2192a Added cliphist and changed starship config 2025-06-01 22:57:57 +02:00
marc
41d47f6152 Use ghostty, starship and remove powerlevel 10k 2025-05-25 14:20:12 +02:00
marc
df6c1c9402 Upgrade to nixpkgs 25.05 2025-05-24 19:06:04 +02:00
marc
fc548af96a Update folkugat nomad deployment 2025-05-24 17:20:10 +02:00
marc
1b8db86a98 Doom emacs: use eglot LSP 2025-03-24 23:01:12 +01:00
marc
e24078ec81 Moved nomad data files 2025-03-24 23:01:12 +01:00
marc
411bf5b0f2 Thingvellir fixes 2025-03-24 22:56:23 +01:00
marc
7312947723 Add folkugat host volume in thingvellir 2025-03-24 22:10:27 +01:00
marc
428a1756f3 Renew consul certificates 2025-03-14 20:01:35 +01:00
marc
f7afbe6973 Other changes 2025-02-16 22:51:35 +01:00
marc
e917ea97c6 Add zen browser 2025-02-16 22:51:22 +01:00
marc
8378eec1e0 Configure kanata for voyager (disable it) 2025-02-16 22:50:51 +01:00
marc
a39f38b3f2 Added keyboard settings for voyager 2025-02-01 00:54:05 +01:00
marc
aef9169245 Add Cargo.toml to Rust devenv 2024-12-30 18:59:35 +01:00
marc
bb7b073fe9 Changed kanata config 2024-12-30 18:59:14 +01:00
marc
b1a8174ea1 More changes in greeter 2024-12-30 18:59:03 +01:00
marc
4518cccec1 Changes in greeter 2024-12-24 17:57:58 +01:00
marc
8da975b098 Fix install docs and deploy keys script 2024-12-24 17:57:40 +01:00
marc
d452ec86dd Remove nameserver from quinto 2024-12-22 16:18:43 +01:00
marc
ed305126a2 Added quinto host 2024-12-22 16:15:46 +01:00
marc
a59c52a2a3 Added quinto secrets and deploy-ssh keys 2024-12-22 16:05:01 +01:00
marc
ab380782c3 Added brightness notifications 2024-12-08 19:03:42 +01:00
marc
5fd64d47cd Added swaync and some notifications 2024-12-06 19:05:56 +01:00
marc
2956327b0c Modify kanata 2024-12-04 19:30:14 +01:00
marc
40b3eaba12 Added notification center 2024-12-04 15:45:20 +01:00
marc
7fe62ab2ce Brightness control 2024-12-04 14:33:49 +01:00
marc
2af075c7dd More refactoring and added hyprlock 2024-12-03 22:57:56 +01:00
marc
a5cd3713e7 Desktop environment refactor 2024-12-03 20:03:23 +01:00
marc
c62acaa77f Upgrade nix to 24.11 2024-12-03 15:22:53 +01:00
marc
39cdbaa430 Use hy3 2024-12-03 14:26:09 +01:00
marc
228c57679b Upgrade flake 2024-12-01 15:55:27 +01:00
marc
81fedb6261 Add greek keyboard layout and include kanata in hyprland 2024-12-01 15:54:58 +01:00
marc
154b7fb9b2 Modify kanata config 2024-11-23 13:05:31 +01:00
marc
0584a50f5f Added yazi 2024-11-23 13:05:18 +01:00
marc
7cbf3cb37b Added kanata 2024-11-10 20:12:15 +01:00
marc
6ba393d433 Fix rofi, eww and gpg 2024-11-10 20:12:15 +01:00
marc
e4bf731436 Use python 3.12 in devenv 2024-11-10 20:12:15 +01:00
marc
eef75973d4 Upgrade flake 2024-11-10 20:12:12 +01:00
marc
25a24fe206 Add mouse shortuct to resize window in hyprland 2024-11-10 20:10:05 +01:00
marc
d49b475e16 Upgrade flake 2024-05-28 22:50:17 +02:00
marc
6ca66905b1 Fixed nomad bind address to use tailscale IP instead of 0.0.0.0 2024-05-28 22:50:17 +02:00
marc
8833cb4f7a Fix eww scripts timing out 2024-03-06 23:42:32 +01:00
marc
6a4dcadfba Added eww bluetooth module 2024-03-06 23:35:51 +01:00
marc
f2b20c7acd Use cage for the display manager 2024-03-02 23:03:20 +01:00
marc
d1b63fe326 Eww reformatting and fixes 2024-03-02 18:06:17 +01:00
marc
466ddf2cd9 Added wayland, hyprland and eww 2024-03-02 17:38:35 +01:00
marc
95944b2486 Added vatnajokull NAS as a separate module 2024-02-20 20:22:41 +01:00
marc
32654faf98 Added tailscale dependency to consul and nomad 2024-02-20 00:43:57 +01:00
marc
bf8c91e632 Flake upgrade 2024-02-18 23:24:30 +01:00
marc
3d89540ff8 Added zoxide 2024-02-18 22:17:14 +01:00
marc
4f70bf991c Migrate all jobs to thingvellir 2024-02-18 19:33:57 +01:00
marc
2e3dad1c1b Added Thingvellir nomad volumes 2024-02-16 20:41:05 +01:00
marc
87a4d79c71 Thingvellir as nomad server 2024-02-16 18:21:24 +01:00
marc
3c23709394 Set thingvellir as consul server 2024-02-16 18:15:13 +01:00
marc
481914022c Modified nomad config 2024-02-13 21:20:43 +01:00
marc
14e9bcd7c3 Fixed secret name 2024-02-13 00:12:48 +01:00
marc
a09aedab3f Added consul server config 2024-02-13 00:07:13 +01:00
marc
ae58914cc2 Fixed secrets config 2024-02-12 22:19:40 +01:00
marc
ea276bb6d1 Refactored secrets (each host has their own) 2024-02-12 22:14:24 +01:00
marc
360adace1e Added consul and nomad to thingvellir 2024-02-12 21:59:30 +01:00
marc
3f06ae0cb2 Add agenix to thingvellir 2024-02-12 21:16:56 +01:00
marc
5cce9461c1 Added Thingvellir 2024-02-11 22:06:54 +01:00
marc
e716f7cb7d Added server options for nomad and consul 2024-02-11 20:58:26 +01:00
marc
042e246b1b Agenix + Consul 2024-02-11 16:06:03 +01:00
marc
fa12502c6e Structured documentation 2024-02-10 20:26:01 +01:00
marc
d0f78cc24f Added vultr dns config 2024-02-03 19:17:31 +01:00
marc
ddffe5c9c6 Config networking 2024-02-03 18:56:50 +01:00
marc
062a6f6fa9 More changes 2024-02-03 18:24:33 +01:00
marc
ccb5760edf Remove boot partition from vultr config 2024-02-03 18:15:22 +01:00
marc
31d93b8e19 Fixing vultr config 2024-02-03 17:41:12 +01:00
marc
06b2440df5 Added ssh 2024-02-03 17:27:40 +01:00
marc
e6b0e03a8c Added vultr config 2024-02-03 15:53:01 +00:00
marc
fbab268555 Added nextcloud 2024-01-21 18:43:08 +01:00
marc
d660b0fb36 Added Skype 2024-01-08 19:25:35 +01:00
marc
fffa64bc44 NixOS upgrade 23.05 -> 23.11 2023-12-29 17:05:01 +01:00
marc
b898d0af42 Added docker 2023-12-29 16:40:08 +01:00
marc
3713e4eca1 Removed ICE module from polybar 2023-12-17 18:53:25 +01:00
marc
f95a9948a6 Added ICE polybar module 2023-11-21 14:51:15 +01:00
marc
ad76fdf575 Added LSP Tailwind CSS to emacs 2023-11-21 13:52:59 +01:00
marc
0d63549504 Added netflix app 2023-11-21 13:52:33 +01:00
marc
596736b542 Fix python function symbol 2023-11-01 12:42:31 +01:00
marc
84a41bed0f Fix in steam (test) 2023-10-13 18:34:31 +02:00
marc
8b641e5614 Fixes in wifi and rofi-pass 2023-10-13 18:34:18 +02:00
marc
b72477414f Added simple wallpapers and changed polybar 2023-09-24 14:13:59 +02:00
marc
a8f33803ca Emacs NΛNO 2023-09-16 20:28:38 +02:00
marc
c6ddc5f30f Fixed polybar 2023-09-04 22:48:27 +02:00
marc
3ff5e00d29 Update nerd font glyphs 2023-09-04 21:45:23 +02:00
marc
3b76eed716 Nixos upgrade to 23.05 2023-09-04 21:45:02 +02:00
marc
f97659c7db Added clojure lsp mode 2023-08-21 22:53:56 +02:00
marc
10f4940ae1 Added clojure devenv template and more stuff 2023-08-06 17:35:41 +02:00
marc
e9bfdcc27e Add fzf and sshfs 2023-03-15 22:19:59 +01:00
marc
339a62d601 Added floating terminal and floating ipython 2023-02-12 17:27:28 +01:00
marc
9292866a87 Pass changes 2023-02-12 17:27:21 +01:00
marc
3aa810d7b3 Fixed bootloader and added/fixed rofi-pass 2023-01-20 21:00:19 +01:00
marc
e436a4be3b Added pass 2023-01-14 14:28:54 +01:00
marc
96028c6cad Added changes to develop with Jetbot 2022-12-24 18:02:30 +01:00
marc
177e96ad18 Added ros template to devenv 2022-12-11 17:30:25 +01:00
marc
098edb7f44 Use grub in reykjavik + add grub theme 2022-12-04 19:31:40 +01:00
marc
ccaca2cbe1 Config changes 2022-12-04 19:31:30 +01:00
marc
69e1dc2eb4 Added devenv and moved config files 2022-11-25 20:16:46 +01:00
marc
ebbbd0d179 Added NUR overlay 2022-11-25 16:34:57 +01:00
marc
23e0c5a9c8 Added base16 themes 2022-11-24 01:30:43 +01:00
marc
b907606818 Added rofi wifi menu 2022-11-21 20:26:18 +01:00
marc
05ab00e134 Added bluetooth rofi menu 2022-11-21 17:38:15 +01:00
marc
8617646685 Ricing rofi 2022-11-21 15:11:56 +01:00
marc
ae6a2fafa3 Added keybindings 2022-11-21 11:22:41 +01:00
marc
740f440400 Added direnv 2022-11-21 11:22:33 +01:00
marc
c335d7b082 Separated concerns in desktop environment 2022-11-19 17:13:59 +01:00
marc
2d20a13d7d Modularise firefox and rofi 2022-11-19 16:43:28 +01:00
marc
4fc20b6d4f Added vim as a module 2022-11-19 15:54:57 +01:00
marc
bba4b6028e Created mkHost function 2022-11-19 15:51:32 +01:00
marc
40d468b433 Move nvidia to a module 2022-11-19 15:42:26 +01:00
marc
890b05d352 Unified home and system modules! 2022-11-19 11:58:21 +01:00
marc
cfcc374a69 Working checkpoint towards unified modules 2022-11-16 23:51:57 +01:00
marc
882c04a6bf Partial way to unifying nixos and home-manager modules 2022-11-16 20:28:32 +01:00
marc
5c609ddd42 Added custom lib (stolen from hlissner's dotifles) 2022-11-14 21:19:51 +01:00
marc
e22078b34a Modified emacs config 2022-11-13 19:42:32 +01:00
marc
f2f5227384 First working doom emacs config 2022-11-13 17:46:29 +01:00
marc
4577adc53f More polybar changes and added discord 2022-11-07 19:40:18 +01:00
marc
5f41530745 Further polybar customization 2022-11-06 23:43:43 +01:00
marc
733246b059 Added bluetooth module in polybar 2022-11-06 20:14:36 +01:00
236 changed files with 8565 additions and 2926 deletions

View File

@@ -1,93 +1,13 @@
* Installing * NixOS
** [[file:docs/install.org][Installing]]
** Fresh system (nixos USB drive) *** Rebuilding
1. Open a nix-shell with git:
#+BEGIN_SRC bash #+BEGIN_SRC bash
nix-shell -p git sudo nixos-rebuild switch --impure --flake ".#${HOST}"
#+END_SRC
1. Clone the flake
#+BEGIN_SRC bash
git clone https://git.lajuntament.space/marc/samfelag.git
#+END_SRC
1. Partition the disk
1. Locate the disk
#+BEGIN_SRC bash
lsblk
#+END_SRC
1. Create a GPT partition table
#+BEGIN_SRC bash
sudo parted /dev/nvme0n1 -- mklabel gpt
#+END_SRC
1. Create the root partition
#+BEGIN_SRC bash
sudo parted /dev/nvme0n1 -- mkpart primary 512MB -8GB
#+END_SRC
1. Create the swap partition
#+BEGIN_SRC bash
sudo parted /dev/nvme0n1 -- mkpart primary linux-swap -8GB 100%
#+END_SRC
1. Create the boot partition
#+BEGIN_SRC bash
sudo parted /dev/nvme0n1 -- mkpart ESP fat32 1MB 512MB
sudo parted /dev/nvme0n1 -- set 3 esp on
#+END_SRC
1. Format the partitions
1. Root partition
#+BEGIN_SRC bash
sudo mkfs.ext4 -L nixos /dev/nvme0n1p1
#+END_SRC
1. Swap partition
#+BEGIN_SRC bash
sudo mkswap -L swap /dev/nvme0n1p2
#+END_SRC
1. Boot partition
#+BEGIN_SRC bash
sudo mkfs.fat -F 32 -n BOOT /dev/nvme0n1p3
#+END_SRC
1. Mount the filesystems
1. Root partition
#+BEGIN_SRC bash
sudo mount /dev/disk/by-label/nixos /mnt
#+END_SRC
1. Boot partition
#+BEGIN_SRC bash
sudo mkdir -p /mnt/boot
sudo mount /dev/disk/by-label/BOOT /mnt/boot
#+END_SRC
1. Swap partition (if needed)
#+BEGIN_SRC bash
sudo swapon /dev/disk/by-label/swap
#+END_SRC
1. Create the host nix configuration
If the host is not present under system/hosts, create a new folder for the host.
Generate the hardware configuration file, you can use nixos-generate-config as a base:
#+BEGIN_SRC bash
nixos-generate-config --dir <<host directory>> --no-filesystems
#+END_SRC
1. Install nixos!
#+BEGIN_SRC bash
sudo nixos-install --impure --root /mnt --flake .#reykjavik
#+END_SRC
1. Set up the user
You'll set the root password during the installation. You can then reboot and use the installed OS. First thing you'll have to do is log in as root and set the password for your user:
#+BEGIN_SRC bash
passwd marc
#+END_SRC #+END_SRC
** Modules
*** Desktop environment
**** Themeing
We use [[https://github.com/Misterio77/nix-colors][nix-colors]] to (try to) keep a consistent theme across all applications. This uses [[https://github.com/chriskempson/base16][base-16 themes]] (here is a [[https://github.com/chriskempson/base16/blob/main/styling.md][styiling guide]] for it).
* Samfelag Mesh
** [[file:docs/hosts.org][Hosts]]
** [[file:docs/consul.org][Consul]]

View File

@@ -1,7 +0,0 @@
window:
opacity: 0.85
font:
size: 8
normal:
family: Iosevka Nerd Font
style: Regular

View File

@@ -1,51 +0,0 @@
include-file = colours.ini
include-directory = modules
[bar/base]
dpi = 96
width = 100%
height = 32
offset-x = 0
offset-y = 0
font-0 = "Iosevka:size=10;2"
font-1 = "Iosevka:size=16;2"
font-2 = "Iosevka:size=22;4"
background = ${colours.trans}
foreground = ${colours.white}
border-bottom-size = 5
border-top-size = 5
border-left-size = 10
border-right-size = 10
border-bottom-colour = ${colours.trans}
border-top-colour = ${colours.trans}
border-left-colour = ${colours.trans}
border-right-colour = ${colours.trans}
spacing = 0
padding-left = 0
padding-right = 0
module-margin-left = 0
[bar/bottom]
inherit = bar/base
bottom = true
modules-left = workspaces
modules-right = volume paddinglite battery
tray-position = center
tray-maxsize = 28
[bar/top]
inherit = bar/base
bottom = false
modules-left =
modules-center = date
modules-right = i3-mode

View File

@@ -1,61 +0,0 @@
[colours]
trans = #0000
white = #fff
black = #000
gray = #555
blue- = #498AD4
blue = #2B6CB6
blue+ = #173B63
xanadu- = #B3BCB6
xanadu = #808F85
xanadu+ = #606C64
green- = #CAE2CE
green = #91C499
green+ = #61A86D
linen- = #F9F5F0
linen = #F2E9DC
linen+ = #DEC6A6
pear- = #E8EB5C
pear = #CFD11A
pear+ = #8F9112
orange- = #FEB548
orange = #F18F01
orange+ = #A26201
[colours/date]
bg = ${colours.pear}
fg = ${colours.gray}
[colours/battery]
full-bg = ${colours.green+}
full-fg = ${colours.gray}
charging-bg = ${colours.green}
charging-fg = ${colours.gray}
discharging-bg = ${colours.green}
discharging-fg = ${colours.gray}
low-bg = ${colours.orange}
low-fg = ${colours.gray}
[colours/workspaces]
focused-bg = ${colours.linen+}
focused-fg = ${colours.gray}
unfocused-bg = ${colours.linen}
unfocused-fg = ${colours.gray}
urgent-bg = ${colours.orange-}
urgent-fg = ${colours.gray}
[colours/i3-mode]
bg = ${colours.orange}
fg = ${colours.gray}
[colours/volume]
volume-bg = ${colours.blue}
volume-fg = ${colours.white}
muted-bg = ${colours.blue-}
muted-fg = ${colours.white}

View File

@@ -1,13 +0,0 @@
[module/padding]
type = custom/text
content = ||
content-padding = 1
content-foreground = ${colours.trans}
content-background = ${colours.trans}
[module/paddinglite]
type = custom/text
content = |
content-padding = .5
content-foreground = ${colours.trans}
content-background = ${colours.trans}

View File

@@ -1 +0,0 @@
include-file = bars/bars.ini

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
[general]
import = ["~/.config/alacritty/theme.toml"]
[font]
size = 12
[font.normal]
family = "Iosevka Nerd Font"
style = "Regular"
[window]
opacity = 0.85

View File

@@ -0,0 +1,15 @@
{
"tls": {
"defaults": {
"verify_incoming": false,
"verify_outgoing": true,
"ca_file": "/etc/consul.d/certs/consul-agent-ca.pem"
},
"internal_rpc": {
"verify_server_hostname": true
}
},
"auto_encrypt": {
"tls": true
}
}

View File

@@ -0,0 +1,25 @@
{
"datacenter": "samfelag",
"bind_addr": "{{ GetInterfaceIP \"tailscale0\" }}",
"advertise_addr": "{{ GetInterfaceIP \"tailscale0\" }}",
"client_addr": "{{ GetInterfaceIP \"tailscale0\" }} 127.0.0.1",
"ports": {
"grpc_tls": 8502
},
"acl": {
"enabled": true,
"default_policy": "allow",
"enable_token_persistence": true
},
"connect": {
"enabled": true
},
"performance": {
"raft_multiplier": 1
}
}

View File

@@ -0,0 +1,5 @@
{
"retry_join": [
"100.99.167.21"
]
}

View File

@@ -0,0 +1,22 @@
{
"server": true,
"bootstrap_expect": 1,
"ui_config": {
"enabled": true
},
"tls": {
"defaults": {
"verify_incoming": true,
"verify_outgoing": true,
"ca_file": "/etc/consul.d/certs/consul-agent-ca.pem",
"cert_file": "/etc/consul.d/certs/samfelag-server-consul.pem",
"key_file": "/etc/consul.d/certs/samfelag-server-consul-key.pem"
},
"internal_rpc": {
"verify_server_hostname": true
}
},
"auto_encrypt": {
"allow_tls": true
}
}

View File

@@ -1,37 +1,32 @@
;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- ;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
;; Place your private configuration here! Remember, you do not need to run 'doom
;; sync' after modifying this file!
;; Some functionality uses this to identify you, e.g. GPG configuration, email ;; Some functionality uses this to identify you, e.g. GPG configuration, email
;; clients, file templates and snippets. ;; clients, file templates and snippets.
(setq user-full-name "Marc Sastre Rienitz" (setq user-full-name "Marc Sastre Rienitz"
user-mail-address "marc@sastre.cat") user-mail-address "marc@sastre.cat")
;; Doom exposes five (optional) variables for controlling fonts in Doom. Here
;; are the three important ones:
;;
;; + `doom-font'
;; + `doom-variable-pitch-font'
;; + `doom-big-font' -- used for `doom-big-font-mode'; use this for
;; presentations or streaming.
;;
;; They all accept either a font-spec, font string ("Input Mono-12"), or xlfd
;; font string. You generally only need these two:
;; (setq doom-font (font-spec :family "monospace" :size 12 :weight 'semi-light)
;; doom-variable-pitch-font (font-spec :family "sans" :size 13))
(setq doom-font (font-spec :family "Iosevka" :size 15))
;; There are two ways to load a theme. Both assume the theme is installed and
;; available. You can either set `doom-theme' or manually load a theme with the
;; `load-theme' function. This is the default:
(setq doom-theme 'doom-zenburn)
;; This determines the style of line numbers in effect. If set to `nil', line ;; This determines the style of line numbers in effect. If set to `nil', line
;; numbers are disabled. For relative line numbers, set this to `relative'. ;; numbers are disabled. For relative line numbers, set this to `relative'.
(setq display-line-numbers-type t) (setq display-line-numbers-type t)
;; Fonts
(setq doom-font (font-spec :family "Iosevka Nerd Font" :size 18))
(setq doom-symbol-font (font-spec :family "Iosevka Nerd Font" :size 18))
(setq doom-emoji-font (font-spec :family "Noto Color Emoji" :size 18))
;; Themeing
(use-package base16-theme
:init (add-to-list 'custom-theme-load-path "~/.config/doom/themes")
:ensure t
:config
(load-theme 'base16-samfelag t))
;; (after! doom-themes
;; (load-theme 'doom-nano-dark t))
;; (use-package! doom-nano-modeline
;; :config
;; (doom-nano-modeline-mode 1)
;; (global-hide-mode-line-mode 1))
;; Here are some additional functions/macros that could help you configure Doom: ;; Here are some additional functions/macros that could help you configure Doom:
;; ;;
@@ -54,6 +49,18 @@
(setq-default tab-width 4) (setq-default tab-width 4)
;; -----------------------------------------------------------------------------
;; Emojify
;; -----------------------------------------------------------------------------
(use-package! emojify
:config
(when (member "Noto Color Emoji" (font-family-list))
(set-fontset-font
t 'emoji (font-spec :family "Noto Color Emoji") nil 'prepend))
(setq emojify-display-style 'image)
(setq emojify-emoji-styles '(unicode)))
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
;; Projectile ;; Projectile
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
@@ -67,7 +74,7 @@
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
(use-package vterm (use-package vterm
:config :config
(setq vterm-shell "fish")) (setq vterm-shell "zsh"))
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
@@ -76,6 +83,20 @@
(use-package parinfer (use-package parinfer
:defer t) :defer t)
;; -----------------------------------------------------------------------------
;; LSP
;; -----------------------------------------------------------------------------
;; (use-package lsp-mode
;; :init
;; :hook (;;
;; (clojure-mode . lsp-deferred)
;; (python-mode . lsp-deferred)
;; ;; if you want which-key integration
;; (lsp-mode . lsp-enable-which-key-integration))
;; :commands (lsp lsp-deferred))
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
;; Python ;; Python
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
@@ -93,122 +114,49 @@
:config :config
(setq py-autopep8-options '("--max-line-length=120"))) (setq py-autopep8-options '("--max-line-length=120")))
(use-package pipenv (use-package pipenv
:config :config
(setq pipenv-with-projectile t) (setq pipenv-with-projectile t)
(setenv "PIPENV_MAX_DEPTH" "10")) (setenv "PIPENV_MAX_DEPTH" "10"))
;; -----------------------------------------------------------------------------
;; Web (HTML + CSS)
;; -----------------------------------------------------------------------------
;; (use-package! lsp-tailwindcss)
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
;; Org ;; Org
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
(setq org-directory "~/org")
(setq org-directory "~/org/") (setq org-agenda-files (directory-files-recursively "~/org/agenda" "\\.org$"))
(defun org-set-trello-mode ()
(let ((filename (buffer-file-name (current-buffer))))
(when (and filename (string= "trello" (file-name-extension filename)))
(org-trello-mode))))
(use-package org
:config
(add-to-list 'auto-mode-alist '("\\.trello$" . org-mode))
(add-hook! 'org-mode-hook 'org-set-trello-mode))
(use-package org-roam
:ensure t
:init
(setq org-roam-v2-ack t)
:custom
(org-roam-directory "~/org-roam")
(org-roam-capture-templates
'(("d" "default" plain "%?"
:target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
:unnarrowed t)
("m" "màquina" plain (file "~/org-roam/templates/maquina.org")
:target (file "%<%Y%m%d%H%M%S>-${slug}.org")
:unnarrowed t)
("s" "software" plain (file "~/org-roam/templates/software.org")
:target (file "%<%Y%m%d%H%M%S>-${slug}.org")
:unnarrowed t)))
:config
(org-roam-setup))
(use-package org-trello
:config
;; (setq org-trello-current-prefix-keybinding "SPC r")
(defun org-trello-bindings ()
"Set the keybindings for org-trello mode"
(defun set-key (key fn)
(evil-define-key* 'normal org-trello-mode-map
(kbd (concat "SPC r" " " key)) fn))
(set-key "v" 'org-trello-version)
(set-key "i" 'org-trello-install-key-and-token)
(set-key "I" 'org-trello-install-board-metadata)
(set-key "c" 'org-trello-sync-card)
(set-key "s" 'org-trello-sync-buffer)
(set-key "a" 'org-trello-assign-me)
(set-key "d" 'org-trello-check-setup)
(set-key "D" 'org-trello-delete-setup)
(set-key "b" 'org-trello-create-board-and-install-metadata)
(set-key "k" 'org-trello-kill-entity)
(set-key "K" 'org-trello-kill-cards)
(set-key "a" 'org-trello-archive-card)
(set-key "A" 'org-trello-archive-cards)
(set-key "j" 'org-trello-jump-to-trello-card)
(set-key "J" 'org-trello-jump-to-trello-board)
(set-key "C" 'org-trello-add-card-comments)
(set-key "o" 'org-trello-show-card-comments)
(set-key "l" 'org-trello-show-card-labels)
(set-key "u" 'org-trello-update-board-metadata)
(set-key "h" 'org-trello-help-describing-bindings))
(add-hook! 'org-trello-mode-hook 'org-trello-bindings))
(use-package! websocket
:after org-roam)
(use-package! org-roam-ui
:after org-roam ;; or :after org
;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have
;; a hookable mode anymore, you're advised to pick something yourself
;; if you don't care about startup time, use
;; :hook (after-init . org-roam-ui-mode)
:config
(setq org-roam-ui-sync-theme t
org-roam-ui-follow t
org-roam-ui-update-on-save t
org-roam-ui-open-on-start nil))
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
;; Lilypond ;; Agenix
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
(load! "modules/agenix.el")
(setq agenix-age-program "age")
(setq agenix-agenix-program "agenix")
(load-library "lilypond-mode")
(add-to-list 'auto-mode-alist '("\\.ly$" . LilyPond-mode))
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
;; Appearance - Prettify ;; Appearance - Prettify
;; ----------------------------------------------------------------------------- ;; -----------------------------------------------------------------------------
(load! "prettify-utils.el") (load! "modules/prettify-utils.el")
(pretty-hook python-mode (pretty-hook python-mode
;; ("def" "𝙛") ("def" " 󰊕 ")
;; ("class" "𝙘") ("class" "𝙘")
("None" "") ("None" "")
("lambda" "λ") ("lambda" "λ")
("not in" "") ("not in" "")
("in" "")) ("in" ""))
(pretty-hook emacs-lisp-mode) (pretty-hook emacs-lisp-mode)
;; ("defun" "𝙛") ;; ("defun" "𝙛")
;; (pretty-hook org-mode
(pretty-hook org-mode ;; ("[ ]" "☐")
("[ ]" "") ;; ("[X]" "☑"))
("[X]" ""))

View File

@@ -30,20 +30,21 @@
doom ; what makes DOOM look the way it does doom ; what makes DOOM look the way it does
doom-dashboard ; a nifty splash screen for Emacs doom-dashboard ; a nifty splash screen for Emacs
;; doom-quit ; DOOM quit-message prompts when you quit Emacs ;; doom-quit ; DOOM quit-message prompts when you quit Emacs
;;(emoji +unicode) ; 🙂 (emoji +unicode) ; 🙂
fill-column ; a `fill-column' indicator ;; fill-column ; a `fill-column' indicator
hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
;;hydra ;;hydra
;;indent-guides ; highlighted indent columns ;;indent-guides ; highlighted indent columns
(ligatures +iosevka) ; ligatures and symbols to make your code pretty again (ligatures
+iosevka) ; ligatures and symbols to make your code pretty again
;;minimap ; show a map of the code on the side ;;minimap ; show a map of the code on the side
modeline ; snazzy, Atom-inspired modeline, plus API ;;modeline ; snazzy, Atom-inspired modeline, plus API
;;nav-flash ; blink cursor line after big motions ;;nav-flash ; blink cursor line after big motions
neotree ; a project drawer, like NERDTree for vim ;;neotree ; a project drawer, like NERDTree for vim
ophints ; highlight the region an operation acts on ophints ; highlight the region an operation acts on
(popup +defaults) ; tame sudden yet inevitable temporary windows (popup +defaults) ; tame sudden yet inevitable temporary windows
;;tabs ; a tab bar for Emacs ;;tabs ; a tab bar for Emacs
;;treemacs ; a project drawer, like neotree but cooler treemacs ; a project drawer, like neotree but cooler
unicode ; extended unicode support for various languages unicode ; extended unicode support for various languages
vc-gutter ; vcs diff in the fringe vc-gutter ; vcs diff in the fringe
vi-tilde-fringe ; fringe tildes to mark beyond EOB vi-tilde-fringe ; fringe tildes to mark beyond EOB
@@ -86,14 +87,14 @@
:tools :tools
;;ansible ;;ansible
;;debugger ; FIXME stepping through code, to help you add bugs ;;debugger ; FIXME stepping through code, to help you add bugs
;;direnv direnv
;;docker ;;docker
;;editorconfig ; let someone else argue about tabs vs spaces ;;editorconfig ; let someone else argue about tabs vs spaces
;;ein ; tame Jupyter notebooks with emacs ;;ein ; tame Jupyter notebooks with emacs
(eval +overlay) ; run code, run (also, repls) (eval +overlay) ; run code, run (also, repls)
;;gist ; interacting with github gists ;;gist ; interacting with github gists
lookup ; navigate your code and its documentation lookup ; navigate your code and its documentation
;;lsp (lsp +eglot)
magit ; a git porcelain for Emacs magit ; a git porcelain for Emacs
;;make ; run make tasks from Emacs ;;make ; run make tasks from Emacs
;;pass ; password manager for nerds ;;pass ; password manager for nerds
@@ -112,7 +113,8 @@
:lang :lang
;;agda ; types of types of types of types... ;;agda ; types of types of types of types...
;;cc ; C/C++/Obj-C madness ;;cc ; C/C++/Obj-C madness
clojure ; java with a lisp (clojure
+lsp) ; java with a lisp
;;common-lisp ; if you've seen one lisp, you've seen them all ;;common-lisp ; if you've seen one lisp, you've seen them all
;;coq ; proofs-as-programs ;;coq ; proofs-as-programs
;;crystal ; ruby at the speed of c ;;crystal ; ruby at the speed of c
@@ -144,23 +146,24 @@
;;lua ; one-based indices? one-based indices ;;lua ; one-based indices? one-based indices
markdown ; writing docs for people to ignore markdown ; writing docs for people to ignore
;;nim ; python + lisp at the speed of c ;;nim ; python + lisp at the speed of c
;;nix ; I hereby declare "nix geht mehr!" nix ; I hereby declare "nix geht mehr!"
;;ocaml ; an objective camel ;;ocaml ; an objective camel
(org (org
+journal +journal
+roam2
+pretty) ; organize your plain life in plain text +pretty) ; organize your plain life in plain text
php ; perl's insecure younger brother php ; perl's insecure younger brother
;;plantuml ; diagrams for confusing people more ;;plantuml ; diagrams for confusing people more
;;purescript ; javascript, but functional ;;purescript ; javascript, but functional
python ; beautiful is better than ugly (python
+lsp) ; beautiful is better than ugly
;;qt ; the 'cutest' gui framework ever ;;qt ; the 'cutest' gui framework ever
;;racket ; a DSL for DSLs ;;racket ; a DSL for DSLs
;;raku ; the artist formerly known as perl6 ;;raku ; the artist formerly known as perl6
rest ; Emacs as a REST client rest ; Emacs as a REST client
;;rst ; ReST in peace ;;rst ; ReST in peace
;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
;;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() (rust
+lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
;;scala ; java, but good ;;scala ; java, but good
;;scheme ; a fully conniving family of lisps ;;scheme ; a fully conniving family of lisps
sh ; she sells {ba,z,fi}sh shells on the C xor sh ; she sells {ba,z,fi}sh shells on the C xor

View File

@@ -0,0 +1,231 @@
;;; agenix.el --- Decrypt and encrypt agenix secrets -*- lexical-binding: t -*-
;; Copyright (C) 2022-2023 Tomasz Maciosowski (t4ccer)
;; Author: Tomasz Maciosowski <t4ccer@gmail.com>
;; Maintainer: Tomasz Maciosowski <t4ccer@gmail.com>
;; Package-Requires: ((emacs "27.1"))
;; URL: https://github.com/t4ccer/agenix.el
;; Version: 1.0
;;
;; Modified version by Marc Sastre that allows subdirectories in the secrets folder.
;; This file is NOT part of GNU Emacs.
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Fully transparent editing of agenix secrets. Open a file, edit it, save it and it will be
;; encrypted automatically.
;;; Code:
(defcustom agenix-age-program "age"
"The age program."
:group 'agenix
:type 'string)
(defcustom agenix-key-files '("~/.ssh/id_ed25519" "~/.ssh/id_rsa")
"List of age key files."
:group 'agenix
:type '(repeat string))
(defcustom agenix-pre-mode-hook nil
"Hook to run before entering `agenix-mode'.
Can be used to set up age binary path."
:group 'agenix
:type 'hook)
(defvar-local agenix--encrypted-fp nil)
(defvar-local agenix--keys nil)
(defvar-local agenix--undo-list nil)
(defvar-local agenix--point nil)
(define-derived-mode agenix-mode text-mode "agenix"
"Major mode for agenix files.
Don't use directly, use `agenix-mode-if-with-secrets-nix' to ensure that
secrets.nix exists."
(read-only-mode 1)
(run-hooks 'agenix-pre-mode-hook)
(agenix-decrypt-buffer)
(goto-char (point-min))
(setq buffer-undo-list nil)
(setq require-final-newline nil)
(setq buffer-auto-save-file-name nil)
(setq write-contents-functions '(agenix-save-decrypted))
;; Reverting loads encrypted file back to the buffer, so we need to decrypt it
(add-hook 'after-revert-hook
(lambda () (when (eq major-mode 'agenix-mode) (agenix-decrypt-buffer)))))
(defun agenix--file-search-upward (directory file)
"Search DIRECTORY for FILE and return its full path if found, or NIL if not.
If FILE is not found in DIRECTORY, the parent of DIRECTORY will be searched."
(let ((parent-dir (file-truename (concat (file-name-directory directory) "../")))
(current-path (if (not (string= (substring directory (- (length directory) 1)) "/"))
(concat directory "/" file)
(concat directory file))))
(if (file-exists-p current-path)
current-path
(when (and (not (string= (file-truename directory) parent-dir))
(< (length parent-dir) (length (file-truename directory))))
(agenix--file-search-upward parent-dir file)))))
(defun agenix--secrets-nix-path ()
"Search for secrets.nix file in the current directory or any parent directory.
Return it if found"
(agenix--file-search-upward "./" "secrets.nix"))
(defun agenix--relative-buffer-path ()
"Return the filename of the current buffer relative to the secrets.nix path."
(file-relative-name
(buffer-file-name)
(file-name-directory (agenix--secrets-nix-path))))
(defun agenix--buffer-string* (buffer)
"Like `buffer-string' but read from BUFFER parameter."
(with-current-buffer buffer
(buffer-substring-no-properties (point-min) (point-max))))
(defun agenix--with-temp-buffer (func)
"Like `with-temp-buffer' but doesn't actually switch the buffer.
FUNC takes a temporary buffer that will be disposed after the call."
(let* ((age-buf (generate-new-buffer "*age-buf*"))
(res (funcall func age-buf)))
(kill-buffer age-buf)
res))
(defun agenix--process-exit-code-and-output (program &rest args)
"Run PROGRAM with ARGS and return the exit code and output in a list."
(agenix--with-temp-buffer
(lambda (buf) (list (apply #'call-process program nil buf nil args)
(agenix--buffer-string* buf)))))
;;;###autoload
(defun agenix-decrypt-buffer (&optional encrypted-buffer)
"Decrypt ENCRYPTED-BUFFER in place.
If ENCRYPTED-BUFFER is unset or nil, decrypt the current buffer."
(interactive
(when current-prefix-arg
(list (read-buffer "Encrypted buffer: " (current-buffer) t))))
(with-current-buffer (or encrypted-buffer (current-buffer))
(let* ((nix-res (apply #'agenix--process-exit-code-and-output "nix-instantiate"
(list "--strict" "--json" "--eval" "--expr"
(format
"(import %s).\"%s\".publicKeys"
(agenix--secrets-nix-path)
(agenix--relative-buffer-path)))))
(nix-exit-code (car nix-res))
(nix-output (car (cdr nix-res))))
(if (/= nix-exit-code 0)
(warn "Nix evaluation error.
Probably file %s is not declared as a secret in 'secrets.nix' file.
Error: %s" (buffer-file-name) nix-output)
(let* ((keys (json-parse-string nix-output :array-type 'list))
(age-flags (list "--decrypt")))
;; Add all user's keys to the age command
(dolist (key-path agenix-key-files)
(when (file-exists-p (expand-file-name key-path))
(setq age-flags
(nconc age-flags (list "--identity" (expand-file-name key-path))))))
;; Add file-path to decrypt to the age command
(setq age-flags (nconc age-flags (list (buffer-file-name))))
(setq agenix--encrypted-fp (buffer-file-name))
(setq agenix--keys keys)
;; Check if file already exists
(if (not (file-exists-p (buffer-file-name)))
(progn
(message "Not decrypting. File %s does not exist and will be created when you \
will save this buffer." (buffer-file-name))
(read-only-mode -1))
(let*
((age-res
(apply #'agenix--process-exit-code-and-output agenix-age-program age-flags))
(age-exit-code (car age-res))
(age-output (car (cdr age-res))))
(if (= 0 age-exit-code)
(progn
;; Replace buffer with decrypted content
(read-only-mode -1)
(erase-buffer)
(insert age-output)
;; Mark buffer as not modified
(set-buffer-modified-p nil)
(setq buffer-undo-list agenix--undo-list))
(error age-output))))
(when agenix--point
(goto-char agenix--point)))))))
;;;###autoload
(defun agenix-save-decrypted (&optional unencrypted-buffer)
"Encrypt UNENCRYPTED-BUFFER back to the original .age file.
If UNENCRYPTED-BUFFER is unset or nil, use the current buffer."
(interactive
(when current-prefix-arg
(list (read-buffer "Unencrypted buffer: " (current-buffer) t))))
(with-current-buffer (or unencrypted-buffer (current-buffer))
(let* ((age-flags (list "--encrypt")))
(progn
(dolist (k agenix--keys)
(setq age-flags (nconc age-flags (list "--recipient" k))))
(setq age-flags (nconc age-flags (list "-o" agenix--encrypted-fp)))
(let* ((decrypted-text (buffer-string))
(age-res
(agenix--with-temp-buffer
(lambda (buf)
(list
(apply #'call-process-region
decrypted-text nil
agenix-age-program
nil
buf
t
age-flags)
(agenix--buffer-string* buf))))))
(when (/= 0 (car age-res))
(error (car (cdr age-res))))
(setq agenix--point (point))
(setq agenix--undo-list buffer-undo-list)
(revert-buffer :ignore-auto :noconfirm :preserve-modes)
(set-buffer-modified-p nil)
t)))))
;;;###autoload
(defun agenix-mode-if-with-secrets-nix ()
"Enable `agenix-mode' if the current buffer is in a directory with secrets.nix."
(interactive)
(when (agenix--secrets-nix-path)
(agenix-mode)))
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.age\\'" . agenix-mode-if-with-secrets-nix))
(provide 'agenix)
;;; agenix.el ends here

View File

@@ -1,5 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; $DOOMDIR/packages.el
;; To install a package with Doom you must declare them here and run 'doom sync' ;; To install a package with Doom you must declare them here and run 'doom sync'
;; on the command line, then restart Emacs for the changes to take effect -- or ;; on the command line, then restart Emacs for the changes to take effect -- or
@@ -49,18 +48,35 @@
;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) ;; ...Or *all* packages (NOT RECOMMENDED; will likely break things)
;(unpin! t) ;(unpin! t)
(package! base16-theme)
(package! parinfer) (package! parinfer)
;; Env
(package! inheritenv)
;; Editor ;; Editor
(package! dot-mode) (package! dot-mode)
;; Python ;; Python
(package! py-autopep8) (package! py-autopep8)
;; Web (HTML + CSS)
(package! lsp-tailwindcss :recipe (:host github :repo "merrickluo/lsp-tailwindcss"))
;; Org ;; Org
(package! org-trello)
;; Org-Roam UI ;; Org-Roam UI
(unpin! org-roam) ; (unpin! org-roam)
(package! websocket) ; (package! websocket)
(package! org-roam-ui :recipe (:host github :repo "org-roam/org-roam-ui" :files ("*.el" "out"))) ; (package! org-roam-ui :recipe (:host github :repo "org-roam/org-roam-ui" :files ("*.el" "out")))
(package! doom-nano-modeline
:recipe (:host github
:repo "ronisbr/doom-nano-modeline"))
;; Agenix
;; (package! agenix
;; :recipe (:host github
;; :repo "t4ccer/agenix.el"
;; :branch "main"
;; :files ("*.el")))

View File

@@ -0,0 +1,149 @@
*{
all: unset;
font-family: Iosevka;
font-size: 16px;
}
/** Top bar **/
.top-bar {
padding-left: 16px;
padding-right: 24px;
}
tooltip.background {
background-color: $base00;
border-radius: 10px;
color: $base07;
}
tooltip label {
margin: 6px;
}
.module {
margin: 0px 0px 0px 0px;
border-radius: 0px 0px 0px 0px;
padding-left: 8px;
padding-right: 8px;
}
.icon {
font-size: 24px;
padding-right: 8px;
}
.separator {
padding-left: 4px;
padding-right: 4px;
color: $base02;
}
/** Bluetooth **/
.bluetooth {
color: $base0D;
}
.bluetooth.icon {
padding-right: 4px;
}
.bluetooth-text {
padding-left: 8px;
}
/** Wifi **/
.wifi {
color: $base0D;
}
.wifi.icon {
padding-right: 12px;
}
.wifi-text {
padding-left: 8px;
}
/** Volume **/
.volume {
color: $base0A;
}
.volume-mute {
color: $base04;
}
.volume-bar {
padding-left: 8px;
highlight {
background-color: $base0A;
border-radius: 10px;
}
trough {
background-color: $base04;
min-height: 10px;
border-radius: 10px;
}
}
/** Battery **/
.battery.charging {
color: $base0B;
}
.battery.discharging {
padding-right: 0px;
color: $base04;
}
.battery-bar {
padding-left: 8px;
progress {
background-color: $base0B;
border-radius: 10px;
min-height: 10px;
}
trough {
background-color: $base04;
border-radius: 10px;
min-height: 10px;
min-width: 60px;
}
}
/** Clock **/
.clock {
color: $base05;
}
.clock-time {
padding-left: 4px;
padding-right: 4px;
}
.clock-date {
padding-left: 4px;
}
.clock-year {
padding-bottom: 8px;
font-size: 75%;
}
/** Workspaces **/
.workspace-entry {
padding-left: 8px;
padding-right: 8px;
}
.workspace-entry.occupied {
color: $base06;
}
.workspace-entry.empty {
color: $base02;
}
.workspace-entry.current {
color: $base0C;
}

View File

@@ -0,0 +1,44 @@
(include "./widgets/common.yuck")
(include "./widgets/battery.yuck")
(include "./widgets/bluetooth.yuck")
(include "./widgets/clock.yuck")
(include "./widgets/volume.yuck")
(include "./widgets/workspaces.yuck")
(include "./widgets/wifi.yuck")
(defwindow top-bar
:monitor 0
:geometry (geometry :x "0%"
:y "8px"
:width "100%"
:height "40px"
:anchor "top center")
:stacking "fg"
:exclusive "true"
(box :class "top-bar"
:orientation "h"
:space-evenly "true"
(bar-left)
(bar-center)
(bar-right)))
(defwidget bar-left []
(box :halign "start"
:orientation "h"
(workspaces-module)))
(defwidget bar-center []
(box :halign "center"
:orientation "h"))
(defwidget bar-right []
(box :halign "end"
:orientation "h"
:space-evenly "false"
(bluetooth-module)
(wifi-module)
(battery-module)
(volume-module)
(sep)
(clock-module)))

2
config/eww/eww.scss Normal file
View File

@@ -0,0 +1,2 @@
@import './colour-scheme.scss'
@import './bars/top-bar.scss'

1
config/eww/eww.yuck Normal file
View File

@@ -0,0 +1 @@
(include "./bars/top-bar.yuck")

View File

@@ -0,0 +1,6 @@
#!/usr/bin/env bash
hyprctl monitors -j | jq '.[] | select(.focused) | .activeWorkspace.id'
socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - |
stdbuf -o0 awk -F '>>|,' -e '/^workspace>>/ {print $2}' -e '/^focusedmon>>/ {print $3}'

View File

@@ -0,0 +1,7 @@
#!/bin/env bash
amixer sget Master | \
grep 'Left:' | \
sed -e 's/[^[]*\[\([0-9]*\)%\][^[]\[\(\w*\)\]/{"volume": \1, "muted": \2}/' \
-e 's/on/false/' \
-e 's/off/true/'

View File

@@ -0,0 +1,8 @@
#!/bin/env bash
CONN_INFO=$(nmcli -g in-use,ssid,signal dev wifi list | \
grep "^*" | \
sed -e 's/\*:\([^:]*\):\([0-9]*\)/ ,"ssid": "\1", "signal": \2/')
CONNECTED=$([[ -z $CONN_INFO ]] && echo "false" || echo "true")
echo "{\"connected\": \"$CONNECTED\"$CONN_INFO}"

View File

@@ -0,0 +1,11 @@
#!/bin/env bash
spaces (){
WORKSPACE_WINDOWS=$(hyprctl workspaces -j | jq 'map({key: .id | tostring, value: .windows}) | from_entries')
seq 1 6 | jq --argjson windows "${WORKSPACE_WINDOWS}" --slurp -Mc 'map(tostring) | map({id: ., windows: ($windows[.]//0)})'
}
spaces
socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | while read -r line; do
spaces
done

View File

@@ -0,0 +1,21 @@
(defvar battery-reveal false)
(defwidget battery-module []
(eventbox :onhover "${EWW_CMD} update battery-reveal=true"
:onhoverlost "${EWW_CMD} update battery-reveal=false"
(box :class "module battery ${EWW_BATTERY.BAT0.status == "Discharging" ? "discharging" : "charging"}"
:orientation "h"
:space-evenly "false"
:tooltip "Battery: ${EWW_BATTERY.BAT0.capacity}%"
(label :text {EWW_BATTERY.BAT0.status == "Discharging" ?
EWW_BATTERY.BAT0.capacity < 10 ? "󰂎" : EWW_BATTERY.BAT0.capacity < 30 ? "󱊡" : EWW_BATTERY.BAT0.capacity < 70 ? "󱊢" : "󱊣" :
EWW_BATTERY.BAT0.capacity < 10 ? "󰢟" : EWW_BATTERY.BAT0.capacity < 30 ? "󱊤" : EWW_BATTERY.BAT0.capacity < 70 ? "󱊥" : "󱊦"}
:class "battery icon")
(revealer :transition "slideleft"
:duration "750ms"
:reveal {battery-reveal}
(progress :class "battery-bar"
:orientation "h"
:valign "center"
:width 60
:value {EWW_BATTERY.BAT0.capacity})))))

View File

@@ -0,0 +1,29 @@
(defvar bluetooth-reveal false)
(defpoll bluetooth-status
:initial ""
:interval "10s"
"bluetoothctl show | grep -q \"Powered: yes\" && { [[ $(bluetoothctl devices Connected) ]] && echo \"connected\" || echo \"on\"; } || echo \"off\"")
(defpoll bluetooth-devices
:initial ""
:interval "20s"
"for device in $(bluetoothctl devices Connected | grep Device | cut -d ' ' -f 2); do bluetoothctl info $device | grep \"Alias\" | cut -d ' ' -f 2-; done;")
(defwidget bluetooth-module []
(eventbox :onhover "${EWW_CMD} update bluetooth-reveal=true"
:onhoverlost "${EWW_CMD} update bluetooth-reveal=false"
:onclick "$HOME/.config/rofi/menus/bluetooth/bluetooth.sh &"
(box :class "module bluetooth"
:orientation "h"
:space-evenly "false"
:tooltip {bluetooth-status == "connected" ? bluetooth-devices :
bluetooth-status == "on" ? "Bluetooth: On" : "Bluetooth: Off"}
(label :text {bluetooth-status == "connected" ? "󰂱" :
bluetooth-status == "on" ? "󰂯" : "󰂲"}
:class "bluetooth icon")
(revealer :transition "slideleft"
:duration "750ms"
:reveal {bluetooth-reveal && winfo.connected}
(label :class "bluetooth-text"
:text {bluetooth-status == "connected" ? "Connected" :
bluetooth-status == "on" ? "On" : "Off"})))))

View File

@@ -0,0 +1,21 @@
(defpoll clock-time :interval "1s" "date +\"%H:%M:%S\"")
(defpoll clock-date :interval "1m" "date +\"%d/%m\"")
(defpoll clock-year :interval "1h" "date +\"%Y\"")
(defvar date-reveal false)
(defwidget clock-module []
(eventbox :onhover "${EWW_CMD} update date-reveal=true"
:onhoverlost "${EWW_CMD} update date-reveal=false"
(box :class "module clock"
:orientation "h"
:space-evenly "false"
(label :text clock-time
:class "clock-time")
(revealer :transition "slideleft"
:duration "750ms"
:reveal {date-reveal}
(box :orientation "h"
(label :text clock-date
:class "clock-date")
(label :text clock-year
:class "clock-year"))))))

View File

@@ -0,0 +1,3 @@
(defwidget sep []
(label :text "|"
:class "separator"))

View File

@@ -0,0 +1,26 @@
(defpoll vinfo
:initial "{\"volume\": 0, \"muted\": false}"
:interval "1s"
"bash ~/.config/eww/scripts/get-volume-info.sh")
(defvar volume-reveal false)
(defwidget volume-module []
(eventbox :onhover "${EWW_CMD} update volume-reveal=true"
:onhoverlost "${EWW_CMD} update volume-reveal=false"
(box :class "module volume"
:orientation "h"
:space-evenly false
:tooltip {vinfo.muted? "muted" : "Volume: ${vinfo.volume}%"}
(label :text {vinfo.muted ? "󰝟" : vinfo.volume < 10 ? "󰕿" : vinfo.volume < 70 ? "󰖀" : "󰕾"}
:class "volume icon ${vinfo.muted ? "volume-mute" : ""}")
(revealer :transition "slideleft"
:duration "750ms"
:reveal {volume-reveal && !vinfo.muted}
(scale :class "volume-bar"
:orientation "h"
:valign "center"
:width 60
:min 0
:max 101
:value {vinfo.volume}
:onchange "amixer sset Master {}% > /dev/null")))))

View File

@@ -0,0 +1,25 @@
(defvar wifi-reveal false)
(defpoll winfo
:initial "{\"connected\": \"false\"}"
:interval "10s"
"bash ~/.config/eww/scripts/get-wifi-info.sh")
(defwidget wifi-module []
(eventbox :onhover "${EWW_CMD} update wifi-reveal=true"
:onhoverlost "${EWW_CMD} update wifi-reveal=false"
:onclick "$HOME/.config/rofi/menus/wifi/wifi.sh &"
(box :class "module wifi"
:orientation "h"
:space-evenly "false"
:tooltip {winfo.connected ? "Signal: ${winfo.signal}%" : "Disconnected"}
(label :text { !winfo.connected ? "󰤭" :
winfo.signal < 25 ? "󰤟" :
winfo.signal < 50 ? "󰤢" :
winfo.signal < 75 ? "󰤥" : "󰤨"}
:class "wifi icon")
(revealer :transition "slideleft"
:duration "750ms"
:reveal {wifi-reveal && winfo.connected}
(label :class "wifi-text"
:text {winfo.connected ? winfo.ssid : "Disconnected"})))))

View File

@@ -0,0 +1,10 @@
(deflisten workspaces :initial "[]" "bash ~/.config/eww/scripts/get-workspaces.sh")
(deflisten current_workspace :initial "1" "bash ~/.config/eww/scripts/get-active-workspace.sh")
(defwidget workspaces-module []
(box :space-evenly true
(label :text "${workspaces}${current_workspace}"
:visible false)
(for workspace in workspaces
(eventbox :onclick "hyprctl dispatch workspace ${workspace.id}"
(label :text "${workspace.id == current_workspace ? "" : ""}"
:class "workspace-entry ${workspace.id == current_workspace ? "current" : ""} ${workspace.windows > 0 ? "occupied" : "empty"}")))))

View File

@@ -0,0 +1,72 @@
#!/usr/bin/env bash
# Dependencies:
# - amixer
# - pactl
# - jq
# - libnotify
ACTION=$1
get_brightness() {
brightnessctl | \
grep "Current brightness" | \
sed -e 's/^\s\+Current brightness: [0-9]\+ (\([0-9]\+\)%).*$/\1/'
}
get_kb_brightness() {
brightnessctl -d platform::kbd_backlight | \
grep "Current brightness" | \
sed -e 's/^\s\+Current brightness: [0-9]\+ (\([0-9]\+\)%).*$/\1/'
}
notify() {
notify-send "$1" "$2" -e -t 1500 -h string:x-canonical-private-synchronous:brightness
}
set_brightness() {
# Set the brightness
TARGET=$1
brightnessctl set $TARGET > /dev/null
# Send a notification
BRIGHTNESS=$(get_brightness)
ACTION=$([[ ${TARGET:0:1} == "+" ]] && echo "Brightness Up" || echo "Brightness Down")
BRIGHTNESS_ICON="󰃠"
TITLE=$(echo "$BRIGHTNESS_ICON $ACTION")
BODY=$(echo "$BRIGHTNESS%")
notify "$TITLE" "$BODY"
}
set_kb_brightness() {
# Set the brightness
TARGET=$1
brightnessctl -d platform::kbd_backlight set $TARGET > /dev/null
# Send a notification
BRIGHTNESS=$(get_kb_brightness)
ACTION=$([[ ${TARGET:0:1} == "+" ]] && echo "Keyboard brightness Up" || echo "Keyboard brightness Down")
BRIGHTNESS_ICON="󰃠"
TITLE=$(echo "$BRIGHTNESS_ICON $ACTION")
BODY=$(echo "$BRIGHTNESS%")
notify "$TITLE" "$BODY"
}
case $ACTION in
set)
set_brightness $2
;;
kb_set)
set_kb_brightness $2
;;
*)
echo "Unknown action"
exit 1
;;
esac

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -e
# Dependencies:
# - slurp
# - grim
ACTION=$1
DATESTAMP=$(date +"%Y%m%d%H%M%S")
OUT_DIR="${HOME}/screenshots"
OUT_FILE="capture-${ACTION}-${DATESTAMP}.png"
case $ACTION in
region)
[[ ! -d "${OUT_DIR}" ]] && mkdir $OUT_DIR
slurp | grim -t png -g - "${OUT_DIR}/${OUT_FILE}"
;;
screen)
[[ ! -d "${OUT_DIR}" ]] && mkdir $OUT_DIR
grim -t png "${OUT_DIR}/${OUT_FILE}"
;;
*)
echo "Unknown action"
exit 1
;;
esac

View File

@@ -0,0 +1,79 @@
#!/usr/bin/env bash
# Dependencies:
# - amixer
# - pactl
# - jq
# - libnotify
ACTION=$1
get_volume_info() {
amixer sget Master | \
grep 'Left:' | \
sed -e 's/[^[]*\[\([0-9]*\)%\][^[]\[\(\w*\)\]/{"volume": \1, "muted": \2}/' \
-e 's/on/false/' \
-e 's/off/true/'
}
notify() {
notify-send "$1" "$2" -e -t 1500 -h string:x-canonical-private-synchronous:volume
}
mute() {
pactl set-sink-mute @DEFAULT_SINK@ toggle
VOLUME_INFO=$(get_volume_info)
VOLUME=$(echo $VOLUME_INFO | jq .volume)
if [ $(echo $VOLUME_INFO | jq .muted) == "true" ]
then
AUDIO_ICON="󰝟"
MUTED_STR="Muted"
BODY=""
else
AUDIO_ICON="󰕾"
MUTED_STR="Unmuted"
BODY=$(echo "$VOLUME%")
fi
TITLE=$(echo "$AUDIO_ICON $MUTED_STR")
notify "$TITLE" "$BODY"
}
set_volume() {
# Set the volume
TARGET=$1
pactl set-sink-volume @DEFAULT_SINK@ $TARGET
# Send a notification
VOLUME_INFO=$(get_volume_info)
ACTION=$([[ ${TARGET:0:1} == "+" ]] && echo "Volume Up" || echo "Volume Down")
VOLUME=$(echo $VOLUME_INFO | jq .volume)
if [ $(echo $VOLUME_INFO | jq .muted) == "true" ]
then
AUDIO_ICON="󰝟"
MUTED_STR="[muted]"
else
AUDIO_ICON="󰕾"
MUTED_STR=""
fi
TITLE=$(echo "$AUDIO_ICON $ACTION")
BODY=$(echo "$VOLUME% $MUTED_STR")
notify "$TITLE" "$BODY"
}
case $ACTION in
mute)
mute
;;
set)
set_volume $2
;;
*)
echo "Unknown action"
exit 1
;;
esac

70
config/kanata/kanata.kbd Normal file
View File

@@ -0,0 +1,70 @@
(defcfg
linux-dev-names-exclude (
"ZSA Technology Labs Voyager"
"ZSA Technology Labs Voyager Consumer Control"
"ZSA Technology Labs Voyager Keyboard"
)
)
(deflocalkeys-linux
ImpPt 99
º 41
' 12
¡ 13
` 26
+ 27
ñ 39
´ 40
ç 43
< 86
- 53
)
(defsrc
esc f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 ins ImpPt del home end pgup pgdn
º 1 2 3 4 5 6 7 8 9 0 ' ¡ Backspace nlck kp/ kp* kp-
tab q w e r t y u i o p ` + kp7 kp8 kp9
caps a s d f g h j k l ñ ´ ç ret kp4 kp5 kp6 kp+
lsft < z x c v b n m , . - rsft kp1 kp2 kp3
lctl lmet lalt spc ralt rctl up kp0 kp. kprt
left down rght
)
(defvar
tap-time 200
hold-time 250
)
(defalias
caps (tap-hold $tap-time $hold-time caps (layer-while-held layer1))
a (tap-hold $tap-time $hold-time a lalt)
s (tap-hold $tap-time $hold-time s lsft)
d (tap-hold $tap-time $hold-time d lmet)
f (tap-hold $tap-time $hold-time f lctl)
g (tap-hold $tap-time $hold-time g (layer-while-held layer1))
h (tap-hold $tap-time $hold-time h rctl)
j (tap-hold $tap-time $hold-time j rmet)
k (tap-hold $tap-time $hold-time k rsft)
l (tap-hold $tap-time $hold-time l ralt)
)
(deflayer base
esc mute vold volu - brdn brup - - - - - - ins ImpPt del home end pgup pgdn
º 1 2 3 4 5 6 7 8 9 0 ' ¡ Backspace nlck kp/ kp* kp-
tab q w e r t y u i o p ` + kp7 kp8 kp9
@caps @a @s @d @f @g @h @j @k @l ñ ´ ç ret kp4 kp5 kp6 kp+
lsft < z x c v b n m , . - rsft kp1 kp2 kp3
lctl lmet lalt spc ralt rctl up kp0 kp. kprt
left down rght
)
(deflayer layer1
_ f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ left down up right _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _
)

View File

@@ -0,0 +1,13 @@
{
"client": {
"enabled": true,
"network_interface": "tailscale0",
"options": {
"docker.volumes.enabled": true
}
},
"consul": {
"address": "127.0.0.1:8500"
}
}

View File

@@ -0,0 +1,11 @@
{
"datacenter": "samfelag",
"bind_addr": "{{ GetInterfaceIP \"tailscale0\" }}",
"advertise": {
"http": "{{ GetInterfaceIP \"tailscale0\" }}",
"rpc": "{{ GetInterfaceIP \"tailscale0\" }}",
"serf": "{{ GetInterfaceIP \"tailscale0\" }}"
}
}

View File

@@ -0,0 +1,10 @@
{
"client": {
"host_volume": {
"test": {
"path": "/mnt/raid1/nomad_volumes/nextcloud/nextcloud",
"read_only": false
}
}
}
}

View File

@@ -0,0 +1,40 @@
client {
# --- Network ---
host_network "public" {
interface = "ens3"
}
# --- Volumes ---
# DNS
host_volume "dns-pihole" {
path = "/var/lib/nomad_volumes/dns/pihole/etc-pihole"
read_only = false
}
host_volume "dns-dnsmasq" {
path = "/var/lib/nomad_volumes/dns/pihole/etc-dnsmasq.d"
read_only = false
}
# Caddy
host_volume "caddyfile" {
path = "/var/lib/nomad_volumes/caddy/Caddyfile"
read_only = false
}
host_volume "caddy-data" {
path = "/var/lib/nomad_volumes/caddy/data"
read_only = false
}
# Gitea
host_volume "gitea" {
path = "/mnt/vatnajokull/nomad_volumes/gitea/data"
read_only = false
}
# Folkugat
host_volume "folkugat" {
path = "/var/lib/nomad_volumes/folkugat"
read_only = false
}
}

View File

@@ -0,0 +1,6 @@
{
"server": {
"enabled": true,
"bootstrap_expect": 1
}
}

View File

@@ -0,0 +1,54 @@
include-file = colours.ini
include-directory = modules
[bar/base]
dpi = 96
width = 100%
height = 32
offset-x = 0
offset-y = 0
font-0 = "Iosevka Nerd Font:size=10;2"
font-1 = "Iosevka Nerd Font:size=16;2"
font-2 = "Iosevka Nerd Font:size=20;4"
background = ${colours/bar.bg}
foreground = ${colours/bar.fg}
border-bottom-size = 5
border-top-size = 5
border-left-size = 10
border-right-size = 10
border-bottom-color = ${colours/bar.bg}
border-top-color = ${colours/bar.bg}
border-left-color = ${colours/bar.bg}
border-right-color = ${colours/bar.bg}
spacing = 0
padding-left = 0
padding-right = 0
module-margin-left = 0
separator = |
separator-padding = .5
separator-foreground = ${colours/bar.bg}
separator-background = ${colours/bar.bg}
[bar/bottom]
inherit = bar/base
bottom = true
modules-left = workspaces
modules-right = wireless bluetooth volume battery
tray-position = center
tray-maxsize = 28
[bar/top]
inherit = bar/base
bottom = false
modules-left = spotify
modules-center = date
modules-right = i3-mode

View File

@@ -0,0 +1,61 @@
[colours]
trans = #0000
white = #fff
black = #000
gray = #555
[colours/bar]
bg = ${colour-scheme.base00}
fg = ${colour-scheme.base05}
[colours/date]
bg = ${colour-scheme.base00}
fg = ${colour-scheme.base05}
[colours/battery]
full-bg = ${colour-scheme.base00}
full-fg = ${colour-scheme.base0C}
charging-bg = ${colour-scheme.base00}
charging-fg = ${colour-scheme.base0D}
discharging-bg = ${colour-scheme.base00}
discharging-fg = ${colour-scheme.base0F}
low-bg = ${colour-scheme.base00}
low-fg = ${colour-scheme.base0E}
[colours/workspaces]
focused-bg = ${colour-scheme.base02}
focused-fg = ${colour-scheme.base04}
unfocused-bg = ${colour-scheme.base01}
unfocused-fg = ${colour-scheme.base05}
urgent-bg = ${colour-scheme.base0E}
urgent-fg = ${colour-scheme.base01}
[colours/i3-mode]
bg = ${colour-scheme.base0E}
fg = ${colour-scheme.base01}
[colours/volume]
volume-bg = ${colour-scheme.base00}
volume-fg = ${colour-scheme.base0C}
muted-bg = ${colour-scheme.base00}
muted-fg = ${colour-scheme.base0B}
[colours/wireless]
connected-bg = ${colour-scheme.base00}
connected-fg = ${colour-scheme.base0C}
disconnected-bg = ${colour-scheme.base00}
disconnected-fg = ${colour-scheme.base0B}
packetloss-bg = ${colour-scheme.base00}
packetloss-fg = ${colour-scheme.base0E}
[colours/bluetooth]
bg = ${colour-scheme.base00}
fg = ${colour-scheme.base0C}
[colours/spotify]
bg = ${colour-scheme.base00}
fg = ${colour-scheme.base0A}
[colours/ice]
bg = ${colour-scheme.base00}
fg = ${colour-scheme.base0A}

View File

@@ -4,28 +4,28 @@ full-at = 100
low-at = 20 low-at = 20
battery = BAT0 battery = BAT0
adapter = ADP0 adapter = ADP0
poll-interval = 5 poll-interval = 1
format-full = <label-full> format-full = <label-full>
label-full = "%{T2}%{T-} %percentage%%" label-full = "%{T2}󰁹%{T-} %percentage%%"
label-full-background = ${colours/battery.full-bg} label-full-background = ${colours/battery.full-bg}
label-full-foreground = ${colours/battery.full-fg} label-full-foreground = ${colours/battery.full-fg}
label-full-padding = 1 label-full-padding = 1
format-charging = <label-charging> format-charging = <label-charging>
label-charging = "%{T2}%{T-} %percentage%%" label-charging = "%{T2}󰂄%{T-} %percentage%%"
label-charging-background = ${colours/battery.charging-bg} label-charging-background = ${colours/battery.charging-bg}
label-charging-foreground = ${colours/battery.charging-fg} label-charging-foreground = ${colours/battery.charging-fg}
label-charging-padding = 1 label-charging-padding = 1
format-discharging = <label-discharging> format-discharging = <label-discharging>
label-discharging = "%{T2}%{T-} %percentage%%" label-discharging = "%{T2}󰂀%{T-} %percentage%%"
label-discharging-background = ${colours/battery.discharging-bg} label-discharging-background = ${colours/battery.discharging-bg}
label-discharging-foreground = ${colours/battery.discharging-fg} label-discharging-foreground = ${colours/battery.discharging-fg}
label-discharging-padding = 1 label-discharging-padding = 1
format-low = <label-low> format-low = <label-low>
label-low = "%{T2}%{T-} %percentage%%" label-low = "%{T2}󰂃%{T-} %percentage%%"
label-low-background = ${colours/battery.low-bg} label-low-background = ${colours/battery.low-bg}
label-low-foreground = ${colours/battery.low-fg} label-low-foreground = ${colours/battery.low-fg}
label-low-padding = 1 label-low-padding = 1

View File

@@ -0,0 +1,9 @@
[module/bluetooth]
type = custom/script
exec = ~/.config/rofi/menus/bluetooth/bluetooth.sh --status
interval = 5
click-left = ~/.config/rofi/menus/bluetooth/bluetooth.sh
format-background = ${colours/bluetooth.bg}
format-foreground = ${colours/bluetooth.fg}
format-padding = 1

View File

@@ -0,0 +1,8 @@
[module/ice]
type = custom/script
exec = ~/.config/polybar/scripts/ice.sh
interval = 5
format-background = ${colours/ice.bg}
format-foreground = ${colours/ice.fg}
format-padding = 1

View File

@@ -0,0 +1,8 @@
[module/spotify]
type = custom/script
exec = ~/.config/polybar/scripts/spotify.sh
interval = 5
format-background = ${colours/spotify.bg}
format-foreground = ${colours/spotify.fg}
format-padding = 1

View File

@@ -3,13 +3,13 @@ type = internal/pulseaudio
interval = 5 interval = 5
format-volume = <label-volume> format-volume = <label-volume>
label-volume = %{T2}%{T-} %percentage%% label-volume = %{T2}󰕾 %{T-} %percentage%%
label-volume-padding = 1 label-volume-padding = 1
label-volume-foreground = ${colours/volume.volume-fg} label-volume-foreground = ${colours/volume.volume-fg}
label-volume-background = ${colours/volume.volume-bg} label-volume-background = ${colours/volume.volume-bg}
format-muted = <label-muted> format-muted = <label-muted>
label-muted = %{T2}%{T-} muted label-muted = %{T2}󰝟 %{T-} muted
label-muted-padding = 1 label-muted-padding = 1
label-muted-foreground = ${colours/volume.muted-fg} label-muted-foreground = ${colours/volume.muted-fg}
label-muted-background = ${colours/volume.muted-bg} label-muted-background = ${colours/volume.muted-bg}

View File

@@ -0,0 +1,28 @@
[module/wireless]
type = internal/network
interface-type = wireless
interval = 3.0
accumulate-stats = true
;unknown-as-up = true
; The unit used for displaying network speeds
; For example if set to the empty string, a speed of 5 KB/s is displayed as 5 K
speed-unit = ''
format-connected = <label-connected>
label-connected = %{T2}󰖩 %{T-} %essid% (%local_ip%)
label-connected-background = ${colours/wireless.connected-bg}
label-connected-foreground = ${colours/wireless.connected-fg}
label-connected-padding = 1
format-disconnected = <label-disconnected>
label-disconnected = %{T2}󰖪
label-disconnected-background = ${colours/wireless.disconnected-bg}
label-disconnected-foreground = ${colours/wireless.disconnected-fg}
label-disconnected-padding = 1
format-packetloss = <label-connected>*
label-packetloss-background = ${colours/wireless.packetloss-bg}
label-packetloss-foreground = ${colours/wireless.packetloss-fg}
label-packetloss-padding = 1

View File

@@ -0,0 +1,3 @@
# This file is generated by nixos-rebuild
include-file = colour-scheme.ini
include-file = bars/bars.ini

33
config/polybar/scripts/ice.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/sh
# Show current train speed on ICE
main() {
status=$(curl -X GET https://iceportal.de/api1/rs/status 2>/dev/null)
tripInfo=$(curl -X GET https://iceportal.de/api1/rs/tripInfo/trip 2>/dev/null)
if [[ -z $status || -z $tripInfo ]]; then
return
fi
# Speed
speed=$(echo $status | jq ".speed")
# Next stop
nextId=$(echo $tripInfo | jq ".trip.stopInfo.actualNext")
nextStop=$(echo $tripInfo | jq ".trip.stops[] | select( .station.evaNr == $nextId )")
nextStopName=$(echo $nextStop | jq -r ".station.name")
nextStopArrival=$(echo $nextStop | jq ".timetable.actualArrivalTime")
nextStopRemainingSeconds=$(expr $(expr $nextStopArrival / 1000) - $(date +%s))
if [[ ${nextStopRemainingSeconds:0:1} == "-" ]]; then
nextStopRemainingTime="Arribada!"
else
nextStopRemainingTime=$(date -d@$nextStopRemainingSeconds -u +%Hh%Mm%Ss)
fi
echo "$nextStopName ·  $nextStopRemainingTime · 󰓅 $speed km/h"
}
main "$@"

View File

@@ -0,0 +1,20 @@
#!/bin/sh
main() {
pgrep spotify -l | grep -v spotify.sh > /dev/null || return
cmd="org.freedesktop.DBus.Properties.Get"
domain="org.mpris.MediaPlayer2"
path="/org/mpris/MediaPlayer2"
meta=$(dbus-send --print-reply --dest=${domain}.spotify /org/mpris/MediaPlayer2 ${cmd} string:${domain}.Player string:Metadata)
# Normal track
artist=$(echo "$meta" | sed -nr '/xesam:artist"/,+2s/^ +string "(.*)"$/\1/p' | tail -1 | sed 's/\&/\\&/g' | sed 's#\/#\\/#g')
album=$(echo "$meta" | sed -nr '/xesam:album"/,+2s/^ +variant +string "(.*)"$/\1/p' | tail -1| sed 's/\&/\\&/g'| sed 's#\/#\\/#g')
title=$(echo "$meta" | sed -nr '/xesam:title"/,+2s/^ +variant +string "(.*)"$/\1/p' | tail -1 | sed 's/\&/\\&/g'| sed 's#\/#\\/#g')
echo "${*:-%artist% - %title%}" | sed "s/%artist%/$artist/g;s/%title%/$title/g;s/%album%/$album/g"i | sed "s/\&/\&/g" | sed "s#\/#\/#g"
}
main "$@"

View File

@@ -0,0 +1,139 @@
/**
*
* Author : Marc Sastre, based on Aditya Shakya (adi1090x, Github : @adi1090x)
*
**/
@import "~/.config/rofi/theme.rasi"
/*****----- Configuration -----*****/
configuration {
show-icons: false;
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 800px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
margin: 0px;
padding: 0px;
border: 2px solid;
border-radius: 15px;
border-color: @background-alt;
cursor: "default";
background-color: @background;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
children: [ "inputbar", "listview" ];
}
message {
enabled: true;
margin: 0px;
padding: 10px;
border: 0px solid;
border-radius: 10px;
border-color: @selected;
background-color: @background-alt;
text-color: @foreground;
}
textbox {
background-color: inherit;
text-color: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
placeholder-color: @foreground;
blink: true;
markup: true;
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 10px;
padding: 15px;
border-radius: 10px;
background-color: @background-alt;
text-color: @foreground;
children: [ "textbox-prompt-colon", "entry" ];
}
textbox-prompt-colon {
enabled: true;
expand: false;
str: "";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
background-color: inherit;
text-color: inherit;
cursor: text;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 1;
lines: 5;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 5px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: "default";
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 0px;
margin: 0px;
padding: 12px;
border: 0px solid;
border-radius: 100%;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: pointer;
}
element-text {
background-color: transparent;
text-color: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
element selected.normal {
background-color: var(selected);
text-color: var(background);
}

View File

@@ -0,0 +1,322 @@
#!/usr/bin/env bash
# __ _ _ _ _ _ _
# _ __ ___ / _(_) | |__ | |_ _ ___| |_ ___ ___ | |_| |__
# | '__/ _ \| |_| |_____| '_ \| | | | |/ _ \ __/ _ \ / _ \| __| '_ \
# | | | (_) | _| |_____| |_) | | |_| | __/ || (_) | (_) | |_| | | |
# |_| \___/|_| |_| |_.__/|_|\__,_|\___|\__\___/ \___/ \__|_| |_|
#
# Author: Nick Clyde (clydedroid)
#
# A script that generates a rofi menu that uses bluetoothctl to
# connect to bluetooth devices and display status info.
#
# Inspired by networkmanager-dmenu (https://github.com/firecat53/networkmanager-dmenu)
# Thanks to x70b1 (https://github.com/polybar/polybar-scripts/tree/master/polybar-scripts/system-bluetooth-bluetoothctl)
#
# Depends on:
# Arch repositories: rofi, bluez-utils (contains bluetoothctl)
# Constants
divider=""
goback="Back"
# For debugging/development purposes
# PREFIX=projects/samfelag/config/
# Rofi command to pipe into, can add any options here
dir="$HOME/$PREFIX.config/rofi/menus/bluetooth/"
theme='bluetooth'
rofi_command="rofi -dmenu -theme ${dir}/${theme}.rasi -i -p"
# rofi -dmenu \
# -theme ${dir}/${theme}.rasi
# Checks if bluetooth controller is powered on
power_on() {
if bluetoothctl show | grep -q "Powered: yes"; then
return 0
else
return 1
fi
}
# Toggles power state
toggle_power() {
if power_on; then
bluetoothctl power off
show_menu
else
if rfkill list bluetooth | grep -q 'blocked: yes'; then
rfkill unblock bluetooth && sleep 3
fi
bluetoothctl power on
show_menu
fi
}
# Checks if controller is scanning for new devices
scan_on() {
if bluetoothctl show | grep -q "Discovering: yes"; then
echo "Scan: on"
return 0
else
echo "Scan: off"
return 1
fi
}
# Toggles scanning state
toggle_scan() {
if scan_on; then
kill $(pgrep -f "bluetoothctl scan on")
bluetoothctl scan off
show_menu
else
bluetoothctl scan on &
echo "Scanning..."
sleep 5
show_menu
fi
}
# Checks if controller is able to pair to devices
pairable_on() {
if bluetoothctl show | grep -q "Pairable: yes"; then
echo "Pairable: on"
return 0
else
echo "Pairable: off"
return 1
fi
}
# Toggles pairable state
toggle_pairable() {
if pairable_on; then
bluetoothctl pairable off
show_menu
else
bluetoothctl pairable on
show_menu
fi
}
# Checks if controller is discoverable by other devices
discoverable_on() {
if bluetoothctl show | grep -q "Discoverable: yes"; then
echo "Discoverable: on"
return 0
else
echo "Discoverable: off"
return 1
fi
}
# Toggles discoverable state
toggle_discoverable() {
if discoverable_on; then
bluetoothctl discoverable off
show_menu
else
bluetoothctl discoverable on
show_menu
fi
}
# Checks if a device is connected
device_connected() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -q "Connected: yes"; then
return 0
else
return 1
fi
}
# Toggles device connection
toggle_connection() {
if device_connected $1; then
bluetoothctl disconnect $1
device_menu "$device"
else
bluetoothctl connect $1
device_menu "$device"
fi
}
# Checks if a device is paired
device_paired() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -q "Paired: yes"; then
echo "Paired: yes"
return 0
else
echo "Paired: no"
return 1
fi
}
# Toggles device paired state
toggle_paired() {
if device_paired $1; then
bluetoothctl remove $1
device_menu "$device"
else
bluetoothctl pair $1
device_menu "$device"
fi
}
# Checks if a device is trusted
device_trusted() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -q "Trusted: yes"; then
echo "Trusted: yes"
return 0
else
echo "Trusted: no"
return 1
fi
}
# Toggles device connection
toggle_trust() {
if device_trusted $1; then
bluetoothctl untrust $1
device_menu "$device"
else
bluetoothctl trust $1
device_menu "$device"
fi
}
# Prints a short string with the current bluetooth status
# Useful for status bars like polybar, etc.
print_status() {
if power_on; then
printf ''
paired_devices_cmd="paired-devices"
mapfile -t paired_devices < <(bluetoothctl $paired_devices_cmd | grep Device | cut -d ' ' -f 2)
counter=0
for device in "${paired_devices[@]}"; do
if device_connected $device; then
device_alias=$(bluetoothctl info $device | grep "Alias" | cut -d ' ' -f 2-)
if [ $counter -gt 0 ]; then
printf ", %s" "$device_alias"
else
printf " %s" "$device_alias"
fi
((counter++))
fi
done
printf "\n"
else
echo "󰂲"
fi
}
# A submenu for a specific device that allows connecting, pairing, and trusting
device_menu() {
device=$1
# Get device name and mac address
device_name=$(echo $device | cut -d ' ' -f 3-)
mac=$(echo $device | cut -d ' ' -f 2)
# Build options
if device_connected $mac; then
connected="Connected: yes"
else
connected="Connected: no"
fi
paired=$(device_paired $mac)
trusted=$(device_trusted $mac)
options="$connected\n$paired\n$trusted\n$divider\n$goback\nExit"
# Open rofi menu, read chosen option
chosen="$(echo -e "$options" | $rofi_command "$device_name")"
# Match chosen option to command
case $chosen in
"" | $divider)
echo "No option chosen."
;;
$connected)
toggle_connection $mac
;;
$paired)
toggle_paired $mac
;;
$trusted)
toggle_trust $mac
;;
$goback)
show_menu
;;
esac
}
# Opens a rofi menu with current bluetooth status and options to connect
show_menu() {
# Get menu options
if power_on; then
power="Power: on"
# Human-readable names of devices, one per line
# If scan is off, will only list paired devices
devices=$(bluetoothctl devices | grep Device | cut -d ' ' -f 3-)
# Get controller flags
scan=$(scan_on)
pairable=$(pairable_on)
discoverable=$(discoverable_on)
# Options passed to rofi
options="$devices\n$divider\n$power\n$scan\n$pairable\n$discoverable\nExit"
else
power="Power: off"
options="$power\nExit"
fi
# Open rofi menu, read chosen option
chosen="$(echo -e "$options" | $rofi_command "Bluetooth")"
# Match chosen option to command
case $chosen in
"" | $divider)
echo "No option chosen."
;;
$power)
toggle_power
;;
$scan)
toggle_scan
;;
$discoverable)
toggle_discoverable
;;
$pairable)
toggle_pairable
;;
*)
device=$(bluetoothctl devices | grep "$chosen")
# Open a submenu if a device is selected
if [[ $device ]]; then device_menu "$device"; fi
;;
esac
}
case "$1" in
--status)
print_status
;;
*)
show_menu
;;
esac

View File

@@ -0,0 +1,147 @@
/**
*
* Author : Marc Sastre, based on Aditya Shakya (adi1090x, Github : @adi1090x)
*
**/
@import "~/.config/rofi/theme.rasi"
/*****----- Configuration -----*****/
configuration {
show-icons: false;
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 800px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
margin: 0px;
padding: 0px;
border: 2px solid;
border-radius: 15px;
border-color: @background-alt;
cursor: "default";
background-color: @background;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
children: [ "inputbar", "listview" ];
}
message {
enabled: true;
margin: 0px;
padding: 10px;
border: 0px solid;
border-radius: 10px;
border-color: @selected;
background-color: @background-alt;
text-color: @foreground;
}
textbox {
background-color: inherit;
text-color: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
placeholder-color: @foreground;
blink: true;
markup: true;
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 10px;
padding: 15px;
border-radius: 10px;
background-color: @background-alt;
text-color: @foreground;
children: [ "textbox-prompt-colon", "entry" ];
}
textbox-prompt-colon {
enabled: true;
expand: false;
str: "";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
background-color: inherit;
text-color: inherit;
cursor: text;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 1;
lines: 5;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 5px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: "default";
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 0px;
margin: 0px;
padding: 12px;
border: 0px solid;
border-radius: 100%;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: pointer;
}
element-text {
background-color: transparent;
text-color: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
element selected.normal {
background-color: var(selected);
text-color: var(background);
}
element active {
background-color: var(active);
text-color: var(background);
}
element selected.active {
background-color: var(selected);
text-color: var(background);
}

View File

@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# For debugging/development purposes
# PREFIX=projects/samfelag/config/
# Rofi command to pipe into, can add any options here
dir="$HOME/$PREFIX.config/rofi/menus/cliphist/"
theme='cliphist'
rofi_command="rofi -dmenu -i -theme ${dir}/${theme}.rasi"
cliphist list | $rofi_command | cliphist decode | wl-copy

View File

@@ -0,0 +1,199 @@
/**
*
* Author : Marc Sastre, based on Aditya Shakya (adi1090x, Github : @adi1090x)
*
**/
@import "~/.config/rofi/theme.rasi"
/*****----- Configuration -----*****/
configuration {
modi: "drun,run,filebrowser,window";
show-icons: true;
display-drun: "APPS";
display-run: "RUN";
display-filebrowser: "FILES";
display-window: "WINDOW";
drun-display-format: "{name}";
window-format: "{w} · {c} · {t}";
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 1000px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
border: 2px solid;
border-radius: 15px;
border-color: @background-alt;
cursor: "default";
background-color: @background;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 0px;
background-color: transparent;
orientation: horizontal;
children: [ "imagebox", "listbox" ];
}
imagebox {
padding: 20px;
background-color: transparent;
background-image: url("~/.config/rofi/nix.png", width);
orientation: vertical;
children: [ "inputbar", "dummy", "mode-switcher" ];
}
listbox {
spacing: 20px;
padding: 20px;
background-color: transparent;
orientation: vertical;
children: [ "message", "listview" ];
}
dummy {
background-color: transparent;
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 10px;
padding: 15px;
border-radius: 10px;
background-color: @background-alt;
text-color: @foreground;
children: [ "textbox-prompt-colon", "entry" ];
}
textbox-prompt-colon {
enabled: true;
expand: false;
str: "";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
background-color: inherit;
text-color: inherit;
cursor: text;
placeholder: "Search";
placeholder-color: inherit;
}
/*****----- Mode Switcher -----*****/
mode-switcher{
enabled: true;
spacing: 20px;
background-color: transparent;
text-color: @foreground;
}
button {
padding: 15px;
border-radius: 10px;
background-color: @background-alt;
text-color: inherit;
cursor: pointer;
}
button selected {
background-color: @selected;
text-color: @foreground;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 1;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 10px;
background-color: transparent;
text-color: @foreground;
cursor: "default";
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 15px;
padding: 8px;
border-radius: 10px;
background-color: transparent;
text-color: @foreground;
cursor: pointer;
}
element normal.normal {
background-color: inherit;
text-color: inherit;
}
element normal.urgent {
background-color: @urgent;
text-color: @foreground;
}
element normal.active {
background-color: @active;
text-color: @foreground;
}
element selected.normal {
background-color: @selected;
text-color: @foreground;
}
element selected.urgent {
background-color: @urgent;
text-color: @foreground;
}
element selected.active {
background-color: @urgent;
text-color: @foreground;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 32px;
cursor: inherit;
}
element-text {
background-color: transparent;
text-color: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
/*****----- Message -----*****/
message {
background-color: transparent;
}
textbox {
padding: 15px;
border-radius: 10px;
background-color: @background-alt;
text-color: @foreground;
vertical-align: 0.5;
horizontal-align: 0.0;
}
error-message {
padding: 15px;
border-radius: 20px;
background-color: @background;
text-color: @foreground;
}

View File

@@ -0,0 +1,13 @@
#!/usr/bin/env sh
## Author : Marc Sastre, based on Aditya Shakya (adi1090x, Github : @adi1090x)
## Rofi : Launcher
# For debugging/development purposes
# PREFIX=projects/samfelag/config/
# Rofi command to pipe into, can add any options here
dir="$HOME/$PREFIX.config/rofi/menus/launcher/"
theme='launcher'
rofi -show drun -theme ${dir}/${theme}.rasi

View File

@@ -0,0 +1,147 @@
/**
*
* Author : Marc Sastre, based on Aditya Shakya (adi1090x, Github : @adi1090x)
*
**/
@import "~/.config/rofi/theme.rasi"
/*****----- Configuration -----*****/
configuration {
show-icons: false;
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 800px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
margin: 0px;
padding: 0px;
border: 2px solid;
border-radius: 15px;
border-color: @background-alt;
cursor: "default";
background-color: @background;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
children: [ "message", "inputbar", "listview" ];
}
message {
enabled: true;
margin: 0px;
padding: 10px;
border: 0px solid;
border-radius: 10px;
border-color: @selected;
background-color: @background-alt;
text-color: @foreground;
}
textbox {
background-color: inherit;
text-color: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
placeholder-color: @foreground;
blink: true;
markup: true;
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 10px;
padding: 15px;
border-radius: 10px;
background-color: @background-alt;
text-color: @foreground;
children: [ "textbox-prompt-colon", "entry" ];
}
textbox-prompt-colon {
enabled: true;
expand: false;
str: "";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
background-color: inherit;
text-color: inherit;
cursor: text;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 1;
lines: 5;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 5px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: "default";
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 0px;
margin: 0px;
padding: 12px;
border: 0px solid;
border-radius: 100%;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: pointer;
}
element-text {
background-color: transparent;
text-color: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
element selected.normal {
background-color: var(selected);
text-color: var(background);
}
element active {
background-color: var(active);
text-color: var(background);
}
element selected.active {
background-color: var(selected);
text-color: var(background);
}

View File

@@ -0,0 +1,115 @@
/**
*
* Author : Marc Sastre, based on Aditya Shakya (adi1090x, Github : @adi1090x)
*
**/
@import "~/.config/rofi/theme.rasi"
/*****----- Configuration -----*****/
configuration {
show-icons: false;
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 500px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
margin: 0px;
padding: 0px;
border: 2px solid;
border-radius: 15px;
border-color: @background-alt;
cursor: "default";
background-color: @background;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
children: [ "listview" ];
}
message {
enabled: true;
margin: 0px;
padding: 10px;
border: 0px solid;
border-radius: 10px;
border-color: @selected;
background-color: @background-alt;
text-color: @foreground;
}
textbox {
background-color: inherit;
text-color: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
placeholder-color: @foreground;
blink: true;
markup: true;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 1;
lines: 5;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 5px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: "default";
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 0px;
margin: 0px;
padding: 12px;
border: 0px solid;
border-radius: 100%;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: pointer;
}
element-text {
background-color: transparent;
text-color: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
element selected.normal {
background-color: var(selected);
text-color: var(background);
}

View File

@@ -0,0 +1,94 @@
#!/usr/bin/env sh
## Author : Marc Sastre, based on Aditya Shakya (adi1090x, Github : @adi1090x)
## Rofi : Power Menu
# Current Theme
dir="$HOME/.config/rofi/menus/powermenu/"
theme='powermenu'
# CMDs
# Options
shutdown=' Shutdown'
reboot=' Reboot'
lock=' Lock'
suspend='󰏦 Suspend'
logout='󰍃 Logout'
yes='Yes'
no='No'
# Rofi CMD
rofi_cmd() {
rofi -dmenu \
-theme ${dir}/${theme}.rasi
}
# Confirmation CMD
confirm_cmd() {
rofi -theme-str 'window {location: center; anchor: center; fullscreen: false; width: 250px;}' \
-theme-str 'mainbox {children: [ "message", "listview" ];}' \
-theme-str 'listview {columns: 2; lines: 1;}' \
-theme-str 'element-text {horizontal-align: 0.5;}' \
-theme-str 'textbox {horizontal-align: 0.5;}' \
-dmenu \
-p 'Confirmation' \
-mesg 'Are you Sure?' \
-theme ${dir}/${theme}.rasi
}
# Ask for confirmation
confirm_exit() {
echo -e "$yes\n$no" | confirm_cmd
}
# Pass variables to rofi dmenu
run_rofi() {
echo -e "$lock\n$suspend\n$logout\n$reboot\n$shutdown" | rofi_cmd
}
# Execute Command
run_cmd() {
selected="$(confirm_exit)"
if [[ "$selected" == "$yes" ]]; then
if [[ $1 == '--shutdown' ]]; then
systemctl poweroff -i
elif [[ $1 == '--reboot' ]]; then
systemctl reboot
elif [[ $1 == '--suspend' ]]; then
systemctl suspend
elif [[ $1 == '--logout' ]]; then
if [[ "$DESKTOP_SESSION" == 'i3' ]]; then
i3-msg exit
elif [[ ! -z $HYPRLAND_INSTANCE_SIGNATURE ]]; then
hyprctl dispatch exit
fi
fi
else
exit 0
fi
}
# Actions
chosen="$(run_rofi)"
case ${chosen} in
$shutdown)
run_cmd --shutdown
;;
$reboot)
run_cmd --reboot
;;
$lock)
if command -v i3lock-color; then
i3lock-color -c 808F85 && sleep 1
elif command -v hyprlock; then
hyprlock
fi
;;
$suspend)
run_cmd --suspend
;;
$logout)
run_cmd --logout
;;
esac

147
config/rofi/menus/wifi/wifi.rasi Executable file
View File

@@ -0,0 +1,147 @@
/**
*
* Author : Marc Sastre, based on Aditya Shakya (adi1090x, Github : @adi1090x)
*
**/
@import "~/.config/rofi/theme.rasi"
/*****----- Configuration -----*****/
configuration {
show-icons: false;
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 800px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
margin: 0px;
padding: 0px;
border: 2px solid;
border-radius: 15px;
border-color: @background-alt;
cursor: "default";
background-color: @background;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
children: [ "inputbar", "listview" ];
}
message {
enabled: true;
margin: 0px;
padding: 10px;
border: 0px solid;
border-radius: 10px;
border-color: @selected;
background-color: @background-alt;
text-color: @foreground;
}
textbox {
background-color: inherit;
text-color: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
placeholder-color: @foreground;
blink: true;
markup: true;
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 10px;
padding: 15px;
border-radius: 10px;
background-color: @background-alt;
text-color: @foreground;
children: [ "textbox-prompt-colon", "entry" ];
}
textbox-prompt-colon {
enabled: true;
expand: false;
str: "󰖩";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
background-color: inherit;
text-color: inherit;
cursor: text;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 1;
lines: 5;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 5px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: "default";
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 0px;
margin: 0px;
padding: 12px;
border: 0px solid;
border-radius: 100%;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: pointer;
}
element-text {
background-color: transparent;
text-color: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
element selected.normal {
background-color: var(selected);
text-color: var(background);
}
element active {
background-color: var(active);
text-color: var(background);
}
element selected.active {
background-color: var(selected);
text-color: var(background);
}

83
config/rofi/menus/wifi/wifi.sh Executable file
View File

@@ -0,0 +1,83 @@
#!/usr/bin/env bash
# Shamelessly stolen from https://github.com/zbaylin/rofi-wifi-menu
# Starts a scan of available broadcasting SSIDs
# nmcli dev wifi rescan
# For debugging/development purposes
# PREFIX=projects/samfelag/config/
# Rofi command to pipe into, can add any options here
dir="$HOME/$PREFIX.config/rofi/menus/wifi/"
theme='wifi'
rofi_command="rofi -dmenu -i -theme ${dir}/${theme}.rasi"
FIELDS=SSID,SECURITY,BARS
LIST=$(nmcli --fields "$FIELDS" device wifi list | sed '/^--/d')
# Gives a list of known connections so we can parse it later
KNOWNCON=$(nmcli connection show)
# Really janky way of telling if there is currently a connection
CONSTATE=$(nmcli -fields WIFI g)
CURRSSID=$(LANGUAGE=C nmcli -t -f active,ssid dev wifi | awk -F: '$1 ~ /^yes/ {print $2}')
if [[ ! -z $CURRSSID ]]; then
HIGHLINE=$(echo "$(echo "$LIST" | awk -F "[ ]{2,}" '{print $1}' | grep -Fxn -m 1 "$CURRSSID" | awk -F ":" '{print $1}') + 1" | bc )
fi
if [[ "$CONSTATE" =~ "habilitat" ]]; then
TOGGLE="toggle off"
elif [[ "$CONSTATE" =~ "deshabilitat" ]]; then
TOGGLE="toggle on"
fi
CHENTRY=$(echo -e "$TOGGLE\nmanual\n$LIST" | uniq -u | $rofi_command -p "Wi-Fi SSID: " -a "$HIGHLINE")
#echo "$CHENTRY"
CHSSID=$(echo "$CHENTRY" | sed 's/\s\{2,\}/\|/g' | awk -F "|" '{print $1}')
#echo "$CHSSID"
# If the user inputs "manual" as their SSID in the start window, it will bring them to this screen
if [ "$CHENTRY" = "manual" ] ; then
# Manual entry of the SSID and password (if appplicable)
MSSID=$(echo "enter the SSID of the network (SSID,password)" | $rofi_command -p "Manual Entry: " -lines 1)
# Separating the password from the entered string
MPASS=$(echo "$MSSID" | awk -F "," '{print $2}')
#echo "$MSSID"
#echo "$MPASS"
# If the user entered a manual password, then use the password nmcli command
if [ "$MPASS" = "" ]; then
nmcli dev wifi con "$MSSID"
else
nmcli dev wifi con "$MSSID" password "$MPASS"
fi
elif [ "$CHENTRY" = "toggle on" ]; then
nmcli radio wifi on
elif [ "$CHENTRY" = "toggle off" ]; then
nmcli radio wifi off
else
# If the connection is already in use, then this will still be able to get the SSID
if [ "$CHSSID" = "*" ]; then
CHSSID=$(echo "$CHENTRY" | sed 's/\s\{2,\}/\|/g' | awk -F "|" '{print $3}')
fi
# Parses the list of preconfigured connections to see if it already contains the chosen SSID. This speeds up the connection process
if [[ $(echo "$KNOWNCON" | grep "$CHSSID") = "$CHSSID" ]]; then
nmcli con up "$CHSSID"
else
if [[ "$CHENTRY" =~ "WPA2" ]] || [[ "$CHENTRY" =~ "WEP" ]]; then
WIFIPASS=$(echo "Enter password, if connection is stored, hit enter" | $rofi_command -p "Password: " -lines 1 )
fi
nmcli dev wifi con "$CHSSID" password "$WIFIPASS"
fi
fi

View File

@@ -1,5 +1,5 @@
[[ -x "$(command -v exa)" ]] && { [[ -x "$(command -v eza)" ]] && {
alias ll="exa --group-directories-first --color=auto --git -la" alias ll="eza --group-directories-first --color=auto --icons=auto --git -la"
} || { } || {
alias ll="ls -alh --color=always --group-directories-first" alias ll="ls -alh --color=always --group-directories-first"
} }

View File

@@ -0,0 +1,4 @@
if [ -n "${commands[fzf-share]}" ]; then
source "$(fzf-share)/key-bindings.zsh"
source "$(fzf-share)/completion.zsh"
fi

View File

@@ -0,0 +1 @@
unset ZSH_AUTOSUGGEST_USE_ASYNC

View File

@@ -0,0 +1 @@
[[ -x "$(command -v zoxide)" ]] && eval "$(zoxide init --cmd cd zsh)"

93
data/devenv/devenv.sh Normal file
View File

@@ -0,0 +1,93 @@
#!/usr/bin/env sh
SANDBOXES_DIR=$HOME/sandbox
TEMPLATES_DIR=$XDG_DATA_HOME/devenv/templates
list_templates() {
echo "The available templates are:"
ls $TEMPLATES_DIR
}
check_template () {
TEMPLATE=$1
if [ -z "$TEMPLATE" ]; then
echo "No template given"
list_templates
return 1
elif [ ! -e "$TEMPLATES_DIR/$TEMPLATE" ]; then
echo "The given template '$TEMPLATE' doesn't exist!"
list_templates
return 1
fi
}
devenv_install() {
TEMPLATE=$1
install -m 644 $TEMPLATES_DIR/$TEMPLATE/* ./
echo "use flake . --impure" > .envrc
direnv allow
}
devenv_init() {
TEMPLATE=$1
if ! check_template $TEMPLATE ; then
return 1
fi
devenv_install $TEMPLATE
}
devenv_sandbox() {
DIRECTORY=$1
if [ -z "$DIRECTORY" ]; then
show_help_sandbox
return 1
fi
SANDBOX_DIR="$SANDBOXES_DIR/$DIRECTORY"
TEMPLATE=$2
if [ -z "$TEMPLATE" ]; then
TEMPLATE=$DIRECTORY
fi
if ! check_template $TEMPLATE; then
return 1
fi
if [ ! -e $SANDBOX_DIR ]; then
echo "Creating sandbox at $SANDBOX_DIR with template $TEMPLATE"
mkdir -p $SANDBOX_DIR
cd $SANDBOX_DIR
devenv_init $TEMPLATE
else
cd $SANDBOX_DIR
fi
}
show_help_sandbox() {
echo "Usage: devenv sandbox <directory> [<template>]"
echo ""
echo " directory: The sandbox directory to go to."
echo " template: If the directory doesn't exist, the template to use for that sandbox"
echo " Defaults to directory if not given."
echo ""
}
show_help() {
echo "Usage: devenv <action>"
echo "Available actions:"
echo ""
echo " init: Initialize a dev env in the current directory"
echo " sandbox: Go to a sandbox directory using a template"
echo ""
}
case "$1" in
init)
shift
devenv_init $@
;;
sandbox)
shift
devenv_sandbox $@
;;
*)
show_help
;;
esac

View File

@@ -0,0 +1,28 @@
{
description = "Development flake for this clojure project";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = nixpkgs.legacyPackages.${system};
projectDependencies = with pkgs; [
];
in {
devShells.default = pkgs.mkShell {
nativeBuildInputs = [ pkgs.bashInteractive ];
buildInputs = with pkgs; [
# Core clojure dependencies
clojure
leiningen
# IDE tools
clojure-lsp
# Development tools
] ++ projectDependencies;
};
});
}

View File

@@ -0,0 +1,37 @@
{
description = "Development flake for this python project";
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = nixpkgs.legacyPackages.${system};
python = pkgs.python312;
pythonPackages = pkgs.python312Packages;
projectDependencies = with pythonPackages; [
];
in {
devShells.default = pkgs.mkShell {
nativeBuildInputs = [ pkgs.bashInteractive ];
buildInputs = with pkgs; [
# Core python dependencies
python
pythonPackages.pip
pythonPackages.virtualenv
# IDE tools
pythonPackages.isort
nodePackages.pyright
# Development tools
black
pythonPackages.ipython
pythonPackages.pytest
pythonPackages.setuptools
] ++ projectDependencies;
};
});
}

View File

@@ -0,0 +1,55 @@
{
description = "Development flake for this ROS project";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
ros-overlay.url = "github:lopsided98/nix-ros-overlay";
ros-overlay.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { self, nixpkgs, flake-utils, ros-overlay }:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = import nixpkgs {
inherit system;
overlays = [ ros-overlay.overlays.default ];
};
in {
devShells.default = pkgs.mkShell {
nativeBuildInputs = with pkgs; [
# Non-ROS packages
] ++ (with rosPackages.humble; [
# ROS packages
(buildEnv {
paths = [
# Core
ros-environment
colcon
# Ros2
ros2run
ros2param
ros2topic
ros2node
ros2interface
ros2service
ros2action
ros2pkg
# RQT
rqt
rqt-msg
rqt-topic
rqt-action
rqt-service-caller
rqt-graph
# Extra
];
})
]);
};
});
}

View File

@@ -0,0 +1,8 @@
[package]
name = ""
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

View File

@@ -0,0 +1,32 @@
{
description = "Development flake for this rust project";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = nixpkgs.legacyPackages.${system};
projectDependencies = with pkgs; [
];
in {
devShells.default = pkgs.mkShell {
nativeBuildInputs = [ pkgs.bashInteractive ];
buildInputs = with pkgs; [
# Core rust dependencies
rustc
cargo
# Development tools
rustfmt
rust-analyzer
clippy
] ++ projectDependencies;
LD_LIBRARY_PATH = nixpkgs.lib.makeLibraryPath projectDependencies;
RUST_BACKTRACE = 1;
};
});
}

100
data/nomad/caddy.nomad Normal file
View File

@@ -0,0 +1,100 @@
job "caddy" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "caddy" {
count = 1
volume "caddyfile" {
type = "host"
read_only = false
source = "caddyfile"
}
volume "caddy-data" {
type = "host"
read_only = false
source = "caddy-data"
}
restart {
attempts = 2
interval = "2m"
delay = "1m"
mode = "fail"
}
network {
port "http" {
static = 80
to = 80
host_network = "public"
}
port "https" {
static = 443
to = 443
host_network = "public"
}
port "config" {
static = 2019
to = 2019
}
dns {
servers = ["100.80.195.56"]
}
}
###
# CADDY
###
task "caddy" {
driver = "docker"
volume_mount {
volume = "caddyfile"
destination = "/etc/caddy/Caddyfile"
read_only = false
}
volume_mount {
volume = "caddy-data"
destination = "/data"
read_only = false
}
env {
}
config {
image = "caddy:2.3.0-alpine"
ports = ["http", "https", "config"]
volumes = [
"/mnt/vatnajokull/lajuntament-web:/sites/lajuntament-web",
"/mnt/vatnajokull/folkugat-web:/sites/folkugat-web",
]
}
resources {
cpu = 500
memory = 128
}
service {
name = "caddy"
check {
type = "tcp"
port = "http"
interval = "30s"
timeout = "2s"
}
}
}
}
}

112
data/nomad/dns.nomad Normal file
View File

@@ -0,0 +1,112 @@
job "dns" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "dns" {
count = 1
restart {
attempts = 10
delay = "15s"
}
# VOLUMES
## pihole
volume "pihole" {
type = "host"
read_only = false
source = "dns-pihole"
}
volume "dnsmasq" {
type = "host"
read_only = false
source = "dns-dnsmasq"
}
## unbound
volume "unbound" {
type = "host"
read_only = false
source = "dns-unbound"
}
# NETWORK
network {
port "dns" {
static = 53
}
port "http" {
to = 80
}
port "unbound" {
static = 5533
}
}
# TASKS
task "pihole" {
driver = "docker"
volume_mount {
volume = "pihole"
destination = "/etc/pihole"
read_only = false
}
volume_mount {
volume = "dnsmasq"
destination = "/etc/dnsmasq.d"
read_only = false
}
env {
TZ = "Europe/Amsterdam"
WEBPASSWORD = "elbonfeix"
ServerIP = "100.80.195.56"
}
config {
image = "pihole/pihole:v5.7"
ports = ["dns", "http"]
}
resources {
cpu = 100
memory = 32
}
service {
name = "pihole-gui"
port = "http"
}
}
task "unbound" {
driver = "docker"
volume_mount {
volume = "unbound"
destination = "/opt/unbound/etc/unbound/"
read_only = false
}
config {
image = "mvance/unbound:latest"
ports = ["unbound"]
}
resources {
cpu = 50
memory = 32
}
}
}
}

62
data/nomad/folkugat.nomad Normal file
View File

@@ -0,0 +1,62 @@
job "folkugat" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "folkugat" {
count = 1
restart {
attempts = 5
delay = "15s"
}
network {
port "http" {
to = 80
}
}
# Volumes
volume "folkugat" {
type = "host"
read_only = false
source = "folkugat"
}
# FOLKUGAT WEB
task "folkugat" {
driver = "docker"
env {
JWT_SECRET = "12345"
ADMIN_PASSWORD = "banshee"
URL_SCHEME = "https"
DB_DIR = "/folkugat/db"
}
config {
image = "marc.sastre.cat/folkugat-web:latest"
ports = ["http"]
}
volume_mount {
volume = "folkugat"
destination = "/folkugat/db"
read_only = false
}
resources {
cpu = 100
memory = 512
}
service {
name = "folkugat"
port = "http"
}
}
}
}

71
data/nomad/gitea.nomad Normal file
View File

@@ -0,0 +1,71 @@
job "gitea" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "gitea" {
count = 1
restart {
attempts = 5
delay = "1m"
}
network {
port "http" {
to = 3000
}
port "ssh" {
static = 2222
to = 22
host_network = "public"
}
}
task "gitea" {
driver = "docker"
env {
USER_UID = "1001"
USER_GID = "1001"
}
config {
image = "gitea/gitea:latest"
ports = ["http", "ssh"]
volumes = ["/mnt/vatnajokull/nomad_volumes/gitea/data:/data"]
}
resources {
cpu = 1000
memory = 400
}
service {
name = "gitea"
port = "http"
check {
type = "tcp"
port = "http"
interval = "30s"
timeout = "2s"
}
}
service {
name = "gitea-ssh"
port = "ssh"
check {
type = "tcp"
port = "ssh"
interval = "30s"
timeout = "2s"
}
}
}
}
}

188
data/nomad/nextcloud.nomad Normal file
View File

@@ -0,0 +1,188 @@
job "nextcloud" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "nextcloud" {
count = 1
restart {
attempts = 5
delay = "1m"
}
# Network
network {
port "nextcloud" {
static = 8080
to = 80
}
port "mariadb" {
static = 3306
to = 3306
}
# port "collabora" {
# to = 9980
# }
}
# Volumes
volume "nextcloud" {
type = "host"
read_only = false
source = "nextcloud"
}
volume "mariadb" {
type = "host"
read_only = false
source = "mariadb"
}
# volume "collabora" {
# type = "host"
# read_only = false
# source = "collabora"
# }
###
# NEXTCLOUD
###
task "nextcloud" {
driver = "docker"
user = 1001
env {
MYSQL_PASSWORD = "hxKOD13MUh"
MYSQL_DATABASE = "nextcloud"
MYSQL_USER = "nextcloud"
MYSQL_HOST = "${NOMAD_ADDR_mariadb}"
NEXTCLOUD_TRUSTED_DOMAINS = "nextcloud.samfelag.xyz"
OVERWRITEPROTOCOL = "https"
}
volume_mount {
volume = "nextcloud"
destination = "/var/www/html"
read_only = false
}
config {
image = "nextcloud:latest"
ports = ["nextcloud"]
}
resources {
cpu = 2000
memory = 512
}
service {
name = "nextcloud"
port = "nextcloud"
check {
type = "tcp"
port = "nextcloud"
interval = "30s"
timeout = "2s"
}
}
}
###
# MARIADB
###
task "mariadb" {
driver = "docker"
user = 1001
env {
MYSQL_ROOT_PASSWORD = "hxKOD13MUh"
MYSQL_ROOT_HOST = "${NOMAD_IP_mariadb}"
MYSQL_PASSWORD = "hxKOD13MUh"
MYSQL_DATABASE = "nextcloud"
MYSQL_USER = "nextcloud"
}
volume_mount {
volume = "mariadb"
destination = "/var/lib/mysql"
read_only = false
}
config {
image = "mariadb:10.5"
ports = ["mariadb"]
}
resources {
cpu = 1000
memory = 256
}
service {
name = "mariadb"
tags = ["mariadb"]
port = "mariadb"
check {
type = "tcp"
port = "mariadb"
interval = "30s"
timeout = "2s"
}
}
}
###
# COLLABORA
###
# task "collabora" {
# driver = "docker"
# env {
# aliasgroup1 = "https://nextcloud.lajuntament.space:443"
# username = "lajuntament"
# password = "eLn1lIm4rc"
# }
# volume_mount {
# volume = "collabora"
# destination = "/etc/loolwsd"
# read_only = false
# }
# config {
# image = "collabora/code:latest"
# ports = ["collabora"]
# }
# resources {
# cpu = 2000
# memory = 1024
# }
# service {
# name = "collabora"
# port = "collabora"
# check {
# type = "tcp"
# port = "collabora"
# interval = "30s"
# timeout = "2s"
# }
# }
# }
}
}

View File

@@ -0,0 +1,67 @@
job "collabora" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "collabora" {
count = 1
restart {
attempts = 5
delay = "1m"
}
network {
port "http" {
to = 9980
}
}
volume "collabora" {
type = "host"
read_only = false
source = "collabora"
}
task "collabora" {
driver = "docker"
env {
domain = "nextcloud\\.lajuntament\\.space"
username = "lajuntament"
password = "eLn1lIm4rc"
extra_params = "--o:ssl.enable=false"
}
volume_mount {
volume = "collabora"
destination = "/etc/loolwsd"
read_only = false
}
config {
image = "collabora/code:latest"
ports = ["http"]
}
resources {
cpu = 1500
memory = 1024
}
service {
name = "collabora"
port = "http"
check {
type = "tcp"
port = "http"
interval = "30s"
timeout = "2s"
}
}
}
}
}

View File

@@ -0,0 +1,46 @@
job "cua-quinto" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "cua-quinto" {
count = 1
restart {
attempts = 5
delay = "15s"
}
network {
port "http" {
to = 80
}
}
# CUA-QUINTO APP
task "cua-quinto" {
driver = "docker"
env {
API_PREFIX = "/cua-quinto"
API_SCHEME = "https"
}
config {
image = "marc.sastre.cat/quinto-cua:latest"
ports = ["http"]
}
resources {
cpu = 50
memory = 64
}
service {
name = "cua-quinto"
port = "http"
}
}
}
}

106
data/nomad/old/lwt.nomad Normal file
View File

@@ -0,0 +1,106 @@
job "lwt" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "lwt" {
count = 1
restart {
attempts = 10
delay = "30s"
}
# VOLUMES
volume "lwt-mariadb" {
type = "host"
read_only = false
source = "lwt-mariadb"
}
volume "lwt" {
type = "host"
read_only = false
source = "lwt"
}
# NETWORK
network {
port "lwt" {
to = 80
}
port "mariadb" {
static = 33306
to = 3306
}
}
# TASKS
task "mariadb" {
driver = "docker"
user = 1001
volume_mount {
volume = "lwt-mariadb"
destination = "/var/lib/mysql"
read_only = false
}
env {
MYSQL_ALLOW_EMPTY_PASSWORD = "no"
MYSQL_ROOT_PASSWORD = "root"
}
config {
image = "mariadb:10.7"
ports = ["mariadb"]
}
resources {
cpu = 100
memory = 128
}
}
task "lwt" {
driver = "docker"
config {
image = "ghcr.io/hugofara/lwt:master"
ports = ["lwt"]
}
volume_mount {
volume = "lwt"
destination = "/var/www/html/media"
read_only = false
}
env {
DB_HOST = "${attr.unique.network.ip-address}:33306" # "100.91.225.117"
}
resources {
cpu = 100
memory = 128
}
service {
name = "lwt"
port = "lwt"
check {
type = "tcp"
port = "lwt"
interval = "30s"
timeout = "10s"
}
}
}
}
}

View File

@@ -0,0 +1,71 @@
job "minecraft" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "minecraft" {
count = 1
volume "minecraft" {
type = "host"
read_only = false
source = "minecraft"
}
restart {
attempts = 2
interval = "2m"
delay = "1m"
mode = "fail"
}
network {
port "server" {
static = 25565
to = 25565
host_network = "minecraft"
}
}
###
# MINECRAFT SERVER
###
task "minecraft" {
driver = "docker"
volume_mount {
volume = "minecraft"
destination = "/data"
read_only = false
}
env {
EULA = "TRUE"
TZ = "Europe/Madrid"
}
config {
image = "itzg/minecraft-server"
ports = ["server"]
}
resources {
cpu = 2800
memory = 1900
}
service {
name = "minecraft"
check {
type = "tcp"
port = "server"
interval = "30s"
timeout = "2s"
}
}
}
}
}

View File

@@ -0,0 +1,133 @@
job "moimoin" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "moimoin" {
count = 1
restart {
attempts = 10
delay = "30s"
}
# VOLUMES
volume "mysql" {
type = "host"
read_only = false
source = "moimoin"
}
# NETWORK
network {
port "moimoin-front" {
to = 5000
}
port "moimoin-back" {
to = 3000
}
port "mysql" {
static = 33306
to = 3306
}
}
# TASKS
task "mysql" {
driver = "docker"
user = 1001
volume_mount {
volume = "mysql"
destination = "/var/lib/mysql"
read_only = false
}
env {
MYSQL_DATABASE = "xat-osr"
MYSQL_ROOT_PASSWORD = "estrell4galicia"
}
config {
image = "arm64v8/mysql:latest"
ports = ["mysql"]
}
resources {
cpu = 500
memory = 512
}
}
task "moimoin-back" {
driver = "docker"
config {
image = "marc.sastre.cat/moimoin-back:latest"
ports = ["moimoin-back"]
}
env {
MYSQL_HOST = "${attr.unique.network.ip-address}" # "100.91.225.117"
MYSQL_PORT = "33306"
MYSQL_USER = "root"
MYSQL_PASSWORD = "estrell4galicia"
MYSQL_NAME = "xat-osr"
CHAT_ADMIN_PSWD = "cervesaEspecial"
CLIENT_HOST = "marc.sastre.cat/moimoin"
}
resources {
cpu = 100
memory = 128
}
service {
name = "moimoin-back"
port = "moimoin-back"
check {
type = "tcp"
port = "moimoin-back"
interval = "30s"
timeout = "10s"
}
}
}
task "moimoin-front" {
driver = "docker"
config {
image = "marc.sastre.cat/moimoin-front:latest"
ports = ["moimoin-front"]
}
env {
CLIENT_PORT = "5000"
}
resources {
cpu = 100
memory = 128
}
service {
name = "moimoin-front"
port = "moimoin-front"
check {
type = "tcp"
port = "moimoin-front"
interval = "30s"
timeout = "10s"
}
}
}
}
}

View File

@@ -0,0 +1,52 @@
job "organice" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "organice" {
count = 1
restart {
attempts = 5
delay = "1m"
}
network {
port "http" {
to = 5000
}
}
task "organice" {
driver = "docker"
env {
ORGANICE_WEBDAV_URL = "https://nextcloud.lajuntament.space/remote.php/dav/files/marc/"
}
config {
image = "twohundredok/organice:latest"
ports = ["http"]
}
resources {
cpu = 100
memory = 128
}
service {
name = "organice"
port = "http"
check {
type = "tcp"
port = "http"
interval = "30s"
timeout = "2s"
}
}
}
}
}

View File

@@ -0,0 +1,70 @@
job "pasta" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "pasta" {
count = 1
restart {
attempts = 5
delay = "15s"
}
network {
port "backend" {
to = 3000
}
port "client" {
to = 80
}
}
# PASTA SERVER
task "pasta-server" {
driver = "docker"
env {
PASTA_PORT = "3000"
PASTA_DIR = "/pasta"
}
config {
image = "marc.sastre.cat/pasta-server"
ports = ["backend"]
volumes = ["/mnt/vatnajokull/nomad_volumes/pasta:/pasta"]
}
resources {
cpu = 100
memory = 256
}
service {
name = "pasta-server"
port = "backend"
}
}
# PASTA CLIENT
task "pasta-client" {
driver = "docker"
config {
image = "marc.sastre.cat/pasta-client"
ports = ["client"]
}
resources {
cpu = 50
memory = 32
}
service {
name = "pasta-client"
port = "client"
}
}
}
}

View File

@@ -0,0 +1,73 @@
job "pihole" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "pihole" {
count = 1
volume "pihole" {
type = "host"
read_only = false
source = "dns-pihole"
}
volume "dnsmasq" {
type = "host"
read_only = false
source = "dns-dnsmasq"
}
restart {
attempts = 5
delay = "15s"
}
network {
port "dns" {
static = 53
}
port "http" {
to = 80
}
}
task "pihole" {
driver = "docker"
volume_mount {
volume = "pihole"
destination = "/etc/pihole"
read_only = false
}
volume_mount {
volume = "dnsmasq"
destination = "/etc/dnsmasq.d"
read_only = false
}
env {
TZ = "Europe/Amsterdam"
WEBPASSWORD = "elbonfeix"
ServerIP = "100.107.148.47"
}
config {
image = "pihole/pihole:v5.7"
ports = ["dns", "http"]
}
resources {
cpu = 100
memory = 64
}
service {
name = "pihole-gui"
port = "http"
}
}
}
}

View File

@@ -0,0 +1,41 @@
job "presencia" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "presencia" {
count = 1
restart {
attempts = 5
delay = "15s"
}
network {
port "http" {
to = 5000
}
}
# PRESENCIA APP
task "presencia" {
driver = "docker"
config {
image = "marc.sastre.cat/presencia"
ports = ["http"]
}
resources {
cpu = 50
memory = 64
}
service {
name = "presencia"
port = "http"
}
}
}
}

View File

@@ -0,0 +1,47 @@
job "unbound" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "unbound" {
count = 1
volume "unbound" {
type = "host"
read_only = false
source = "dns-unbound"
}
restart {
attempts = 5
delay = "15s"
}
network {
port "dns" {
static = 5533
}
}
task "unbound" {
driver = "docker"
volume_mount {
volume = "unbound"
destination = "/opt/unbound/etc/unbound/"
read_only = false
}
config {
image = "mvance/unbound:latest"
ports = ["dns"]
}
resources {
cpu = 50
memory = 64
}
}
}
}

View File

@@ -0,0 +1,52 @@
job "webhooks" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "webhooks" {
count = 1
restart {
attempts = 5
delay = "1m"
}
network {
port "http" {
to = 6000
}
}
task "webhooks" {
driver = "docker"
env {
CONFIG_FILE = "/app/data/config.json"
}
config {
image = "marc.sastre.cat/webhooks:latest"
ports = ["http"]
volumes = ["/mnt/vatnajokull/nomad_volumes/webhooks:/app/data"]
}
resources {
cpu = 100
memory = 128
}
service {
name = "webhooks"
port = "http"
check {
type = "tcp"
port = "http"
interval = "30s"
timeout = "2s"
}
}
}
}
}

52
data/nomad/registry.nomad Normal file
View File

@@ -0,0 +1,52 @@
job "registry" {
region = "global"
datacenters = ["samfelag"]
type = "service"
group "registry" {
count = 1
restart {
attempts = 5
delay = "1m"
}
network {
port "http" {
to = 5000
}
}
task "registry" {
driver = "docker"
env {
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY = "/data"
}
config {
image = "registry:2"
ports = ["http"]
volumes = ["/mnt/vatnajokull/nomad_volumes/registry:/data"]
}
resources {
cpu = 100
memory = 256
}
service {
name = "registry"
port = "http"
check {
type = "tcp"
port = "http"
interval = "30s"
timeout = "2s"
}
}
}
}
}

BIN
data/wallpapers/globus.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

BIN
data/wallpapers/prat.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

BIN
data/wallpapers/rosa.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

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