├── .editorconfig ├── .gitignore ├── GNOME.md ├── Install.md ├── LICENSE ├── README.md ├── batconfig ├── bin ├── backup ├── backup-gnome-extensions ├── build-devcontainer ├── clear ├── clear-weather-city ├── copy-env ├── dev ├── lock-listener ├── porn ├── private ├── release ├── restore-gnome-extensions ├── susedko ├── susedko-listener ├── update ├── update-devcontainer-configs ├── update-dockerfile ├── update-extension-lists ├── update-languagetool ├── zed-isolate └── zoom ├── devcontainer ├── Dockerfile ├── devcontainer.json └── install-dotfiles ├── gitconfig ├── gitignore ├── hooks-trap ├── applypatch-msg ├── commit-msg ├── post-applypatch ├── post-checkout ├── post-commit ├── post-merge ├── post-rewrite ├── pre-applypatch ├── pre-auto-gc ├── pre-commit ├── pre-merge-commit ├── pre-push ├── pre-rebase └── prepare-commit-msg ├── icons ├── backup.desktop ├── backup.svg ├── porn.desktop ├── private.desktop ├── private.svg ├── update.desktop ├── video.svg └── zed-isolate.desktop ├── micro.json ├── mimeapps.list ├── mpv-input.conf ├── mpv.conf ├── ripgreprc ├── sshconfig ├── starship.toml ├── zed-keys.json ├── zed.json └── zshrc /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [micro.json] 12 | indent_size = 4 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | secrets.env 2 | -------------------------------------------------------------------------------- /GNOME.md: -------------------------------------------------------------------------------- 1 | ## GNOME Shell Extensions 2 | 3 | * [Alphabetical App Grid](https://extensions.gnome.org/extension/4269/alphabetical-app-grid/) 4 | * [App Hider](https://extensions.gnome.org/extension/5895/app-hider/) 5 | * [Autohide Battery](https://extensions.gnome.org/extension/595/autohide-battery/) 6 | * [Battery Health Charging](https://extensions.gnome.org/extension/5724/battery-health-charging/) 7 | * [Battery Time](https://extensions.gnome.org/extension/5425/battery-time/) 8 | * [Battery Usage Wattmeter](https://extensions.gnome.org/extension/6278/battery-usage-wattmeter/) 9 | * [Blur my Shell](https://extensions.gnome.org/extension/3193/blur-my-shell/) 10 | * [Dim Completed Calendar Events](https://extensions.gnome.org/extension/5979/dim-completed-calendar-events/) 11 | * [Do Not Disturb While Screen Sharing Or Recording](https://extensions.gnome.org/extension/5985/do-not-disturb-while-screen-sharing-or-recording/) 12 | * [Emoji Copy](https://extensions.gnome.org/extension/6242/emoji-copy/) 13 | * [Folder Search Provider](https://extensions.gnome.org/extension/8227/folder-search-provider/) 14 | * [Forge](https://extensions.gnome.org/extension/4481/forge/) 15 | * [Gnome 4x UI Improvements](https://extensions.gnome.org/extension/4158/gnome-40-ui-improvements/) 16 | * [GSConnect](https://extensions.gnome.org/extension/1319/gsconnect/) 17 | * [Hide Keyboard Layout](https://extensions.gnome.org/extension/2848/hide-keyboard-layout/) 18 | * [Home Assistant Extension](https://extensions.gnome.org/extension/4170/home-assistant-extension/) 19 | * [Launch new instance](https://extensions.gnome.org/extension/600/launch-new-instance/) 20 | * [Night Theme Switcher](https://extensions.gnome.org/extension/2236/night-theme-switcher/) 21 | * [Quick Settings Tweaks](https://extensions.gnome.org/extension/5446/quick-settings-tweaker/) 22 | * [Right Click Next](https://extensions.gnome.org/extension/7600/right-click-next/) 23 | * [Top Panel Workspace Scroll](https://extensions.gnome.org/extension/701/top-panel-workspace-scroll/) 24 | * [Tweaks & Extensions in System Menu](https://extensions.gnome.org/extension/1653/tweaks-in-system-menu/) 25 | * [Volume Boost](https://extensions.gnome.org/extension/7450/volume-boost/) 26 | * [Weather O'Clock](https://extensions.gnome.org/extension/5470/weather-oclock/) 27 | -------------------------------------------------------------------------------- /Install.md: -------------------------------------------------------------------------------- 1 | ## How I install my system 2 | 3 | ### Preparing 4 | 5 | Download [Fedora image](https://getfedora.org/ru/workstation/) 6 | and write it to the USB drive: 7 | 8 | ```sh 9 | flatpak install flathub io.gitlab.adhami3310.Impression 10 | ``` 11 | 12 | Copy `.ssh` and `.gnupg` into `.Private`. 13 | 14 | Clean `node_modules`: 15 | 16 | ```sh 17 | rm -R ~/Dev/*/node_modules ~/Dev/*/*/node_modules ~/Dev/*/coverage ~/Dev/*/*/coverage ~/Dev/susedko/fedora-coreos.iso 18 | ``` 19 | 20 | Copy these files to external SDD: 21 | * `Dev/` 22 | * `Vídeos/*` 23 | * `.Private/` 24 | 25 | 26 | ### BIOS 27 | 28 | 1. Boot to BIOS and set supervisor password. 29 | 2. Set battery charge limit to 80%. 30 | 3. Set Game Optimized iGPU. 31 | 4. Temporary enable USB boot. 32 | 33 | 34 | ### Install 35 | 36 | Start installer: 37 | 38 | 1. Select English language. 39 | 2. Use disk manual mode. 40 | 1. Create `btrfs` partitions automatically. 41 | 2. Remove `/home` partition. 42 | 3. Remove `/` partition. 43 | 4. Add new `/` partition. 44 | 5. Rename volume to `savoia`. 45 | 6. Set encryption in volume settings. 46 | 47 | Reboot to USB drive again. Mount laptop SSD. 48 | 49 | Open `etc/fstab`. 50 | 51 | Add `noatime,nodiratime` to root partitions. 52 | 53 | Move `/tmp` and `/var/tmp` to RAM: 54 | 55 | ``` 56 | vartmp /var/tmp tmpfs defaults,noatime,nodiratime 0 0 57 | vartmp /tmp tmpfs defaults,noatime,nodiratime 0 0 58 | ``` 59 | 60 | Reboot to BIOS. Block boot from USB. 61 | 62 | Reboot to system. Set Spanish language, name to `Andrey Sitnik` and login `ai`. 63 | 64 | Set laptop name: 65 | 66 | ```sh 67 | sudo hostnamectl set-hostname savoia 68 | ``` 69 | 70 | Reboot. 71 | 72 | Copy `Dev/` and `.Private/` from external SDD and open `Install.md` locally. 73 | 74 | Reduce swap usage by creating `/etc/sysctl.d/99-swappiness.conf` with: 75 | 76 | ``` 77 | vm.swappiness = 10 78 | ``` 79 | 80 | Disable ambient light sensor: 81 | 82 | ```sh 83 | echo "blacklist hid_sensor_hub" | sudo tee /etc/modprobe.d/blacklist.conf 84 | sudo dracut --force 85 | ``` 86 | 87 | Fix booting video glitch: 88 | 89 | ```sh 90 | sudo grubby --update-kernel=ALL --args="plymouth.use-simpledrm=0" 91 | ``` 92 | 93 | Enable `Rendimiento`, disable `Ahorro de energía automático`, 94 | `Suspender automaticámente` in Energía settings. 95 | 96 | 97 | ### System Update 98 | 99 | Set `KEYMAP=us` and `XKBLAYOUT=us` in `/etc/vconsole.conf`. 100 | 101 | Remove unnecessary packages: 102 | 103 | ```sh 104 | sudo dnf remove cheese rhythmbox gnome-boxesd orca gnome-contacts gnome-getting-started-docs nautilus-sendto gnome-shell-extension-* libreoffice-* gnome-characters gnome-maps gnome-photos simple-scan virtualbox-guest-additions gedit gnome-boxes gnome-tour gnome-connections mediawriter eog gnome-system-monitor baobab gnome-log gnome-calculator gnome-weather gnome-text-editor gnome-font-viewer gnome-clocks gnome-calendar evince totem ffmpeg-free snapshot intel-media-driver cups-browsed anaconda 105 | ``` 106 | 107 | Run Software Center, disable `Fedora Flatpak` and enable Flathub and Chrome. 108 | 109 | Add RPM Fusion: 110 | 111 | ```sh 112 | sudo dnf install --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm 113 | ``` 114 | 115 | Update system via Software Center. 116 | 117 | Install software: 118 | 119 | ```sh 120 | sudo dnf swap ffmpeg-free ffmpeg --allowerasing 121 | sudo dnf swap mesa-va-drivers mesa-va-drivers-freeworld 122 | sudo dnf swap mesa-vdpau-drivers mesa-vdpau-drivers-freeworld 123 | sudo dnf copr enable atim/starship 124 | sudo dnf copr enable dusansimic/themes 125 | sudo dnf install xclip micro fuse-encfs zenity borgbackup openssl ffmpegthumbnailer nss-tools mosquitto ydotool amrnb amrwb faac faad2 flac gstreamer1-libav gstreamer1-plugins-bad-freeworld gstreamer-ffmpeg gstreamer-plugins-bad-nonfree gstreamer-plugins-espeak gstreamer-plugins-ugly lame libdca libmad libmatroska x264 x265 xvidcore gstreamer1-plugins-bad-free gstreamer1-plugins-base gstreamer1-plugins-good gstreamer-plugins-bad gstreamer1-plugins-ugly-free mpv ffmpeg xorg-x11-drv-intel intel-media-driver webp-pixbuf-loader heif-pixbuf-loader avif-pixbuf-loader libheif-freeworld ffmpeg-libs libva libva-utils gstreamer1-vaapi mozilla-openh264 libheif-tools unrar p7zip p7zip-plugins speech-dispatcher speech-dispatcher-utils google-chrome-stable nodejs podman git tig ripgrep xkill bat make difftastic java-21-openjdk nextcloud-client zsh util-linux-user starship sqlite input-remapper morewaita-icon-theme nethogs https://downloads.sourceforge.net/project/mscorefonts2/rpms/msttcore-fonts-installer-2.6-1.noarch.rpm 126 | ``` 127 | 128 | Set Flatpak languages: 129 | 130 | ```sh 131 | flatpak config languages --set "es;en;ru" 132 | sudo flatpak update 133 | ``` 134 | 135 | Install applications from Flatpak: 136 | 137 | ```sh 138 | flatpak install flathub de.haeckerfelix.Fragments org.telegram.desktop us.zoom.Zoom org.nickvision.tubeconverter org.gnome.Loupe com.mattjakeman.ExtensionManager io.gitlab.adhami3310.Converter io.missioncenter.MissionCenter org.gnome.baobab org.gnome.Calculator org.gnome.Logs org.gnome.Weather org.gnome.clocks org.gnome.Calendar org.gnome.Epiphany org.inkscape.Inkscape org.gnome.gitlab.YaLTeR.VideoTrimmer org.gnome.gitlab.cheywood.Iotas app.devsuite.Ptyxis hu.irl.cameractrls org.gnome.Snapshot org.gnome.Papers org.gimp.GIMP dev.zed.Zed 139 | flatpak remote-add --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo 140 | flatpak install flathub-beta com.yubico.yubioath 141 | ``` 142 | 143 | Add network usage tracking for apps in Mission Center. 144 | 145 | ```sh 146 | sudo setcap "cap_net_admin,cap_net_raw,cap_dac_read_search,cap_sys_ptrace+pe" "$(which nethogs)" 147 | ``` 148 | 149 | Remove default GNOME console. 150 | 151 | Fix unnecessary folder creation in Zoom: 152 | 153 | ```sh 154 | flatpak override --user us.zoom.Zoom --nofilesystem=~/Documents/Zoom 155 | mkdir -p ~/.local/share/flatpak/exports/share/applications/ 156 | cp /var/lib/flatpak/exports/share/applications/us.zoom.Zoom.desktop ~/.local/share/flatpak/exports/share/applications/ 157 | ``` 158 | 159 | Replace `Exec` to `/home/ai/Dev/environment/bin/zoom @@u %U @@` in `~/.local/share/flatpak/exports/share/applications/us.zoom.Zoom.desktop`. 160 | 161 | Add Autostart and fingers to user settings. 162 | 163 | Disable Software auto-start: 164 | 165 | ```sh 166 | dconf write /org/gnome/software/allow-updates false 167 | dconf write /org/gnome/software/download-updates false 168 | mkdir -p ~/.config/autostart && cp /etc/xdg/autostart/org.gnome.Software.desktop ~/.config/autostart/ 169 | echo "X-GNOME-Autostart-enabled=false" >> ~/.config/autostart/gnome-software-service.desktop 170 | dconf write /org/gnome/desktop/search-providers/disabled "['org.gnome.Software.desktop']" 171 | echo "X-GNOME-Autostart-enabled=false" >> ~/.config/autostart/org.gnome.Software.desktop 172 | ``` 173 | 174 | Set [color profile](https://www.notebookcheck.net/uploads/tx_nbc2/BOE0CB4.icm) 175 | in `Color` settings. 176 | 177 | Install `micro` and its plugins: 178 | 179 | ```sh 180 | micro -plugin install editorconfig 181 | sudo dnf remove nano 182 | ``` 183 | 184 | Disable waking up by mouse by creating `/etc/udev/rules.d/logitech-bolt.rules`: 185 | 186 | ```sh 187 | ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c548", ATTR{power/wakeup}="disabled" 188 | ``` 189 | 190 | [Disable](https://discussion.fedoraproject.org/t/please-enter-passphrase-for-disk-has-returned/150626/5) disk name in password prompt. 191 | 192 | 193 | ### Base Settings 194 | 195 | Disable file system scanning: 196 | 197 | ```sh 198 | dconf write /org/freedesktop/tracker/miner/files/crawling-interval -2 199 | ``` 200 | 201 | Enable HiPDI on login screen: 202 | 203 | ```sh 204 | sudo cp ~/.config/monitors.xml /var/lib/gdm/.config/ 205 | sudo chown gdm:gdm /var/lib/gdm/.config/monitors.xml 206 | ``` 207 | 208 | Change geolocation API: 209 | 210 | ```sh 211 | sudo mkdir /etc/geoclue/conf.d 212 | sudo tee > /etc/geoclue/conf.d/99-beacondb.conf < ~/.config/gtk-3.0/bookmarks 426 | ``` 427 | 428 | Remove unnecessary folders: 429 | 430 | ```sh 431 | rm -R ~/Imágenes ~/Música ~/Público ~/Plantillas ~/Escritorio 432 | mkdir "Capturas de pantalla" 433 | ``` 434 | 435 | Connect to server in Files by `sftp://ai@susedko.local/` and add `vault` to Favorites places. Add `Descargas` and `Capturas de pantalla` to Favorites places. 436 | 437 | Add icon theme: 438 | 439 | ```sh 440 | gsettings set org.gnome.desktop.interface icon-theme 'MoreWaita' 441 | ``` 442 | 443 | Set icons: 444 | 445 | * `/usr/share/icons/MoreWaita/scalable/places/folder-code.svg` 446 | for `~/Dev/`. 447 | * `/usr/share/icons/Adwaita/scalable/places/folder-pictures.svg` 448 | for `~/Capturas de pantalla/`. 449 | 450 | 451 | ## Home Server 452 | 453 | Add server’s sertificate to the system: 454 | 455 | ```sh 456 | certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n sitnik -i ~/Dev/susedko/sitniks.crt 457 | sudo cp ~/Dev/susedko/sitniks.crt /etc/pki/ca-trust/source/anchors/sitniks.pem 458 | sudo update-ca-trust 459 | ``` 460 | 461 | Add service to `~/.config/systemd/user/susedko-listener.service`: 462 | 463 | ```ini 464 | [Unit] 465 | Description=Susedko Listener 466 | After=network-online.target 467 | Wants=network-online.target 468 | 469 | [Service] 470 | ExecStart=/home/ai/Dev/environment/bin/susedko-listener 471 | Restart=on-failure 472 | RestartSec=30s 473 | StartLimitBurst=5 474 | 475 | [Install] 476 | WantedBy=default.target 477 | ``` 478 | 479 | Add service to `/etc/systemd/system/ydotoold.service`: 480 | 481 | ```ini 482 | [Unit] 483 | Description=ydotool Daemon 484 | 485 | [Service] 486 | ExecStart=ydotoold --socket-path="/run/.ydotool_socket" --socket-own="1000:1000" 487 | Restart=on-failure 488 | RestartSec=30s 489 | 490 | [Install] 491 | WantedBy=default.target 492 | ``` 493 | 494 | Create script on screen lock at `~/.config/systemd/user/lock-listener.service`: 495 | 496 | ```ini 497 | [Unit] 498 | Description=Run script on screen lock 499 | 500 | [Service] 501 | Type=simple 502 | ExecStart=/home/ai/Dev/environment/bin/lock-listener 503 | 504 | [Install] 505 | WantedBy=default.target 506 | ``` 507 | 508 | Enable services: 509 | 510 | ```sh 511 | sudo systemctl enable ydotoold.service 512 | sudo systemctl start ydotoold.service 513 | systemctl --user enable susedko-listener.service 514 | systemctl --user start susedko-listener.service 515 | systemctl --user enable lock-listener.service 516 | systemctl --user start lock-listener.service 517 | ``` 518 | 519 | ### Additional Software 520 | 521 | Fix Wayland in Chrome: 522 | 1. Open Chrome. 523 | 2. Open `chrome://flags/#ozone-platform-hint`. 524 | 3. Set Wayland. 525 | 526 | Left only Telegram, Firefox, Nautilus, Terminal, Iotas, System Update, and 527 | Backup in the dock. 528 | 529 | 530 | ### Development Tools 531 | 532 | Install Node.js, TypeScript, and Dev Containers. 533 | 534 | ```sh 535 | mkdir -p ~/.local/lib/node/ 536 | tee -a ~/.local/lib/node/package.json << EOM 537 | { 538 | "dependencies": { 539 | "@devcontainers/cli": ">=0.76.0" 540 | } 541 | } 542 | EOM 543 | cd ~/.local/lib/node && npm install && cd 544 | podman volume create pnpm-store 545 | ``` 546 | 547 | Sign-in to npm: 548 | 549 | ```sh 550 | npm login 551 | ``` 552 | 553 | Install Keybase: 554 | 555 | ```sh 556 | sudo dnf install https://prerelease.keybase.io/keybase_amd64.rpm 557 | run_keybase 558 | ``` 559 | 560 | Disable autostart in Keybase settings and revoke old laptop. 561 | 562 | 563 | ## LanguageTool Server 564 | 565 | Prepare [ngrams](https://languagetool.org/download/ngram-data/): 566 | 567 | ```sh 568 | mkdir -p ~/.local/share/ngrams 569 | cd ~/.local/share/ngrams 570 | wget https://languagetool.org/download/ngram-data/ngrams-en-20150817.zip 571 | wget https://languagetool.org/download/ngram-data/ngrams-es-20150915.zip 572 | wget https://languagetool.org/download/ngram-data/untested/ngram-ru-20150914.zip 573 | unzip ngrams-en-20150817.zip 574 | unzip ngrams-es-20150915.zip 575 | unzip ngram-ru-20150914.zip 576 | rm ngram*.zip 577 | ``` 578 | 579 | Prepare `fasttext`: 580 | 581 | ```sh 582 | wget https://download.copr.fedorainfracloud.org/results/fcsm/fasttext/fedora-39-x86_64/06624475-fasttext/fasttext-0.9.2-4.fc39.x86_64.rpm https://download.copr.fedorainfracloud.org/results/fcsm/fasttext/fedora-39-x86_64/06624475-fasttext/fasttext-libs-0.9.2-4.fc39.x86_64.rpm 583 | sudo dnf install ./fasttext-* 584 | rm ./fasttext-* 585 | mkdir -p ~/.local/share/fasttext 586 | cd ~/.local/share/fasttext 587 | wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin 588 | ``` 589 | 590 | Create config `~/.config/languagetool.properties`: 591 | 592 | ```ini 593 | languageModel=/home/ai/.local/share/ngrams 594 | fasttextModel=/home/ai/.local/share/fasttext/lid.176.bin 595 | fasttextBinary=/usr/bin/fasttext 596 | ``` 597 | 598 | ```sh 599 | mkdir -p ~/.config/systemd/user/ 600 | ``` 601 | 602 | Create service unit `~/.config/systemd/user/languagetool.service`: 603 | 604 | ```ini 605 | [Unit] 606 | Description=LanguageTool Server 607 | 608 | [Service] 609 | ExecStart=java -Xms512m -Xmx2g \ 610 | -cp .local/lib/languagetool/languagetool-server.jar \ 611 | org.languagetool.server.HTTPServer \ 612 | --config .config/languagetool.properties \ 613 | --port 8081 --allow-origin 614 | 615 | [Install] 616 | WantedBy=default.target 617 | ``` 618 | 619 | Install LanguageTool: 620 | 621 | ```sh 622 | ~/Dev/environment/bin/update-languagetool 623 | ``` 624 | 625 | Enable service. 626 | 627 | ```sh 628 | systemctl --user enable --now languagetool.service 629 | ``` 630 | 631 | 632 | ## Google Cloud 633 | 634 | Install `gcloud` CLI: 635 | 636 | ```sh 637 | sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM 638 | [google-cloud-cli] 639 | name=Google Cloud CLI 640 | baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el9-x86_64 641 | enabled=1 642 | gpgcheck=1 643 | repo_gpgcheck=0 644 | gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg 645 | EOM 646 | sudo dnf install google-cloud-cli 647 | ``` 648 | 649 | Create a user for Google Cloud: 650 | 651 | ```sh 652 | sudo useradd gcloud 653 | ``` 654 | 655 | Sign-in: 656 | 657 | ```sh 658 | gcloud auth login 659 | ``` 660 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright 2013 Andrey Sitnik 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | My home configs, scripts and [installation process](./Install.md). 2 | 3 | See also [my keyboard layout](https://github.com/ai/universal-layout). 4 | 5 | ### Configs 6 | 7 | * [GNOME Shell extensions](./GNOME.md) 8 | * [`.gitconfig`](./gitconfig) 9 | -------------------------------------------------------------------------------- /batconfig: -------------------------------------------------------------------------------- 1 | --plain 2 | -------------------------------------------------------------------------------- /bin/backup: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | TITLE='\033[0;32m\033[1m' 4 | GRAY='\033[0;90m' 5 | NC='\033[0m' 6 | 7 | hour=$(date +"%H") 8 | if [[ hour -lt 9 || hour -ge 22 ]]; then 9 | echo -e "${TITLE}Prepare bed for sleep${GRAY}" 10 | ~/Dev/environment/bin/susedko script/turn_on script.heat_bedroom 11 | echo -e "${NC}\n" 12 | fi 13 | 14 | echo -e "${TITLE}Backup GNOME extensions${GRAY}" 15 | ~/Dev/environment/bin/backup-gnome-extensions 16 | echo -e "${NC}\n" 17 | 18 | echo -e "${TITLE}Backup home server${GRAY}" 19 | cd ~/Dev/susedko 20 | make ha_backup 21 | cd 22 | echo -e "${NC}\n" 23 | 24 | echo -e "${TITLE}Copy files${GRAY}" 25 | export BORG_REPO=ai@susedko.local:/var/mnt/vault/ai/backup 26 | SERVICE_NAME="BorgBackup" 27 | USERNAME="backup" 28 | BORG_PASSPHRASE=$(secret-tool lookup service "BorgBackup" username "ai") 29 | if [ -z "$BORG_PASSPHRASE" ]; then 30 | read -sp "Enter Backup Passphrase: " BORG_PASSPHRASE 31 | echo "$BORG_PASSPHRASE" | secret-tool store --label="Password for backup" service "BorgBackup" username "ai" 32 | fi 33 | export BORG_PASSPHRASE 34 | borg create \ 35 | --verbose \ 36 | --filter AME \ 37 | --list \ 38 | --stats \ 39 | --show-rc \ 40 | --progress \ 41 | --compression lz4 \ 42 | --exclude-caches \ 43 | --exclude '*.iso' \ 44 | --exclude '**/node_modules' \ 45 | --exclude '**/.mozilla/**/lock' \ 46 | --exclude '**/.mozilla/**/crashes' \ 47 | --exclude '**/.mozilla/**/bookmarkbackups' \ 48 | --exclude '**/.mozilla/**/datareporting/archived' \ 49 | --exclude '**/.mozilla/**/weave/logs' \ 50 | --exclude '**/.mozilla/**/cache' \ 51 | --exclude '**/.mozilla/firefox/firefox-mpris' \ 52 | --exclude '**/.mozilla/firefox/Crash Reports' \ 53 | --exclude '**/.var/app/**/cache' \ 54 | --exclude '**/.var/app/**/Cache' \ 55 | --exclude '**/.var/app/**/media_cache' \ 56 | --exclude '**/.var/app/**/temp_data' \ 57 | --exclude '**/.var/app/**/cache_*' \ 58 | --exclude '**/.var/app/org.gnome.Epiphany' \ 59 | --exclude '**/.var/app/org.inkscape.Inkscape' \ 60 | --exclude '**/.var/app/io.missioncenter.MissionCenter' \ 61 | --exclude '**/.var/app/com.belmoussaoui.Decoder' \ 62 | --exclude '**/.var/app/us.zoom.Zoom/.zoom/data/Emojis' \ 63 | --exclude '**/.ld.so' \ 64 | --exclude '**/*.log' \ 65 | --exclude '**/sitnik.ru/dist' \ 66 | ::'{hostname}-{now}' \ 67 | ~/Dev/susedko \ 68 | ~/Dev/environment \ 69 | ~/Dev/sitnik.ru \ 70 | ~/.ssh \ 71 | ~/.gnupg \ 72 | ~/.Private \ 73 | ~/.config/Code/User/globalStorage \ 74 | ~/.config/input-remapper-2 \ 75 | ~/.mozilla \ 76 | ~/.config/gsconnect \ 77 | ~/.local/share/gnome-shell-extensions-settings \ 78 | ~/.var/app 79 | borg prune \ 80 | --list \ 81 | --show-rc \ 82 | --keep-last 14 83 | borg compact 84 | unset BORG_PASSPHRASE 85 | echo -e "${NC}\n" 86 | 87 | echo -e "${TITLE}Sync videos${GRAY}" 88 | rsync -a --delete --progress \ 89 | --no-perms --no-owner --no-group \ 90 | /home/ai/Vídeos/Erótica/ ai@susedko.local:/var/mnt/vault/ai/Selected 91 | 92 | exit ${global_exit} 93 | -------------------------------------------------------------------------------- /bin/backup-gnome-extensions: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | backup_dir="$HOME/.local/share/gnome-shell-extensions-settings" 4 | rm -r "$backup_dir" 5 | mkdir -p "$backup_dir" 6 | 7 | extensions=$(gsettings get org.gnome.shell enabled-extensions | tr -d "[],'") 8 | 9 | for extension in $extensions; do 10 | base_name=$(echo "$extension" | sed 's/@.*//') 11 | output_file="$backup_dir/${extension}.ini" 12 | settings=$(dconf dump "/org/gnome/shell/extensions/$base_name/") 13 | if [ -n "$settings" ]; then 14 | echo "$settings" > "$output_file" 15 | echo "Settings for $extension saved" 16 | fi 17 | done 18 | -------------------------------------------------------------------------------- /bin/build-devcontainer: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ~/Dev/environment/bin/copy-env 4 | 5 | podman build -t localhost/ai-opensource \ 6 | -f /home/ai/Dev/environment/devcontainer/Dockerfile \ 7 | /home/ai/Dev/environment 8 | -------------------------------------------------------------------------------- /bin/clear: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Before $(df -h / | tail -1 | awk '{print $4}')" 4 | echo 5 | 6 | podman rmi --all --force 7 | pnpm store prune 8 | yarn cache clean 9 | npm cache clean -f 10 | rm -Rf ~/.local/share/Trash/ 11 | 12 | echo 13 | echo "After $(df -h / | tail -1 | awk '{print $4}')" 14 | -------------------------------------------------------------------------------- /bin/clear-weather-city: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | gsettings reset org.gnome.Weather locations 4 | -------------------------------------------------------------------------------- /bin/copy-env: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Copy config and scripts to or from repo 3 | 4 | if [ "$1" == "system" ]; then 5 | rm ~/.local/share/applications/*.{desktop,svg} -f 6 | cp ~/Dev/environment/icons/* ~/.local/share/applications/ 7 | mkdir -p ~/.atom 8 | mkdir -p ~/.node 9 | mkdir -p ~/.prompt 10 | mkdir -p ~/.config/bat/ 11 | mkdir -p ~/.config/mpv/ 12 | mkdir -p ~/.config/Code/User/ 13 | mkdir -p ~/.config/git/ 14 | mkdir -p ~/.config/micro/ 15 | mkdir -p ~/.config/zed/ 16 | cp ~/Dev/environment/zshrc ~/.zshrc 17 | cp ~/Dev/environment/zed.json ~/.var/app/dev.zed.Zed/config/zed/settings.json 18 | cp ~/Dev/environment/zed-keys.json ~/.var/app/dev.zed.Zed/config/zed/keymap.json 19 | cp ~/Dev/environment/mpv.conf ~/.config/mpv/mpv.conf 20 | cp ~/Dev/environment/ripgreprc ~/.ripgreprc 21 | cp ~/Dev/environment/sshconfig ~/.ssh/config 22 | cp ~/Dev/environment/batconfig ~/.config/bat/config 23 | cp ~/Dev/environment/gitconfig ~/.config/git/config 24 | cp ~/Dev/environment/gitignore ~/.config/git/ignore 25 | cp ~/Dev/environment/starship.toml ~/.config/starship.toml 26 | cp ~/Dev/environment/mimeapps.list ~/.config/mimeapps.list 27 | cp ~/Dev/environment/mpv-input.conf ~/.config/mpv/input.conf 28 | cp ~/Dev/environment/micro.json ~/.config/micro/settings.json 29 | else 30 | rm ~/Dev/environment/icons/*.{svg,desktop} -f 31 | cp ~/.zshrc ~/Dev/environment/zshrc 32 | cp ~/.ripgreprc ~/Dev/environment/ripgreprc 33 | cp ~/.ssh/config ~/Dev/environment/sshconfig 34 | cp ~/.config/git/config ~/Dev/environment/gitconfig 35 | cp ~/.config/git/ignore ~/Dev/environment/gitignore 36 | cp ~/.config/bat/config ~/Dev/environment/batconfig 37 | cp ~/.config/mpv/mpv.conf ~/Dev/environment/mpv.conf 38 | cp ~/.config/starship.toml ~/Dev/environment/starship.toml 39 | cp ~/.config/mpv/input.conf ~/Dev/environment/mpv-input.conf 40 | cp ~/.config/mimeapps.list ~/Dev/environment/mimeapps.list 41 | cp ~/.config/micro/settings.json ~/Dev/environment/micro.json 42 | cp ~/.local/share/applications/*.{svg,desktop} ~/Dev/environment/icons/ 43 | cp ~/.var/app/dev.zed.Zed/config/zed/settings.json ~/Dev/environment/zed.json 44 | cp ~/.var/app/dev.zed.Zed/config/zed/keymap.json ~/Dev/environment/zed-keys.json 45 | rm ~/Dev/environment/icons/chrome-* -f 46 | rm ~/Dev/environment/icons/userapp-* -f 47 | rm ~/Dev/environment/icons/org.gnome.Shell.Extensions.* -f 48 | ~/Dev/environment/bin/update-extension-lists 49 | fi 50 | -------------------------------------------------------------------------------- /bin/dev: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | function devcontainer_root() { 6 | local dir=$PWD 7 | while [ "$dir" != "/" ]; do 8 | if [[ -f "$dir/.devcontainer.json" ]] || [[ -d "$dir/.devcontainer" ]]; then 9 | echo $dir 10 | return 11 | fi 12 | dir=$(dirname "$dir") 13 | done 14 | echo "No .devcontainer.json or .devcontainer/ found" >&2 15 | return 1 16 | } 17 | 18 | function devcontainer_config() { 19 | if [[ -f "$1/.devcontainer/podman/devcontainer.json" ]]; then 20 | echo "$1/.devcontainer/podman/devcontainer.json" 21 | elif [[ -f "$1/.devcontainer/devcontainer.json" ]]; then 22 | echo "$1/.devcontainer/devcontainer.json" 23 | else 24 | echo "$1/.devcontainer.json" 25 | fi 26 | } 27 | 28 | root=$(devcontainer_root) 29 | if [ "$root" = "" ]; then 30 | echo "No .devcontainer.json or .devcontainer/ found" >&2 31 | return 1 32 | fi 33 | 34 | search_pattern="vsc-$(basename "$(devcontainer_root)")-[0-9a-f]\+-uid" 35 | 36 | if [ "$1" = "--up" ]; then 37 | ~/.local/lib/node/node_modules/.bin/devcontainer up \ 38 | --docker-path podman \ 39 | --remote-env "SSH_AUTH_SOCK=${SSH_AUTH_SOCK}" \ 40 | --mount "type=bind,source=${SSH_AUTH_SOCK},target=${SSH_AUTH_SOCK}" \ 41 | --dotfiles-repository https://github.com/ai/environment.git \ 42 | --dotfiles-install-command devcontainer/install-dotfiles \ 43 | --workspace-folder $root --config $(devcontainer_config $root) 44 | elif [ "$1" = "--down" ]; then 45 | container_id=$(podman ps --no-trunc --format '{{.ID}} {{.Image}}' | grep "$search_pattern" | awk '{print $1}') 46 | if [ "$container_id" == "" ]; then 47 | echo "Container is not running" 48 | else 49 | podman kill $container_id 50 | fi 51 | elif [ "$1" = "--rebuild" ]; then 52 | image_id=$(podman image ls --format "{{.Repository}}:{{.Tag}}" | grep "$search_pattern" | awk '{print $1}') 53 | if [ "$image_id" != "" ]; then 54 | podman image rm --force $image_id 55 | fi 56 | ~/Dev/environment/bin/dev --up 57 | else 58 | container_id=$(podman ps --no-trunc --format '{{.ID}} {{.Image}}' | grep "$search_pattern" | awk '{print $1}') 59 | subdir="" 60 | if [ "$PWD" != "$root" ]; then 61 | subdir="${PWD#$root/}" 62 | fi 63 | workdir="/workspaces/$(basename $root)/$subdir" 64 | if [ -z "$1" ]; then 65 | podman exec -w $workdir -it $container_id zsh 66 | else 67 | podman exec -w $workdir -it $container_id zsh -ic "$*" 68 | fi 69 | fi 70 | -------------------------------------------------------------------------------- /bin/lock-listener: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \ 4 | while read line; do 5 | if echo "$line" | grep "boolean true" &>/dev/null; then 6 | ~/Dev/environment/bin/susedko switch/turn_off switch.plug_ikea_andrey_screen 7 | elif echo "$line" | grep "boolean false" &>/dev/null; then 8 | ~/Dev/environment/bin/susedko switch/turn_on switch.plug_ikea_andrey_screen 9 | fi 10 | done 11 | -------------------------------------------------------------------------------- /bin/porn: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Run movies from specific category 3 | 4 | if [[ "$1" == "--new" ]]; then 5 | echo "$( 6 | ssh ai@susedko.local find /var/mnt/vault/ai/New/ \ 7 | -type f ! -name '*.part' \ 8 | ! -name '*.png' ! -name '*.jpg' ! -name '*.jpeg' \ 9 | -printf '\\nsftp:\/\/ai@susedko.local:%p' \ 10 | )" > .new.m3u 11 | bash -c "mpv --shuffle --fullscreen --playlist=.new.m3u --load-unsafe-playlists" 12 | rm .new.m3u 13 | else 14 | find /home/ai/Vídeos/Erótica/ -type f -print0 | tr '\0' '\n' | mpv --shuffle --fullscreen --playlist=- 15 | fi 16 | -------------------------------------------------------------------------------- /bin/private: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Private encrypted folder 3 | 4 | STORE=$HOME/.Private 5 | LINK=$HOME/Private 6 | 7 | if [ -e "$LINK" ]; then 8 | # Lock 9 | fusermount -u "$LINK" 10 | rm -R "$LINK" 11 | else 12 | # Unlock 13 | mkdir "$LINK" 14 | encfs "$STORE" "$LINK" --extpass "zenity --password" 15 | nautilus "$LINK" 16 | fi 17 | -------------------------------------------------------------------------------- /bin/release: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | VERSION=$(grep -oP '(?<="version": ")[^"]*' package.json) 4 | 5 | if [ -z "$VERSION" ]; then 6 | echo "Version not found in package.json" 7 | exit 1 8 | fi 9 | 10 | git add . 11 | git commit -m "Release $VERSION version" 12 | git tag -s "$VERSION" -m "$VERSION" 13 | git push 14 | -------------------------------------------------------------------------------- /bin/restore-gnome-extensions: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | backup_dir="$HOME/.local/share/gnome-shell-extensions-settings" 4 | 5 | if [ ! -d "$backup_dir" ]; then 6 | echo "Settings directory $backup_dir not found. Exiting." 7 | exit 1 8 | fi 9 | 10 | extensions=$(gsettings get org.gnome.shell enabled-extensions | tr -d "[],'") 11 | 12 | for settings in "$backup_dir"/*.ini; do 13 | extension=$(basename "$settings" .ini) 14 | base_name=$(echo "$extension" | sed 's/@.*//') 15 | if [[ $extensions == *"$extension"* ]]; then 16 | dconf load "/org/gnome/shell/extensions/$base_name/" < "$settings" 17 | echo "Settings for $extension restored" 18 | else 19 | echo "Extension $extension is not installed or enabled, skipping" 20 | fi 21 | done 22 | -------------------------------------------------------------------------------- /bin/susedko: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if nmcli -t -f TYPE,STATE device | grep -q "^ethernet:connected"; then 4 | home_ip=$(timeout 1 getent hosts home.local | awk '{ print $1 }') 5 | if [[ "$home_ip" == "192.168.50.125" ]]; then 6 | source ~/Dev/environment/secrets.env 7 | curl -s \ 8 | -H "Authorization: Bearer $HA_TOKEN" \ 9 | -H "Content-Type: application/json" \ 10 | -d "{\"entity_id\": \"$2\"}" \ 11 | "https://home.local/api/services/$1" 12 | echo "" 13 | fi 14 | fi 15 | -------------------------------------------------------------------------------- /bin/susedko-listener: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | source ~/Dev/susedko/secrets.env 4 | MQTT_BROKER="192.168.50.125" 5 | 6 | PREVIOUS_PAYLOAD="" 7 | 8 | mosquitto_sub -h "$MQTT_BROKER" -t ai_laptop -u home -P "$HOME_PASSWORD" | while read -r payload 9 | do 10 | if nmcli -t -f TYPE,STATE device | grep -q "^ethernet:connected"; then 11 | if [[ "$payload" != "$PREVIOUS_PAYLOAD" ]]; then 12 | case "$payload" in 13 | "LOCK") 14 | loginctl lock-session 15 | ;; 16 | "WAKE") 17 | YDOTOOL_SOCKET=/run/.ydotool_socket ydotool key 28:1 28:0 18 | ;; 19 | *) 20 | echo "Unknown command: $payload" 21 | ;; 22 | esac 23 | PREVIOUS_PAYLOAD="$payload" 24 | fi 25 | fi 26 | done 27 | -------------------------------------------------------------------------------- /bin/update: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | set -e 4 | 5 | TITLE='\033[0;32m\033[1m' 6 | GRAY='\033[0;90m' 7 | NC='\033[0m' 8 | 9 | echo -e "${TITLE}Actualización del sistema${NC}" 10 | pkexec dnf update --refresh -y 11 | 12 | echo -e "\n${TITLE}Actualizar de las aplicaciones de Flatpak${NC}" 13 | flatpak update -y 14 | 15 | echo -e "\n${TITLE}Actualización de Dev Container${NC}" 16 | cd ~/.local/lib/node 17 | npm update 18 | ~/Dev/environment/bin/update-dockerfile 19 | 20 | echo -e "\n${TITLE}Actualización de la tema de Firefox${GRAY}" 21 | cd ~/.mozilla/firefox/iesxdh6c.default-release/chrome/firefox-gnome-theme 22 | git pull origin master 23 | 24 | echo -e "\n${TITLE}Actualizar de las extensiones de GNOME${GRAY}" 25 | gdbus call --session --dest org.gnome.Shell.Extensions \ 26 | --object-path /org/gnome/Shell/Extensions \ 27 | --method org.gnome.Shell.Extensions.CheckForUpdates 28 | 29 | echo -e "\n${TITLE}Actualización del corrector ortográfico${GRAY}" 30 | ~/Dev/environment/bin/update-languagetool 31 | 32 | echo -e "\n${TITLE}Hecho${NC}" 33 | read 34 | -------------------------------------------------------------------------------- /bin/update-devcontainer-configs: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for dir in ~/Dev/*/; do 4 | target_file="${dir}.devcontainer.json" 5 | if [[ -f "$target_file" ]]; then 6 | if grep -q "localhost/ai-opensource" "$target_file"; then 7 | cp ~/Dev/environment/devcontainer/devcontainer.json "$target_file" 8 | echo "Replaced in $dir" 9 | fi 10 | fi 11 | done 12 | -------------------------------------------------------------------------------- /bin/update-dockerfile: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | DOCKERFILE_PATH="/home/ai/Dev/environment/devcontainer/Dockerfile" 4 | 5 | latest_node=$(curl -s "https://nodejs.org/dist/index.json" | jq -r '.[0].version' | sed 's/v//') 6 | latest_pnpm=$(curl -s "https://api.github.com/repos/pnpm/pnpm/releases/latest" | jq -r '.tag_name' | sed 's/v//') 7 | 8 | current_node=$(grep -oP 'ARG NODE_VERSION=\K.*' "$DOCKERFILE_PATH") 9 | current_pnpm=$(grep -oP 'ARG PNPM_VERSION=\K.*' "$DOCKERFILE_PATH") 10 | 11 | update_needed=false 12 | 13 | RED='\033[0;31m' 14 | GREEN='\033[0;32m' 15 | GRAY='\033[0;90m' 16 | NC='\033[0m' 17 | 18 | if [[ "$current_node" != "$latest_node" ]] && [[ -n "$latest_node" ]]; then 19 | echo -e "Actualizar Node: ${RED}$current_node${NC} to ${GREEN}${latest_node}${NC}" 20 | sed -i "s/ARG NODE_VERSION=$current_node/ARG NODE_VERSION=$latest_node/" "$DOCKERFILE_PATH" 21 | update_needed=true 22 | fi 23 | 24 | if [[ "$current_pnpm" != "$latest_pnpm" ]] && [[ -n "$latest_pnpm" ]]; then 25 | echo -e "Actualizar pnpm: ${RED}$current_pnpm${NC} to ${GREEN}${latest_pnpm}${NC}" 26 | sed -i "s/ARG PNPM_VERSION=$current_pnpm/ARG PNPM_VERSION=$latest_pnpm/" "$DOCKERFILE_PATH" 27 | update_needed=true 28 | fi 29 | 30 | if [ "$update_needed" = true ]; then 31 | echo -e "Limpieza de imágenes antiguas de Dev Container${GRAY}" 32 | podman rmi --all --force 33 | echo -e "${NC}Creación de una nueva imagen de Dev Container${GRAY}" 34 | ~/Dev/environment/bin/build-devcontainer 35 | echo -e "${NC}Dev Container fue actualizado" 36 | else 37 | echo -e "${GRAY}No es necesario actualizar Dev Container${NC}" 38 | fi 39 | -------------------------------------------------------------------------------- /bin/update-extension-lists: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | let { readFile, writeFile } = require('fs/promises') 4 | let { join } = require('path') 5 | let { promisify } = require('util') 6 | let { exec } = require('child_process') 7 | 8 | exec = promisify(exec) 9 | 10 | function gray(str) { 11 | return `\x1b[90m${str}\x1b[39m` 12 | } 13 | 14 | async function updateGnome() { 15 | let listFile = join(__dirname, '..', 'GNOME.md') 16 | let [gnome, docs] = await Promise.all([ 17 | exec(`gnome-extensions list`), 18 | readFile(listFile) 19 | ]) 20 | let meta = await Promise.all( 21 | gnome.stdout 22 | .trim() 23 | .split('\n') 24 | .map(async name => exec(`LANG=en gnome-extensions show ${name}`)) 25 | ) 26 | let details = await Promise.all( 27 | meta 28 | .map(result => { 29 | let uuid = result.stdout.split('\n')[0] 30 | let enabled = result.stdout.includes('State: ACTIVE') 31 | let name = result.stdout.match(/Name: (.*)/)[1] 32 | let hasRepo = result.stdout.match(/URL: (.*)/) 33 | return { uuid, name, enabled, hasRepo } 34 | }) 35 | .filter(({ enabled, hasRepo, name }) => { 36 | if (!hasRepo) { 37 | console.log(gray(`Ignoring ${name}`)) 38 | } 39 | return hasRepo 40 | }) 41 | .map(async ({ name, uuid }) => { 42 | let response = await fetch( 43 | `https://extensions.gnome.org/extension-query/?` + 44 | `sort=relevance&` + 45 | `page=1&` + 46 | `shell_version=all&` + 47 | `search=${encodeURIComponent(name)}` 48 | ) 49 | if (!response.ok) { 50 | process.stderr.write(`Response ${response.status} for ${name}`) 51 | process.stderr.write(gray(`\n${await response.text()}\n`)) 52 | response = await fetch( 53 | `https://extensions.gnome.org/extension-query/?` + 54 | `sort=relevance&` + 55 | `page=1&` + 56 | `shell_version=all&` + 57 | `search=${encodeURIComponent(name)}`) 58 | if (!response.ok) process.exit(1) 59 | } 60 | let json = await response.json() 61 | let extension = json.extensions.find(i => i.uuid === uuid) 62 | if (!extension) { 63 | throw new Error(`Extension not found: ${name} (${uuid})`) 64 | } 65 | return { 66 | name: extension.name, 67 | url: `https://extensions.gnome.org${extension.link}` 68 | } 69 | }) 70 | ) 71 | let extensions = details 72 | .map(({ name, url }) => ({ url, name: name.replace(/\[.*\]\s*/, '') })) 73 | .sort((a, b) => a.name.localeCompare(b.name)) 74 | .map(({ name, url }) => `* [${name}](${url})`) 75 | .join('\n') 76 | let cleaned = docs 77 | .toString() 78 | .split('\n') 79 | .filter(line => line && !line.startsWith('*')) 80 | .join('\n') 81 | await writeFile(listFile, cleaned + '\n\n' + extensions + '\n') 82 | } 83 | 84 | updateGnome() 85 | -------------------------------------------------------------------------------- /bin/update-languagetool: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | set -e 4 | 5 | TITLE='\033[0m\033[1m' 6 | GRAY='\033[0;90m' 7 | 8 | ETAG_FILE=~/.cache/languagetool/etag 9 | DOWNLOAD_URL=https://internal1.languagetool.org/snapshots/LanguageTool-latest-snapshot.zip 10 | 11 | current_etag=$(curl -s -I -L "$DOWNLOAD_URL" | grep -i '^ETag:' | awk '{print $2}' | sed -e 's/^"//' -e 's/"\s*$//') 12 | echo -e "${TITLE}ETag del servidor: $current_etag${GRAY}" 13 | 14 | last_etag="" 15 | if [ -f "$ETAG_FILE" ]; then 16 | last_etag=$(cat "$ETAG_FILE") 17 | echo -e "${TITLE}Último ETag conocido: $last_etag${GRAY}" 18 | else 19 | echo -e "${TITLE}No se encontró ETag anterior${GRAY}" 20 | fi 21 | 22 | if [ -z "$last_etag" ] || [ "$current_etag" != "$last_etag" ]; then 23 | echo -e "${TITLE}Descargando la última versión${GRAY}" 24 | wget "$DOWNLOAD_URL" 25 | 26 | echo -e "${TITLE}Extrayendo archivo${GRAY}" 27 | unzip -q LanguageTool-latest-snapshot.zip 28 | rm LanguageTool-latest-snapshot.zip 29 | 30 | echo -e "${TITLE}Deteniendo y eliminando instalación antigua${GRAY}" 31 | systemctl stop --user languagetool.service || true 32 | rm -Rf ~/.local/lib/languagetool 33 | 34 | echo -e "${TITLE}Instalando nueva versión${GRAY}" 35 | mkdir -p ~/.local/lib/languagetool 36 | mv LanguageTool-*/* ~/.local/lib/languagetool 37 | rm -R LanguageTool-* 38 | 39 | echo -e "${TITLE}Iniciando servicio LanguageTool${GRAY}" 40 | systemctl start --user languagetool.service 41 | 42 | echo -e "${TITLE}Guardando nuevo ETag${GRAY}" # Kept GRAY suffix in case it was intended 43 | mkdir -p "$(dirname "$ETAG_FILE")" 44 | echo "$current_etag" > "$ETAG_FILE" 45 | else 46 | echo -e "${TITLE}No se necesita descarga${GRAY}" 47 | fi 48 | -------------------------------------------------------------------------------- /bin/zed-isolate: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | exec > "/var/run/user/1000/zed-isolate.log" 2>&1 5 | 6 | if [ "$1" != "" ]; then 7 | cd "$1" 8 | fi 9 | 10 | if [[ ! -f package.json ]]; then 11 | echo "No npm project to use Dev Container" 12 | flatpak run dev.zed.Zed ./ 13 | exit 0 14 | fi 15 | 16 | if [[ ! -f .devcontainer.json && ! -d .devcontainer ]]; then 17 | echo "Create Dev Container" 18 | cp ~/Dev/environment/devcontainer/devcontainer.json .devcontainer.json 19 | if [ -d .git ]; then 20 | echo '.devcontainer.json' >> .git/info/exclude 21 | fi 22 | fi 23 | 24 | if [ -f .devcontainer/devcontainer.json ]; then 25 | port=$(grep -oP '(?<=")\d+(?=:22")' .devcontainer/devcontainer.json) 26 | else 27 | while true; do 28 | port=$(shuf -i 1024-9999 -n 1) 29 | if ! ss -tuln | grep -q ":${port}\s"; then 30 | break 31 | fi 32 | done 33 | sed -i "s|\"[0-9]\+:22\"|\"$port:22\"|g" .devcontainer.json 34 | fi 35 | 36 | echo $port 37 | 38 | ~/Dev/environment/bin/dev --up | \ 39 | zenity --progress --text="Starting" --title="Dev Container" --pulsate --auto-close --no-cancel 40 | 41 | project=$(basename $(pwd)) 42 | search_pattern="vsc-$project-[0-9a-f]\+-uid" 43 | container_id=$(podman ps --no-trunc --format '{{.ID}} {{.Image}}' | grep "$search_pattern" | awk '{print $1}') 44 | 45 | if [ "$container_id" == "" ]; then 46 | zenity --error --title="Dev Container Error" \ 47 | --text="Running container was not found" 48 | exit 1 49 | fi 50 | 51 | username="" 52 | if [ -f ".devcontainer/Dockerfile" ]; then 53 | username=$( 54 | awk -v IGNORECASE=1 '/^\s*USER\s+/{u=$2} END{print u}' ".devcontainer/Dockerfile" 55 | ) 56 | fi 57 | username="${username:-ai}" 58 | 59 | setsid podman exec -d --user root $container_id /usr/sbin/sshd -D 60 | 61 | flatpak run dev.zed.Zed ssh://$username@localhost:$port/workspaces/$project 62 | 63 | sleep 5 64 | while netstat -tnp 2>/dev/null | grep ":$port" | grep -q 'ESTABLISHED'; do 65 | sleep 5 66 | done 67 | 68 | ~/Dev/environment/bin/dev --down 69 | -------------------------------------------------------------------------------- /bin/zoom: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | source ~/Dev/environment/secrets.env 4 | 5 | call_scene() { 6 | curl -s -S -f \ 7 | -H "Authorization: Bearer $HA_TOKEN" \ 8 | -H "Content-Type: application/json" \ 9 | -d "{\"entity_id\": \"$1\"}" \ 10 | "https://home.local/api/services/scene/turn_on" || true 11 | } 12 | 13 | call_scene "scene.andrey_calling" 14 | 15 | /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=zoom --file-forwarding us.zoom.Zoom "$@" 16 | 17 | call_scene "scene.andrey_working_night" 18 | -------------------------------------------------------------------------------- /devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM registry.fedoraproject.org/fedora:42 2 | 3 | ARG NODE_VERSION=24.1.0 4 | ARG PNPM_VERSION=10.11.1 5 | 6 | RUN dnf install -yq zsh micro git tig iputils make awk psmisc procps-ng \ 7 | openssh-server \ 8 | && dnf clean all \ 9 | && rm -rf /var/cache/dnf \ 10 | && mkdir -p /var/run/sshd \ 11 | && ssh-keygen -A 12 | 13 | ADD https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz /node.tar.xz 14 | RUN tar -xz -f /node.tar.xz -C /usr/local --remove-files --strip-components=1 \ 15 | --exclude='*.md' --exclude='LICENSE' \ 16 | --exclude='share' --exclude='bin/corepack' \ 17 | && rm /node.tar.xz 18 | ADD https://github.com/pnpm/pnpm/releases/download/v$PNPM_VERSION/pnpm-linux-x64 /usr/local/bin/pnpm 19 | RUN chmod a+rx /usr/local/bin/pnpm 20 | ADD https://github.com/suzuki-shunsuke/pinact/releases/download/v3.0.1/pinact_linux_amd64.tar.gz /pinact.tar.gz 21 | RUN tar -xz -f /pinact.tar.gz -C /usr/local/bin --remove-files \ 22 | --exclude='LICENSE' --exclude='*.md' \ 23 | && rm /pinact.tar.gz 24 | 25 | RUN npm install -g yarn && npm install -g bun 26 | 27 | RUN useradd -s /bin/zsh ai 28 | # On first run comment all commands below, run zsh and call: 29 | # chown ai:ai /home/ai/.local/share/pnpm/store 30 | USER ai 31 | 32 | RUN mkdir -p /home/ai/.local/share/pnpm \ 33 | && pnpm config set store-dir /home/ai/.local/share/pnpm/store 34 | 35 | VOLUME /home/ai/.local/share/pnpm/store 36 | VOLUME /home/ai/.shell-history 37 | -------------------------------------------------------------------------------- /devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "image": "localhost/ai-opensource:latest", 3 | "mounts": [ 4 | { 5 | "source": "pnpm-store", 6 | "target": "/home/ai/.local/share/pnpm/store", 7 | "type": "volume" 8 | }, 9 | { 10 | "source": "shell-history", 11 | "target": "/home/ai/.local/share/history/", 12 | "type": "volume" 13 | } 14 | ], 15 | "runArgs": ["--ulimit=host", "-p", "2222:22"] 16 | } 17 | -------------------------------------------------------------------------------- /devcontainer/install-dotfiles: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | mkdir -p ~/.config/micro 4 | mkdir -p ~/.config/bat 5 | mkdir -p ~/.config/git 6 | 7 | cp -f ~/dotfiles/zshrc ~/.zshrc 8 | cp -f ~/dotfiles/gitconfig ~/.gitconfig 9 | cp -f ~/dotfiles/ripgreprc ~/.ripgreprc 10 | cp -f ~/dotfiles/micro.json ~/.config/micro/settings.json 11 | cp -f ~/dotfiles/batconfig ~/.config/bat/config 12 | cp -f ~/dotfiles/gitignore ~/.config/git/ignore 13 | cp -f ~/dotfiles/starship.toml ~/.config/starship.toml 14 | sed -i '/^\s*\$username\\/d;/^\s*\$hostname\\/d' ~/.config/starship.toml 15 | 16 | mkdir -p ~/.ssh 17 | chmod 700 ~/.ssh 18 | echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDwZrgt8W9uGndgD2aoMOjN0lhvFYsYzfietr5gu5lUV andrey@sitnik.ru" > ~/.ssh/authorized_keys 19 | chmod 644 ~/.ssh/authorized_keys 20 | 21 | if command -v micro >/dev/null 2>&1; then 22 | micro -plugin install editorconfig 23 | fi 24 | 25 | mkdir -p ~/.local/share/history/ 26 | touch ~/.local/share/history/histfile 27 | mkdir -p ~/.local/bin 28 | 29 | curl -sL https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz | tar xz 30 | chmod +x eza 31 | mv eza ~/.local/bin 32 | 33 | curl -sL https://github.com/Wilfred/difftastic/releases/download/0.63.0/difft-x86_64-unknown-linux-gnu.tar.gz | tar xz 34 | chmod +x difft 35 | mv difft ~/.local/bin 36 | 37 | curl -sL https://github.com/sharkdp/bat/releases/download/v0.25.0/bat-v0.25.0-x86_64-unknown-linux-gnu.tar.gz | tar xz --strip-components=1 bat-v0.25.0-x86_64-unknown-linux-gnu/bat 38 | chmod +x bat 39 | mv bat ~/.local/bin 40 | 41 | curl -sL https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-unknown-linux-musl.tar.gz | tar xz --strip-components=1 ripgrep-14.1.1-x86_64-unknown-linux-musl/rg 42 | chmod +x rg 43 | mv rg ~/.local/bin 44 | 45 | curl -sL https://github.com/atuinsh/atuin/releases/download/v18.6.1/atuin-x86_64-unknown-linux-gnu.tar.gz | tar xz --strip-components=1 atuin-x86_64-unknown-linux-gnu/atuin 46 | chmod +x atuin 47 | mv atuin ~/.local/bin 48 | 49 | curl -sS https://starship.rs/install.sh > starship.sh 50 | chmod a+x starship.sh 51 | ./starship.sh -y -b ~/.local/bin 52 | rm starship.sh 53 | 54 | mkdir -p ~/.local/lib/zsh 55 | if command -v git >/dev/null 2>&1 && command -v zsh >/dev/null 2>&1; then 56 | git clone -q https://github.com/zsh-users/zsh-syntax-highlighting \ 57 | ~/.local/lib/zsh/zsh-syntax-highlighting 58 | git clone https://github.com/zsh-users/zsh-autosuggestions \ 59 | ~/.local/lib/zsh/zsh-autosuggestions 60 | git clone https://github.com/jimhester/per-directory-history \ 61 | ~/.local/lib/zsh/per-directory-history 62 | mkdir -p ~/.local/lib/zsh/pnpm-shell-completion 63 | pnpm_url=$(curl -s \ 64 | https://api.github.com/repos/g-plane/pnpm-shell-completion/releases/latest \ 65 | | grep "browser_download_url.*pnpm-shell-completion_x86_64-unknown-linux-gnu.tar.gz" \ 66 | | cut -d '"' -f 4) 67 | curl -sSL $pnpm_url > ~/pnpm-completion.tar.gz 68 | tar -xzf ~/pnpm-completion.tar.gz \ 69 | -C ~/.local/lib/zsh/pnpm-shell-completion \ 70 | pnpm-shell-completion pnpm-shell-completion.plugin.zsh 71 | chmod a+x ~/.local/lib/zsh/pnpm-shell-completion/pnpm-shell-completion 72 | rm ~/pnpm-completion.tar.gz 73 | fi 74 | -------------------------------------------------------------------------------- /gitconfig: -------------------------------------------------------------------------------- 1 | [user] 2 | name = Andrey Sitnik 3 | email = andrey@sitnik.ru 4 | signingKey = key::ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDwZrgt8W9uGndgD2aoMOjN0lhvFYsYzfietr5gu5lUV andrey@sitnik.ru 5 | [alias] 6 | current-branch = "!git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \\(.*\\)/\\1/'" 7 | a = "!git add . && git s" 8 | ch = "!echo 'Stop using git checkout' && false" 9 | c = commit -S -m 10 | s = status --short --branch 11 | d = diff 12 | l = "!git pull origin $(git current-branch) --rebase" 13 | h = "!git push origin $(git current-branch)" 14 | lh = "!git l && git h" 15 | r = "!git rm $(git ls-files --deleted) && git status" 16 | hf = push --force-with-lease 17 | sw = switch 18 | [color] 19 | diff = auto 20 | status = auto 21 | branch = auto 22 | [branch] 23 | autosetuprebase = always 24 | [core] 25 | autocrlf = input 26 | editor = micro 27 | hooksPath = /home/ai/Dev/environment/hooks-trap 28 | [init] 29 | defaultBranch = main 30 | [gpg] 31 | format = ssh 32 | [commit] 33 | gpgsign = true 34 | [push] 35 | default = current 36 | followtags = true 37 | [rerere] 38 | enabled = true 39 | [diff] 40 | external = difft 41 | algorithm = histogram 42 | colorMoved = true 43 | indentHeuristic = true 44 | -------------------------------------------------------------------------------- /gitignore: -------------------------------------------------------------------------------- 1 | .pnpm-*.log 2 | .npm-release/ 3 | -------------------------------------------------------------------------------- /hooks-trap/applypatch-msg: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/applypatch-msg" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/applypatch-msg 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/commit-msg" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/commit-msg 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/post-applypatch: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/post-applypatch" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/post-applypatch 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/post-checkout: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/post-checkout" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/post-checkout 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/post-commit: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/post-commit" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/post-commit 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/post-merge: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/post-merge" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/post-merge 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/post-rewrite: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/post-rewrite" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/post-rewrite 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/pre-applypatch: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/pre-applypatch" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/pre-applypatch 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/pre-auto-gc: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/pre-auto-gc" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/pre-auto-gc 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/pre-commit" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/pre-commit 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/pre-merge-commit: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/pre-merge-commit" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/pre-merge-commit 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/pre-push: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/pre-push" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/pre-push 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/pre-rebase: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/pre-rebase" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/pre-rebase 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /hooks-trap/prepare-commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | project_hooks=$(git config get --local core.hooksPath) 4 | if [ -n "$project_hooks" ] && [ -d "$project_hooks" ]; then 5 | if [ -x "$project_hooks/prepare-commit-msg" ]; then 6 | /home/ai/Dev/environment/bin/dev $project_hooks/prepare-commit-msg 7 | fi 8 | fi 9 | -------------------------------------------------------------------------------- /icons/backup.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=Copia de seguridad 4 | Comment=Backup 5 | Icon=/home/ai/.local/share/applications/backup.svg 6 | Exec=flatpak run app.devsuite.Ptyxis -- /home/ai/Dev/environment/bin/backup 7 | -------------------------------------------------------------------------------- /icons/backup.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/porn.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=Erótica 4 | Comment=Play porn movies 5 | Icon=/home/ai/.local/share/applications/video.svg 6 | Exec=/home/ai/Dev/environment/bin/porn 7 | Actions=New; 8 | 9 | [Desktop Action New] 10 | Name=Nuevos 11 | Exec=/home/ai/Dev/environment/bin/porn --new 12 | -------------------------------------------------------------------------------- /icons/private.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=Carpeta privada 4 | Comment=Decrypt safe storage 5 | Icon=/home/ai/.local/share/applications/private.svg 6 | Exec=/home/ai/Dev/environment/bin/private 7 | -------------------------------------------------------------------------------- /icons/private.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/update.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=Actualización 4 | Comment=Update RPM, Flatpak, and Mozilla Theme 5 | Icon=org.fedoraproject.AnacondaInstaller 6 | Exec=flatpak run app.devsuite.Ptyxis -- /home/ai/Dev/environment/bin/update 7 | -------------------------------------------------------------------------------- /icons/video.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /icons/zed-isolate.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=Zed Dev Container 4 | Icon=dev.zed.Zed 5 | Exec=/home/ai/Dev/environment/bin/zed-isolate %U 6 | MimeType=inode/directory; 7 | Categories=Utility;TextEditor;Development;IDE; 8 | -------------------------------------------------------------------------------- /micro.json: -------------------------------------------------------------------------------- 1 | { 2 | "colorscheme": "simple", 3 | "mkparents": true 4 | } 5 | -------------------------------------------------------------------------------- /mimeapps.list: -------------------------------------------------------------------------------- 1 | [Added Associations] 2 | x-scheme-handler/sms=org.gnome.Shell.Extensions.GSConnect.desktop; 3 | x-scheme-handler/tel=org.gnome.Shell.Extensions.GSConnect.desktop; 4 | image/jpeg=org.gimp.GIMP.desktop;org.gnome.Loupe.desktop; 5 | image/avif=org.gnome.eog.desktop;org.gimp.GIMP.desktop;org.gnome.Loupe.desktop; 6 | image/webp=org.gnome.eog.desktop; 7 | image/svg+xml=org.gnome.TextEditor.desktop; 8 | application/x-bittorrent=io.github.TransmissionRemoteGtk.desktop; 9 | image/png=org.gimp.GIMP.desktop;org.gnome.Loupe.desktop; 10 | image/heif=org.gimp.GIMP.desktop;org.gnome.Loupe.desktop; 11 | text/vnd.trolltech.linguist=mpv.desktop;dev.zed.Zed.desktop; 12 | font/ttf=org.gnome.font-viewer.desktop; 13 | x-scheme-handler/http=org.mozilla.firefox.desktop; 14 | text/html=org.mozilla.firefox.desktop; 15 | application/xhtml+xml=org.mozilla.firefox.desktop; 16 | x-scheme-handler/https=org.mozilla.firefox.desktop; 17 | audio/aac=mpv.desktop; 18 | audio/x-aac=mpv.desktop; 19 | audio/vnd.dolby.heaac.1=mpv.desktop; 20 | audio/vnd.dolby.heaac.2=mpv.desktop; 21 | audio/aiff=mpv.desktop; 22 | audio/x-aiff=mpv.desktop; 23 | audio/m4a=mpv.desktop; 24 | audio/x-m4a=mpv.desktop; 25 | audio/mp1=mpv.desktop; 26 | audio/x-mp1=mpv.desktop; 27 | audio/mp2=mpv.desktop; 28 | audio/x-mp2=mpv.desktop; 29 | audio/mp3=mpv.desktop; 30 | audio/x-mp3=mpv.desktop; 31 | audio/mpeg=mpv.desktop; 32 | audio/mpeg2=mpv.desktop; 33 | audio/mpeg3=mpv.desktop; 34 | audio/mpegurl=mpv.desktop; 35 | audio/x-mpegurl=mpv.desktop; 36 | audio/mpg=mpv.desktop; 37 | audio/x-mpg=mpv.desktop; 38 | audio/rn-mpeg=mpv.desktop; 39 | audio/musepack=mpv.desktop; 40 | audio/x-musepack=mpv.desktop; 41 | audio/ogg=mpv.desktop; 42 | audio/scpls=mpv.desktop; 43 | audio/x-scpls=mpv.desktop; 44 | audio/vnd.rn-realaudio=mpv.desktop; 45 | audio/wav=mpv.desktop; 46 | audio/x-pn-wav=mpv.desktop; 47 | audio/x-pn-windows-pcm=mpv.desktop; 48 | audio/x-realaudio=mpv.desktop; 49 | audio/x-pn-realaudio=mpv.desktop;org.gnome.Totem.desktop; 50 | audio/x-ms-wma=mpv.desktop; 51 | audio/x-pls=mpv.desktop; 52 | audio/x-wav=mpv.desktop; 53 | audio/x-ms-asf=mpv.desktop; 54 | audio/x-matroska=mpv.desktop; 55 | audio/webm=mpv.desktop; 56 | audio/vorbis=mpv.desktop; 57 | audio/x-vorbis=mpv.desktop; 58 | audio/x-shorten=mpv.desktop; 59 | audio/x-ape=mpv.desktop; 60 | audio/x-wavpack=mpv.desktop; 61 | audio/x-tta=mpv.desktop; 62 | audio/AMR=mpv.desktop; 63 | audio/ac3=mpv.desktop; 64 | audio/eac3=mpv.desktop; 65 | audio/amr-wb=mpv.desktop; 66 | audio/flac=mpv.desktop; 67 | audio/mp4=mpv.desktop; 68 | audio/x-pn-au=mpv.desktop; 69 | audio/3gpp=mpv.desktop; 70 | audio/3gpp2=mpv.desktop; 71 | audio/dv=mpv.desktop; 72 | audio/opus=mpv.desktop; 73 | audio/vnd.dts=mpv.desktop; 74 | audio/vnd.dts.hd=mpv.desktop; 75 | audio/x-adpcm=mpv.desktop; 76 | audio/m3u=mpv.desktop; 77 | audio/x-vorbis+ogg=org.gnome.Totem.desktop; 78 | video/x-mpeg2=mpv.desktop; 79 | video/x-mpeg3=mpv.desktop; 80 | video/mp4v-es=mpv.desktop; 81 | video/x-m4v=mpv.desktop; 82 | video/divx=mpv.desktop; 83 | video/vnd.divx=mpv.desktop; 84 | video/msvideo=mpv.desktop; 85 | video/ogg=mpv.desktop; 86 | video/vnd.rn-realvideo=mpv.desktop; 87 | video/x-ms-afs=mpv.desktop; 88 | video/x-ms-asf=mpv.desktop; 89 | video/x-ms-wmx=mpv.desktop; 90 | video/x-ms-wvxvideo=mpv.desktop; 91 | video/x-avi=mpv.desktop; 92 | video/avi=mpv.desktop; 93 | video/x-flic=mpv.desktop; 94 | video/fli=mpv.desktop; 95 | video/x-flc=mpv.desktop; 96 | video/flv=mpv.desktop; 97 | video/x-theora=mpv.desktop; 98 | video/x-theora+ogg=mpv.desktop; 99 | video/mkv=mpv.desktop; 100 | video/x-ogm=mpv.desktop; 101 | video/vnd.mpegurl=mpv.desktop; 102 | video/3gp=mpv.desktop; 103 | video/3gpp2=mpv.desktop; 104 | video/dv=mpv.desktop; 105 | application/xml=org.gnome.TextEditor.desktop; 106 | application/zip=org.gnome.Nautilus.desktop; 107 | application/pdf=org.gnome.Papers.desktop; 108 | 109 | [Default Applications] 110 | video/x-matroska=mpv.desktop 111 | video/mp4=mpv.desktop 112 | video/x-ms-wmv=mpv.desktop 113 | video/x-msvideo=mpv.desktop 114 | video/x-flv=mpv.desktop 115 | video/mpeg=mpv.desktop 116 | video/mp2t=mpv.desktop 117 | video/webm=mpv.desktop 118 | video/quicktime=mpv.desktop 119 | application/x-bittorrent=io.github.TransmissionRemoteGtk.desktop 120 | text/vnd.trolltech.linguist=dev.zed.Zed.desktop 121 | image/jpeg=org.gnome.Loupe.desktop 122 | image/avif=org.gnome.Loupe.desktop 123 | image/png=org.gnome.Loupe.desktop 124 | image/heif=org.gnome.Loupe.desktop 125 | font/ttf=org.gnome.font-viewer.desktop 126 | video/3gpp=mpv.desktop 127 | x-scheme-handler/http=org.mozilla.firefox.desktop 128 | text/html=org.mozilla.firefox.desktop 129 | application/xhtml+xml=org.mozilla.firefox.desktop 130 | x-scheme-handler/https=org.mozilla.firefox.desktop 131 | audio/x-vorbis+ogg=org.gnome.Totem.desktop 132 | audio/aac=mpv.desktop 133 | audio/x-aac=mpv.desktop 134 | audio/vnd.dolby.heaac.1=mpv.desktop 135 | audio/vnd.dolby.heaac.2=mpv.desktop 136 | audio/aiff=mpv.desktop 137 | audio/x-aiff=mpv.desktop 138 | audio/m4a=mpv.desktop 139 | audio/x-m4a=mpv.desktop 140 | audio/mp1=mpv.desktop 141 | audio/x-mp1=mpv.desktop 142 | audio/mp2=mpv.desktop 143 | audio/x-mp2=mpv.desktop 144 | audio/mp3=mpv.desktop 145 | audio/x-mp3=mpv.desktop 146 | audio/mpeg=mpv.desktop 147 | audio/mpeg2=mpv.desktop 148 | audio/mpeg3=mpv.desktop 149 | audio/mpegurl=mpv.desktop 150 | audio/x-mpegurl=mpv.desktop 151 | audio/mpg=mpv.desktop 152 | audio/x-mpg=mpv.desktop 153 | audio/rn-mpeg=mpv.desktop 154 | audio/musepack=mpv.desktop 155 | audio/x-musepack=mpv.desktop 156 | audio/ogg=mpv.desktop 157 | audio/scpls=mpv.desktop 158 | audio/x-scpls=mpv.desktop 159 | audio/vnd.rn-realaudio=mpv.desktop 160 | audio/wav=mpv.desktop 161 | audio/x-pn-wav=mpv.desktop 162 | audio/x-pn-windows-pcm=mpv.desktop 163 | audio/x-realaudio=mpv.desktop 164 | audio/x-pn-realaudio=org.gnome.Totem.desktop 165 | audio/x-ms-wma=mpv.desktop 166 | audio/x-pls=mpv.desktop 167 | audio/x-wav=mpv.desktop 168 | audio/x-ms-asf=mpv.desktop 169 | audio/x-matroska=mpv.desktop 170 | audio/webm=mpv.desktop 171 | audio/vorbis=mpv.desktop 172 | audio/x-vorbis=mpv.desktop 173 | audio/x-shorten=mpv.desktop 174 | audio/x-ape=mpv.desktop 175 | audio/x-wavpack=mpv.desktop 176 | audio/x-tta=mpv.desktop 177 | audio/AMR=mpv.desktop 178 | audio/ac3=mpv.desktop 179 | audio/eac3=mpv.desktop 180 | audio/amr-wb=mpv.desktop 181 | audio/flac=mpv.desktop 182 | audio/mp4=mpv.desktop 183 | audio/x-pn-au=mpv.desktop 184 | audio/3gpp=mpv.desktop 185 | audio/3gpp2=mpv.desktop 186 | audio/dv=mpv.desktop 187 | audio/opus=mpv.desktop 188 | audio/vnd.dts=mpv.desktop 189 | audio/vnd.dts.hd=mpv.desktop 190 | audio/x-adpcm=mpv.desktop 191 | audio/m3u=mpv.desktop 192 | video/x-ogm+ogg=mpv.desktop 193 | video/x-mpeg2=mpv.desktop 194 | video/x-mpeg3=mpv.desktop 195 | video/mp4v-es=mpv.desktop 196 | video/x-m4v=mpv.desktop 197 | video/divx=mpv.desktop 198 | video/vnd.divx=mpv.desktop 199 | video/msvideo=mpv.desktop 200 | video/ogg=mpv.desktop 201 | video/vnd.rn-realvideo=mpv.desktop 202 | video/x-ms-afs=mpv.desktop 203 | video/x-ms-asf=mpv.desktop 204 | video/x-ms-wmx=mpv.desktop 205 | video/x-ms-wvxvideo=mpv.desktop 206 | video/x-avi=mpv.desktop 207 | video/avi=mpv.desktop 208 | video/x-flic=mpv.desktop 209 | video/fli=mpv.desktop 210 | video/x-flc=mpv.desktop 211 | video/flv=mpv.desktop 212 | video/x-theora=mpv.desktop 213 | video/x-theora+ogg=mpv.desktop 214 | video/mkv=mpv.desktop 215 | video/x-ogm=mpv.desktop 216 | video/vnd.mpegurl=mpv.desktop 217 | video/3gp=mpv.desktop 218 | video/3gpp2=mpv.desktop 219 | video/dv=mpv.desktop 220 | application/xml=org.gnome.TextEditor.desktop 221 | application/pdf=org.gnome.Papers.desktop 222 | -------------------------------------------------------------------------------- /mpv-input.conf: -------------------------------------------------------------------------------- 1 | й quit 2 | а cycle fullscreen 3 | MOUSE_BTN3 ignore 4 | MOUSE_BTN4 ignore 5 | -------------------------------------------------------------------------------- /mpv.conf: -------------------------------------------------------------------------------- 1 | slang=ru 2 | alang=jpn,ja,eng,en 3 | -------------------------------------------------------------------------------- /ripgreprc: -------------------------------------------------------------------------------- 1 | --smart-case 2 | --glob=!.git/ 3 | --glob=!.yarn/ 4 | --hidden 5 | --no-heading 6 | -------------------------------------------------------------------------------- /sshconfig: -------------------------------------------------------------------------------- 1 | Host * 2 | ForwardAgent no 3 | 4 | Host github.com 5 | HostName github.com 6 | User git 7 | IdentityFile ~/.ssh/id_ed25519 8 | 9 | Host localhost 10 | StrictHostKeyChecking no 11 | UserKnownHostsFile=/dev/null 12 | 13 | GSSAPIAuthentication no 14 | TCPKeepAlive yes 15 | ServerAliveInterval 3 16 | -------------------------------------------------------------------------------- /starship.toml: -------------------------------------------------------------------------------- 1 | format = """ 2 | $username\ 3 | $hostname\ 4 | $container\ 5 | $shlvl\ 6 | $directory\ 7 | $git_branch\ 8 | $git_commit\ 9 | $git_state\ 10 | $git_metrics\ 11 | $git_status\ 12 | $sudo\ 13 | $cmd_duration\ 14 | $line_break\ 15 | $jobs\ 16 | $status\ 17 | $shell\ 18 | $character""" 19 | 20 | [container] 21 | format = '[$symbol]($style) ' 22 | -------------------------------------------------------------------------------- /zed-keys.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "bindings": { 4 | "ctrl-q": null 5 | } 6 | }, 7 | { 8 | "context": "Terminal", 9 | "bindings": { 10 | "ctrl-s": ["terminal::SendKeystroke", "ctrl-s"] 11 | } 12 | }, 13 | { 14 | "context": "Editor", 15 | "bindings": { 16 | "ctrl-cyrillic_es": "editor::Copy", 17 | "ctrl-cyrillic_em": "editor::Paste", 18 | "ctrl-cyrillic_che": "editor::Cut", 19 | "ctrl-cyrillic_ef": "editor::SelectAll", 20 | "ctrl-cyrillic_ya": "editor::Undo", 21 | "ctrl-cyrillic_en": "editor::Redo", 22 | "ctrl-cyrillic_a": "buffer_search::Deploy" 23 | } 24 | } 25 | ] 26 | -------------------------------------------------------------------------------- /zed.json: -------------------------------------------------------------------------------- 1 | { 2 | "agent": { 3 | "always_allow_tool_actions": true, 4 | "model_parameters": [], 5 | "default_model": { 6 | "provider": "zed.dev", 7 | "model": "claude-sonnet-4" 8 | }, 9 | "version": "2" 10 | }, 11 | "edit_predictions": { 12 | "mode": "subtle", 13 | "copilot": { 14 | "proxy": null, 15 | "proxy_no_verify": null 16 | }, 17 | "enabled_in_text_threads": false 18 | }, 19 | "features": { 20 | "edit_prediction_provider": "zed" 21 | }, 22 | "icon_theme": "Material Icon Theme", 23 | "terminal": { 24 | "dock": "right" 25 | }, 26 | "soft_wrap": "preferred_line_length", 27 | "preferred_line_length": 80, 28 | "wrap_guides": [80], 29 | "ui_font_size": 16, 30 | "buffer_font_size": 16, 31 | "buffer_font_family": "JetBrains Mono", 32 | "theme": { 33 | "mode": "system", 34 | "light": "Adwaita Pastel Light", 35 | "dark": "Adwaita Pastel Dark" 36 | }, 37 | "git": { 38 | "inline_blame": { 39 | "enabled": false 40 | } 41 | }, 42 | "languages": { 43 | "JavaScript": { 44 | "code_actions_on_format": { 45 | "source.fixAll.eslint": true 46 | } 47 | }, 48 | "TypeScript": { 49 | "code_actions_on_format": { 50 | "source.fixAll.eslint": true 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /zshrc: -------------------------------------------------------------------------------- 1 | # History 2 | HISTSIZE=10000 3 | SAVEHIST=10000 4 | HISTFILE=~/.local/share/history/histfile 5 | setopt appendhistory 6 | setopt inc_append_history 7 | setopt hist_ignore_all_dups 8 | 9 | # Colors 10 | autoload -U colors && colors 11 | 12 | # Key bindings 13 | bindkey -e 14 | bindkey ';5D' backward-word # ctrl+left 15 | bindkey ';5C' forward-word # ctrl+right 16 | 17 | # Completion 18 | zstyle :compinstall filename "$HOME/.zshrc" 19 | autoload -Uz compinit 20 | compinit 21 | 22 | # Zsh plugins 23 | if [[ -d ~/.local/lib/zsh/zsh-syntax-highlighting/ ]]; then 24 | source ~/.local/lib/zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 25 | fi 26 | if [[ -d ~/.local/lib/zsh/zsh-autosuggestions/ ]]; then 27 | source ~/.local/lib/zsh/zsh-autosuggestions/zsh-autosuggestions.zsh 28 | fi 29 | if [[ -d ~/.local/lib/zsh/zsh-autosuggestions/ ]]; then 30 | source ~/.local/lib/zsh/per-directory-history/per-directory-history.zsh 31 | fi 32 | if [[ -d ~/.local/lib/zsh/pnpm-shell-completion/ ]]; then 33 | source ~/.local/lib/zsh/pnpm-shell-completion/pnpm-shell-completion.plugin.zsh 34 | fi 35 | 36 | # Local binaries 37 | export PATH="$HOME/.local/bin/:$PATH" 38 | 39 | # Prompt 40 | if command -v starship > /dev/null 2>&1; then 41 | eval "$(starship init zsh)" 42 | elif [ -f ~/.local/bin/starship ]; then 43 | eval "$(~/.local/bin/starship init zsh)" 44 | fi 45 | 46 | # History 47 | if [ -f ~/.local/bin/atuin ]; then 48 | eval "$(~/.local/bin/atuin init zsh --disable-up-arrow)" 49 | fi 50 | 51 | # Rip Grep 52 | export RIPGREP_CONFIG_PATH=~/.ripgreprc 53 | 54 | # Console editor 55 | export EDITOR=micro 56 | 57 | # Fix Bat in light console 58 | export BAT_THEME=ansi 59 | 60 | # Aliases 61 | alias g='git' 62 | alias ..='cd ..' 63 | alias l='eza --all' 64 | alias ll='eza --long --all --git' 65 | 66 | if command -v bat > /dev/null 2>&1; then 67 | alias cat='bat' 68 | fi 69 | if command -v eza > /dev/null 2>&1; then 70 | alias ls='eza' 71 | fi 72 | 73 | alias r='dev node --disable-warning=ExperimentalWarning --run' 74 | alias t='dev node --disable-warning=ExperimentalWarning --run test' 75 | alias n='pnpm ' 76 | alias pui='pnpm update --interactive --latest -r --include-workspace-root' 77 | alias pu='pnpm update -r --include-workspace-root' 78 | alias pui1='pnpm update --interactive --latest' 79 | alias pu1='pnpm update' 80 | 81 | export NODE_COMPILE_CACHE=~/.cache/node 82 | 83 | if [ -n "$container" ]; then 84 | alias dev='command' 85 | 86 | if [ -z "$SSH_AUTH_SOCK" ] && [ -S "/run/user/1000/keyring/ssh" ]; then 87 | export SSH_AUTH_SOCK="/run/user/1000/keyring/ssh" 88 | fi 89 | else 90 | # Run commands in container 91 | export PATH="/home/ai/.local/lib/node/node_modules/.bin/:$PATH" 92 | 93 | alias dev='/home/ai/Dev/environment/bin/dev' 94 | alias devup='dev --up' 95 | alias devdown='dev --down' 96 | alias pnpm='dev pnpm' 97 | alias node='dev node' 98 | alias pinact='dev pinact' 99 | 100 | # Run git hooks inside Dev Container 101 | export GIT_CONFIG_PARAMETERS="'core.hooksPath=/home/ai/Dev/environment/hooks-trap'" 102 | 103 | # Fast way to Dev projects 104 | if [ -d ~/Dev ]; then 105 | cdpath=(. ~/Dev) 106 | fi 107 | 108 | # VS Code 109 | alias e='~/Dev/environment/bin/zed-isolate .' 110 | 111 | # Development 112 | alias release=~/Dev/environment/bin/release 113 | alias p='dev pnpm clean-publish --temp-dir .npm-release --without-publish \ 114 | && cd .npm-release \ 115 | && npm publish \ 116 | && cd .. \ 117 | && rm -R .npm-release' 118 | 119 | # Google Cloud 120 | alias gcloud='sudo --user gcloud gcloud' 121 | alias gsutil='sudo --user gcloud gsutil' 122 | fi 123 | --------------------------------------------------------------------------------