├── .env ├── home ├── .bin │ ├── car │ ├── cdr │ ├── window-width │ ├── .bin │ ├── clean-swapfiles │ ├── co │ ├── git-dirty │ ├── bdiff │ ├── add-all-keys-silently │ ├── fixup │ ├── squash │ ├── bitbucket-clone │ ├── new-dev-null │ ├── git-resign │ └── github-clone └── .config │ ├── direnv │ └── direnv.toml │ ├── nvim │ ├── ftdetect │ │ └── lore.vim │ ├── init.lua │ ├── syntax │ │ └── lore.vim │ ├── lua │ │ └── config │ │ │ ├── options.lua │ │ │ ├── keymaps.lua │ │ │ ├── lsp.lua │ │ │ └── plugins.lua │ └── lazy-lock.json │ ├── zsh │ ├── ctags │ ├── prompt │ ├── path │ ├── zshrc │ ├── alias │ ├── env │ └── completions │ │ └── _tusk │ ├── ssh │ ├── ssh_config │ ├── known_hosts.old │ ├── config │ └── known_hosts │ ├── tmux │ ├── scripts │ │ ├── network.sh │ │ ├── cpu.sh │ │ ├── spotify.osascript │ │ ├── spotify.sh │ │ ├── battery.swift │ │ └── find.sh │ ├── tmux.light.conf │ ├── tmux.dark.conf │ ├── tmux.dark.catppuccin.conf │ └── tmux.conf │ ├── git │ ├── ignore │ └── config │ ├── ghostty │ └── config │ └── nixpkgs │ ├── home.nix │ └── darwin │ └── configuration.nix ├── obs ├── profile │ ├── streamEncoder.json │ └── basic.ini └── scenes.json ├── tools ├── regen-brewfile ├── setup-upstream ├── setup-nix-darwin ├── gpg-export ├── gpg-keygen ├── symlink ├── ssh-keygen └── steam.sh ├── .gitignore ├── bootstrap.sh ├── README.md ├── remote-install.sh ├── LICENSE ├── Brewfile └── AGENTS.md /.env: -------------------------------------------------------------------------------- 1 | test=2112 2 | -------------------------------------------------------------------------------- /home/.bin/car: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cut -d $1 -f 1 3 | -------------------------------------------------------------------------------- /home/.bin/cdr: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cut -d $1 -f 2- 3 | -------------------------------------------------------------------------------- /obs/profile/streamEncoder.json: -------------------------------------------------------------------------------- 1 | {"bitrate":6000} 2 | -------------------------------------------------------------------------------- /home/.config/direnv/direnv.toml: -------------------------------------------------------------------------------- 1 | [global] 2 | load_dotenv = true 3 | -------------------------------------------------------------------------------- /home/.bin/window-width: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | tmux display -p "#{window_width}" 3 | -------------------------------------------------------------------------------- /home/.bin/.bin: -------------------------------------------------------------------------------- 1 | /Users/leostera/Developer/github.com/leostera/dotfiles/./home/.bin -------------------------------------------------------------------------------- /home/.config/nvim/ftdetect/lore.vim: -------------------------------------------------------------------------------- 1 | au BufRead,BufNewFile *.lore set filetype=lore 2 | -------------------------------------------------------------------------------- /home/.bin/clean-swapfiles: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | find . -name ".*.sw*" | xargs rm 4 | -------------------------------------------------------------------------------- /home/.bin/co: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | git co `git b -r | fzf | awk '{ print $1 }' | cdr /` 4 | -------------------------------------------------------------------------------- /home/.bin/git-dirty: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | git diff-index --exit-code HEAD 2>&1 >/dev/null 4 | -------------------------------------------------------------------------------- /home/.config/zsh/ctags: -------------------------------------------------------------------------------- 1 | -o ~/.config/nvim/tags 2 | --recurse=yes 3 | --exclude=.git 4 | --exclude=dist 5 | --append 6 | -------------------------------------------------------------------------------- /home/.bin/bdiff: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | readonly FST=$1 4 | readonly SND=$2 5 | 6 | colordiff <(xxd $FST) <(xxd $SND) 7 | -------------------------------------------------------------------------------- /home/.bin/add-all-keys-silently: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | # Add all keys to keychain silently 4 | ssh-add -q -K -A 2>/dev/null 5 | -------------------------------------------------------------------------------- /home/.config/ssh/ssh_config: -------------------------------------------------------------------------------- 1 | X11Forwarding yes 2 | X11DisplayOffset 10 3 | PrintMotd no 4 | PrintLastLog yes 5 | TCPKeepAlive yes 6 | -------------------------------------------------------------------------------- /home/.config/zsh/prompt: -------------------------------------------------------------------------------- 1 | export PROMPT="; " 2 | 3 | bindkey -e 4 | bindkey '^ ' autosuggest-accept 5 | setopt interactivecomments 6 | -------------------------------------------------------------------------------- /home/.bin/fixup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | readonly HASH=$(git l | fzf --ansi | awk -F' ' '{ print $2 }') 4 | 5 | git fixup ${HASH} 6 | -------------------------------------------------------------------------------- /tools/regen-brewfile: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -xe 4 | 5 | brew bundle dump --force --describe --global 6 | mv ~/.Brewfile ./Brewfile 7 | -------------------------------------------------------------------------------- /home/.bin/squash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | readonly HASH=$(git l | fzf --ansi | awk -F' ' '{ print $2 }') 4 | 5 | git autosquash ${HASH}\~1 6 | -------------------------------------------------------------------------------- /home/.bin/bitbucket-clone: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | TO=$HOME/repos/bitbucket.org/$1/$2 4 | git clone https://bitbucket.org/$1/$2.git $TO 5 | pushd $TO 6 | -------------------------------------------------------------------------------- /home/.bin/new-dev-null: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sudo rm /dev/null; 4 | sudo mknod /dev/null c 1 3; 5 | sudo chown root:sys /dev/null; 6 | sudo chmod a+rw /dev/null; 7 | -------------------------------------------------------------------------------- /tools/setup-upstream: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | git init . 4 | git remote add origin git@github.com:ostera/dotfiles.git 5 | git fetch --all 6 | git reset --hard origin/main 7 | -------------------------------------------------------------------------------- /home/.config/tmux/scripts/network.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | dig +tries=1 +time=1 +short +search @8.8.8.8 google.com > /dev/null \ 3 | && echo ✅ \ 4 | || echo "❌ no internet!" 5 | -------------------------------------------------------------------------------- /home/.config/tmux/scripts/cpu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | readonly LOAD=$(sysctl -n vm.loadavg | awk '{ print $2 }') 4 | readonly NCPU=$(sysctl -n hw.ncpu) 5 | 6 | echo $LOAD/$NCPU 7 | -------------------------------------------------------------------------------- /tools/setup-nix-darwin: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | nix-build https://github.com/LnL7/nix-darwin/archive/master.tar.gz -A installer 4 | ./result/bin/darwin-installer 5 | rm -rf ./result 6 | 7 | darwin-rebuild switch 8 | -------------------------------------------------------------------------------- /home/.config/git/ignore: -------------------------------------------------------------------------------- 1 | *~ 2 | ._* 3 | .DS_Store 4 | node_modules 5 | *.swa 6 | *.swb 7 | *.swc 8 | *.swd 9 | *.swp 10 | *.swn 11 | *.swo 12 | TODO 13 | .TODO 14 | .sass-cache 15 | tags 16 | tags.lock 17 | tags.temp 18 | -------------------------------------------------------------------------------- /tools/gpg-export: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | readonly KEY_NAME=$( 4 | gpg --list-secret-keys --keyid-format LONG \ 5 | | grep "sec rsa2048/" \ 6 | | awk '{ print $2 }' \ 7 | | awk -F'/' '{ print $2 }' 8 | ) 9 | 10 | gpg --armor --export ${KEY_NAME} 11 | -------------------------------------------------------------------------------- /tools/gpg-keygen: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | gpg --list-keys >/dev/null 4 | 5 | if [[ `gpg --list-keys | wc -l` -eq "0" ]]; then 6 | echo "No GPG Keys! Don't even sweat it dawg, let's make a pair..." 7 | gpg --gen-key 8 | else 9 | echo "Found GPG Keys!" 10 | gpg --list-keys 11 | fi 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .sw* 2 | home/.config/vim/bundle 3 | home/.config/vim/plugged 4 | home/.config/vim/vim 5 | home/.config/vim/.netrwhist 6 | home/.config/vim/undos 7 | home/.config/vim/views 8 | home/.config/tmux/tmux 9 | home/.config/tmux/.search_options 10 | home/.config/ssh/id_* 11 | node_modules 12 | -------------------------------------------------------------------------------- /home/.bin/git-resign: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | readonly FROM=$1 4 | 5 | git rebase -i $FROM 6 | 7 | while [ `git status | rg "interactive rebase in progress" | wc -l` -gt 0 ]; do 8 | git commit -n -S --amend --no-edit >/dev/null 9 | git rc 10 | done 11 | 12 | git l 13 | echo "Congratulations!" 14 | -------------------------------------------------------------------------------- /bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | if [[ ! `which brew` ]]; then 4 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 5 | fi 6 | brew bundle 7 | 8 | kb-remap --map capslock:lcontrol 9 | 10 | ./tools/symlink 11 | 12 | echo "Starting new shell..." 13 | exec zsh 14 | 15 | ./tools/setup-upstream 16 | -------------------------------------------------------------------------------- /tools/symlink: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | function symlink() { 4 | ln -sfv "`pwd`/$1" $2 5 | } 6 | 7 | mkdir -p $HOME/.config 8 | for conf in ./home/.config/*; do 9 | symlink $conf $HOME/.config/ 10 | done 11 | 12 | symlink ./home/.config/ssh/ $HOME/.ssh 13 | symlink ./home/.bin $HOME/.bin 14 | symlink ./home/.config/zsh/zshrc $HOME/.zshrc 15 | -------------------------------------------------------------------------------- /home/.config/zsh/path: -------------------------------------------------------------------------------- 1 | export PATH="$HOME/.local/bin:$PATH" 2 | export PATH="$HOME/.bin:$PATH" 3 | export PATH="$HOME/.cargo/bin:$PATH" 4 | export PATH="$HOME/.tusk/bin:$PATH" 5 | export PATH="/opt/homebrew/bin:$PATH" # arm homebrew 6 | export PATH="/opt/homebrew/sbin:$PATH" 7 | export PATH="/opt/homebrew/opt/make/libexec/gnubin:$PATH" 8 | export PATH="/opt/homebrew/opt/openjdk/bin:$PATH" 9 | -------------------------------------------------------------------------------- /home/.config/ghostty/config: -------------------------------------------------------------------------------- 1 | # theme = tomorrow 2 | theme = Catppuccin Mocha 3 | command = zsh 4 | working-directory = inherit 5 | shell-integration = zsh 6 | custom-shader-animation = always 7 | clipboard-read = allow 8 | clipboard-write = allow 9 | window-theme = system 10 | window-padding-x = 0 11 | window-padding-y = 0 12 | background-opacity = 0.95 13 | background-blur-radius = 19 14 | -------------------------------------------------------------------------------- /home/.config/tmux/scripts/spotify.osascript: -------------------------------------------------------------------------------- 1 | set currentlyPlayingTrack to getCurrentlyPlayingTrack() 2 | 3 | on getCurrentlyPlayingTrack() 4 | tell application "Spotify" 5 | set currentArtist to artist of current track as string 6 | set currentTrack to name of current track as string 7 | 8 | return currentArtist & " - " & currentTrack 9 | end tell 10 | end getCurrentlyPlayingTrack 11 | -------------------------------------------------------------------------------- /home/.config/tmux/tmux.light.conf: -------------------------------------------------------------------------------- 1 | set -g status-fg colour233 2 | set -g status-bg colour231 3 | set -g status-left '\ 4 | #[fg=red]#(whoami)@#h:#S \ 5 | #[fg=colour233]· \ 6 | #[fg=colour233]#(basename #{pane_current_path}) \ 7 | #[fg=colour233]· \ 8 | #[fg=colour244]#{pane_current_command} \ 9 | #[default]\ 10 | ' 11 | set -g status-right '\ 12 | #[fg=colour245]#[fg=colour233] %d/%m %H:%M:%S \ 13 | ' 14 | -------------------------------------------------------------------------------- /home/.bin/github-clone: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | if [ -z "$2" ]; 4 | then 5 | REPO=$1 6 | else 7 | REPO=$1/$2 8 | fi 9 | 10 | TO=$HOME/Developer/github.com/$REPO 11 | 12 | if [ ! -f $TO/.git/HEAD ]; 13 | then 14 | if [ -z "${USE_HTTP}" ]; 15 | then 16 | git clone git@github.com:$REPO.git $TO $3 17 | else 18 | git clone https://github.com/$REPO $TO 19 | fi 20 | fi; 21 | 22 | echo $TO; 23 | -------------------------------------------------------------------------------- /tools/ssh-keygen: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | KEY=~/.ssh/id_ed25519 4 | 5 | if [ -z ${EMAIL} ]; then 6 | EMAIL=leandro@abstractmachines.dev 7 | fi 8 | 9 | if [ ! -f ${ID_RSA} ]; then 10 | echo "Missing default ssh keys at ${ID_RSA}!" 11 | echo "Creating pair..." 12 | ssh-keygen -t ed25519 -C "${EMAIL}" 13 | echo "Done:" 14 | else 15 | echo "Using existing ssh keys found at ${ID_RSA}:" 16 | fi; 17 | 18 | cat ${KEY} 19 | -------------------------------------------------------------------------------- /home/.config/tmux/scripts/spotify.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ $(window-width) -lt 100 ]]; then 4 | exit 5 | fi 6 | 7 | readonly IS_SPOTIFY_RUNNING=$( 8 | ps ax \ 9 | | grep "Spotify.app/Contents/MacOS/Spotify" \ 10 | | wc -l 11 | ) 12 | 13 | if [[ $IS_SPOTIFY_RUNNING -eq 2 ]]; then 14 | readonly NOW_PLAYING=$(osascript ~/.tmux/scripts/spotify.osascript) 15 | echo "🔊 ${NOW_PLAYING}" \ 16 | | awk 'length > 40 { $0=substr($0,0,41)"..." }1' 17 | fi 18 | -------------------------------------------------------------------------------- /home/.config/tmux/scripts/battery.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import IOKit.ps 3 | 4 | let snapshot = IOPSCopyPowerSourcesInfo().takeRetainedValue() 5 | let sources = IOPSCopyPowerSourcesList(snapshot).takeRetainedValue() as Array 6 | 7 | let description = IOPSGetPowerSourceDescription(snapshot, sources[0]).takeRetainedValue() as Dictionary 8 | 9 | // Apple provides Current Capacity from 0.0 to 100.0 10 | // so it's a good indicator of battery % 11 | print(description[kIOPSCurrentCapacityKey] as! Int) 12 | -------------------------------------------------------------------------------- /home/.config/tmux/tmux.dark.conf: -------------------------------------------------------------------------------- 1 | set -g status-fg colour249 2 | set -g status-bg colour233 3 | set -g status-left '\ 4 | #[fg=green,bg=colour233]#(whoami)@#h:#S \ 5 | #[fg=colour233,bg=colour237] \ 6 | #[fg=colour249,bg=colour237]#(basename #{pane_current_path}) \ 7 | #[fg=colour237,bg=colour245] \ 8 | #[fg=colour233,bg=colour245]#{pane_current_command} \ 9 | #[fg=colour245,bg=colour233] \ 10 | #[default]\ 11 | ' 12 | set -g status-right '\ 13 | #[fg=colour245]#[fg=colour233,bg=colour245] %d/%m %H:%M:%S \ 14 | ' 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 💾 `~/.*` 2 | > dotfiles. 3 | 4 | Install with: 5 | 6 | ```sh 7 | ; curl https://raw.githubusercontent.com/ostera/dotfiles/main/remote-install.sh | sh - 8 | ``` 9 | 10 | Very no-nonsense stuff. 11 | 12 | 1. Config files follow XDG conventions: `home/.config/*` symlinks to `$HOME/.config/*` 13 | 2. `home/.*` files symlink to `$HOME/.*` 14 | 3. Other installs are handled with `nix` 15 | 16 | Nothing more. Keep it simple. Fork away! 17 | 18 | ## License 19 | 20 | See [LICENSE](https://github.com/ostera/zazen/blob/main/LICENSE). 21 | -------------------------------------------------------------------------------- /remote-install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | BRANCH=main 4 | DOTFILES=~/repos/github.com/ostera/dotfiles 5 | 6 | echo "Creating dotfiles path..." 7 | mkdir -p ${DOTFILES} 8 | cd ${DOTFILES} 9 | 10 | echo "Downloading dotfiles..." 11 | curl https://codeload.github.com/ostera/dotfiles/tar.gz/${BRANCH} > ${BRANCH}.tar.gz 12 | 13 | echo "Extracting..." 14 | tar -xf ${BRANCH}.tar.gz 15 | mv dotfiles-${BRANCH}/* . 16 | 17 | echo "Bootstrapping..." 18 | ./bootstrap.sh 19 | 20 | echo "Cleaning..." 21 | rm -rf dotfiles-${BRANCH} ${BRANCH}.tar.gz 22 | 23 | -------------------------------------------------------------------------------- /home/.config/nvim/init.lua: -------------------------------------------------------------------------------- 1 | -- Bootstrap lazy.nvim 2 | local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 3 | if not vim.loop.fs_stat(lazypath) then 4 | vim.fn.system({ 5 | "git", 6 | "clone", 7 | "--filter=blob:none", 8 | "https://github.com/folke/lazy.nvim.git", 9 | "--branch=stable", 10 | lazypath, 11 | }) 12 | end 13 | vim.opt.rtp:prepend(lazypath) 14 | 15 | -- Load configuration modules 16 | require("config.options") 17 | require("config.keymaps") 18 | 19 | -- Setup plugins 20 | require("lazy").setup("config.plugins", { 21 | install = { 22 | missing = true, 23 | }, 24 | checker = { 25 | enabled = false, 26 | }, 27 | change_detection = { 28 | notify = false, 29 | }, 30 | }) 31 | -------------------------------------------------------------------------------- /home/.config/ssh/known_hosts.old: -------------------------------------------------------------------------------- 1 | github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl 2 | github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= 3 | github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= 4 | [192.168.1.19]:2112 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINis9qJ5YuGBVKRlNdeGz8igQr9jthLI0xllRvQTbbAi 5 | -------------------------------------------------------------------------------- /home/.config/ssh/config: -------------------------------------------------------------------------------- 1 | Include ~/.orbstack/ssh/config 2 | 3 | Host macstadium-arm 4 | User administrator 5 | HostName 207.254.29.174 6 | ServerAliveCountMax 300 7 | 8 | Host macstadium-intel 9 | User administrator 10 | HostName 208.52.189.22 11 | ServerAliveCountMax 300 12 | 13 | Host github-actions-linux-x86_64-runner 14 | User ubuntu 15 | HostName 18.208.131.230 16 | ServerAliveCountMax 300 17 | IdentityFile ~/.ssh/aws-github-actions-linux-x86_64-runner.pem 18 | IdentitiesOnly yes 19 | 20 | Host github-actions-linux-aarch64-runner 21 | User ubuntu 22 | HostName 3.80.103.138 23 | ServerAliveCountMax 300 24 | IdentityFile ~/.ssh/aws-github-actions-linux-aarch64-runner.pem 25 | IdentitiesOnly yes 26 | 27 | Host ds2.leostera.com 28 | User leostera 29 | HostName ds2.leostera.com 30 | ProxyCommand cloudflared access ssh --hostname %h 31 | 32 | Host starbase1.leostera.com 33 | HostName starbase1.leostera.com 34 | ProxyCommand cloudflared access ssh --hostname %h 35 | -------------------------------------------------------------------------------- /tools/steam.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | USER=$(whoami) 4 | cd /Users/${USER}/Library/Application\ Support/Steam/Steam.AppBundle/Steam/Contents/MacOS/public; ls *.res | while read line ; do file=$(echo $line | tr '[:upper:]' '[:lower:]'); mv $line $file; done 5 | cd /Users/${USER}/Library/Application\ Support/Steam/Steam.AppBundle/Steam/Contents/MacOS/steam/cached/; ls *.res | while read line ; do file=$(echo $line | tr '[:upper:]' '[:lower:]'); mv $line $file; done 6 | cd /Users/${USER}/Library/Application\ Support/Steam/Steam.AppBundle/Steam/Contents/MacOS/friends; ls *.res | while read line ; do file=$(echo $line | tr '[:upper:]' '[:lower:]'); mv $line $file; done 7 | cd /Users/${USER}/Library/Application\ Support/Steam/Steam.AppBundle/Steam/Contents/MacOS/graphics; ls *.tga | while read line ; do file=$(echo $line | tr '[:upper:]' '[:lower:]'); mv $line $file; done 8 | cd /Users/${USER}/Library/Application\ Support/Steam/Steam.AppBundle/Steam/Contents/MacOS/servers; ls *.tga | while read line ; do file=$(echo $line | tr '[:upper:]' '[:lower:]'); mv $line $file; done 9 | -------------------------------------------------------------------------------- /home/.config/zsh/zshrc: -------------------------------------------------------------------------------- 1 | . "$HOME/.config/zsh/env" 2 | . "$HOME/.config/zsh/path" 3 | . "$HOME/.config/zsh/alias" 4 | . "$HOME/.config/zsh/prompt" 5 | fpath=(~/.config/zsh/completions $fpath) 6 | 7 | # Switch to Solarized Dark if we are currently in dark mode 8 | # if [[ "$(uname -s)" == "Darwin" ]]; then 9 | # val=$(defaults read -g AppleInterfaceStyle 2>/dev/null) 10 | # if [[ $val != "Dark" ]]; then 11 | # export OS_THEME="light" 12 | # else 13 | # export OS_THEME="dark" 14 | # rm -f ~/.config/kitty/light.theme.conf 15 | # fi 16 | # tmux source-file ~/.config/tmux/tmux.${OS_THEME}.conf 17 | # pkill -USR1 kitty 18 | # fi 19 | # 20 | # export OS_THEME="light" 21 | # ln -sf ~/.config/kitty/Tomorrow.conf ~/.config/kitty/light.theme.conf 22 | # 23 | 24 | export OS_THEME="dark" 25 | 26 | # bun completions 27 | [ -s "/Users/ostera/.bun/_bun" ] && source "/Users/ostera/.bun/_bun" 28 | 29 | # bun 30 | export BUN_INSTALL="$HOME/.bun" 31 | export PATH="$BUN_INSTALL/bin:$PATH" 32 | 33 | # Added by LM Studio CLI (lms) 34 | export PATH="$PATH:/Users/leostera/.lmstudio/bin" 35 | # End of LM Studio CLI section 36 | 37 | -------------------------------------------------------------------------------- /home/.config/tmux/tmux.dark.catppuccin.conf: -------------------------------------------------------------------------------- 1 | set -gq @window_left_separator "█" 2 | set -gq @window_middle_separator "" 3 | set -gq @window_right_separator "█ " 4 | 5 | set -gq @blue "#89b4fa" 6 | set -gq @black "#11111b" 7 | set -gq @red '#eba0ac' 8 | set -gq @green '#a6e3a1' 9 | set -gq @gray '#bac2d2' 10 | set -gq @bg default 11 | set -gq @fg '#cdd6f4' 12 | 13 | set -gq @comp_whoami "#[fg=#{E:@green}]#(whoami)@#h:#S " 14 | 15 | set -gq @comp_dir "\ 16 | #[fg=#{E:@blue}]#{@window_left_separator}\ 17 | #[fg=#{E:@black},bg=#{E:@blue}]#(basename #{pane_current_path})\ 18 | #[fg=#{E:@blue}]#{@window_middle_separator}\ 19 | " 20 | 21 | set -gq @comp_app "\ 22 | #[fg=#{E:@red}]#{@window_left_separator}\ 23 | #[fg=#{E:@black},bg=#{E:@red}]#{pane_current_command}\ 24 | #[fg=#{E:@red},bg=default]#{@window_right_separator}\ 25 | " 26 | 27 | set -gq @comp_clock "\ 28 | #[fg=#{E:@gray}]#{@window_left_separator}\ 29 | #[fg=#{E:@black},bg=#{E:@gray}]%d/%m/%y %H:%M:%S " 30 | 31 | set -g status-style "default" 32 | set -g status-fg #{@fg} 33 | set -g status-bg #{@bg} 34 | set -g status-left '\ 35 | #{E:@comp_whoami}\ 36 | #{E:@comp_dir}\ 37 | #{E:@comp_app}\ 38 | #[default]\ 39 | ' 40 | set -g status-right '#{E:@comp_clock}' 41 | -------------------------------------------------------------------------------- /home/.config/ssh/known_hosts: -------------------------------------------------------------------------------- 1 | github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl 2 | github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= 3 | github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= 4 | [192.168.1.19]:2112 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINis9qJ5YuGBVKRlNdeGz8igQr9jthLI0xllRvQTbbAi 5 | [192.168.1.19]:2112 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG4fjo4olbK+dNARiyEzPM6F+xr9n3Q4QVtI+zIkiAfVFsT8xc7jSIBBUcgyeT5Q5q7rf49FKqOMbFWKgDz8Sv0= 6 | git.charm.sh ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuy+nYe1WRRM7KrupoN88FSbfayyezygBfvAOS8jbcJ 7 | -------------------------------------------------------------------------------- /home/.config/tmux/scripts/find.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | readonly SEARCH_OPTIONS=$HOME/.tmux/.search_options 4 | 5 | tmux list-window -a \ 6 | -F "#{session_name}:#{window_index} #{window_name} #{pane_current_command} #{pane_current_path}" \ 7 | > $SEARCH_OPTIONS 8 | 9 | cat ~/.z | cut -d'|' -f 1 | sort | uniq | sed 's/^/-:- - - /' >> $SEARCH_OPTIONS 10 | 11 | # For some reason readonly _eats_ the last exit status 12 | SEARCH_RESULTS=$( 13 | cat $SEARCH_OPTIONS \ 14 | | sort \ 15 | | uniq \ 16 | | column -t \ 17 | | fzf --print-query 18 | ) 19 | readonly MATCHED=$? 20 | readonly QUERY=$( echo $SEARCH_RESULTS | cut -d " " -f 1 ) 21 | readonly SELECTION=$( echo $SEARCH_RESULTS | cut -d " " -f 1- ) 22 | 23 | if [[ $MATCHED -eq 0 ]]; then 24 | readonly TMUX_SELECTOR=$( echo $SELECTION | awk '{ print $2 }' ) 25 | readonly TMUX_SESSION=$( echo $TMUX_SELECTOR | awk -F':' '{ print $1 }' ) 26 | readonly TMUX_WINDOW=$( echo $TMUX_SELECTOR | awk -F':' '{ print $2 }' ) 27 | 28 | readonly TMUX_PATH=$( echo $SELECTION | awk '{ print $NF }' ) 29 | readonly TMUX_WINDOW_NAME=$(basename $TMUX_PATH) 30 | 31 | if [[ "$TMUX_WINDOW" == "-" ]]; then 32 | tmux new-window -a -n $TMUX_WINDOW_NAME -c $TMUX_PATH 33 | else 34 | tmux switch -t $TMUX_SESSION 35 | tmux select-window -t $TMUX_WINDOW 36 | fi 37 | fi 38 | -------------------------------------------------------------------------------- /home/.config/nixpkgs/home.nix: -------------------------------------------------------------------------------- 1 | { config, pkgs, ...}: 2 | 3 | { 4 | nix.settings.experimental-features = [ "nix-command" "flakes" "repl-flake" ]; 5 | 6 | nixpkgs.config.allowUnfree = true; 7 | nixpkgs.config.allowUnsupportedSystem = true; 8 | nixpkgs.config.trustedUsers = ["root" "ostera" "leostera"]; 9 | nixpkgs.config.extraNixPath = ["nixpkgs=flake:nixpkgs"]; 10 | 11 | services.nix-daemon.enable = true; 12 | 13 | networking.hostName = "starbase1"; 14 | 15 | environment.systemPackages = 16 | with pkgs; [ 17 | # bazel 18 | # docker 19 | # openssl 20 | # ngrok 21 | (nerdfonts.override { fonts = [ "FiraCode" ]; }) 22 | autoconf 23 | automake 24 | # awscli 25 | bat 26 | cloc 27 | clojure 28 | cmake 29 | go 30 | colordiff 31 | coreutils 32 | ctags 33 | direnv 34 | eza 35 | fnm 36 | fzf 37 | gettext 38 | gifsicle 39 | gist 40 | git 41 | git-extras 42 | gnupg 43 | htop 44 | inetutils 45 | jq 46 | llvm 47 | minio 48 | mkcert 49 | nodejs 50 | opam 51 | python3 52 | ripgrep 53 | rustup 54 | tldr 55 | tmux 56 | tree 57 | libsodium 58 | neovim 59 | rebar3 60 | vhs 61 | vim 62 | wget 63 | wireshark 64 | zsh 65 | ]; 66 | } 67 | 68 | -------------------------------------------------------------------------------- /home/.config/nvim/syntax/lore.vim: -------------------------------------------------------------------------------- 1 | " Vim syntax file 2 | " Language: Lore 3 | " Maintainer: Leandro Ostera 4 | 5 | if exists("b:current_syntax") 6 | finish 7 | endif 8 | 9 | 10 | " 11 | syntax keyword loreLangTodo TODO FIXME NOTE 12 | syntax match loreLangComment "#.*$" contains=loreLangTodo 13 | " 14 | " syn region loreLangString start='"' end='"' contained 15 | " syn region loreLangBlock start="{" end="}" fold transparent 16 | " 17 | " 18 | " hi def link loreLangTodo Todo 19 | " hi def link loreLangComment Comment 20 | " hi def link loreLangString String 21 | " hi def link loreLangBlock Operator 22 | " 23 | " syn match loreLangPrefix '@[a-zA-Z]\+[/]\?' 24 | " syn match loreLangUri '[a-z0-9][a-z0-9/]*:[a-zA-Z0-9()+,-.:=@;$_!*%/?#]\+' 25 | syntax keyword loreLangKeywords as attr in kind prefix rel using 26 | 27 | syntax match loreLangCodepointEscape /\(\\U\x\{8\}\|\\u\x\{4\}\)/ contained contains=NONE 28 | syntax match loreLangPrefix /@[a-zA-Z0-9]*/ contains=loreLangCodepointEscape oneline 29 | syntax match loreLangUri /@[a-zA-Z0-9]*\/[^<>'{}|^`\u00-\u20]*/ contains=loreLangCodepointEscape,loreLangPrefix oneline 30 | syntax match loreLangUri /[^<>'{}|^`\u00-\u20]*:[^<>'{}|^`\u00-\u20]*/ contains=loreLangCodepointEscape oneline 31 | " 32 | " 33 | highlight link loreLangKeywords Keyword 34 | highlight link loreLangUri Identifier 35 | highlight link loreLangPrefix Type 36 | highlight link loreLangTodo Todo 37 | highlight link loreLangComment Comment 38 | -------------------------------------------------------------------------------- /home/.config/zsh/alias: -------------------------------------------------------------------------------- 1 | repo() { 2 | pushd $(github-clone $*) 3 | } 4 | 5 | alias theme="kitty +kitten themes" 6 | 7 | alias q="exit" 8 | 9 | alias x86="arch -x86_64 zsh" 10 | 11 | alias cat="bat --theme gruvbox-dark" 12 | 13 | alias g="git" 14 | alias gg="git" 15 | alias status="g status" 16 | alias clone="g clone" 17 | alias init="g init" 18 | alias shallow="clone --depth 1" 19 | 20 | alias vim="nvim" 21 | alias v="nvim" 22 | alias vf="nvim \$(f)" 23 | alias ctags-here="ctags -o tags" 24 | 25 | alias k="kubectl" 26 | alias h="\history -i 0 | f" 27 | alias m="make" 28 | 29 | alias f="fzf" 30 | alias tmux="tmux -2 -f $HOME/.config/tmux/tmux.conf" 31 | alias tma="tmux attach" 32 | 33 | alias zellij="zellij --config $HOME/.config/zellij/config.yaml" 34 | 35 | alias c=" pushd \$(FZF_DEFAULT_COMMAND=\${FZF_DEFAULT_DIRECTORY_COMMAND} f)" 36 | alias ..="cd .." 37 | alias ...="cd ../.." 38 | alias ....="cd ../../.." 39 | alias ~="pushd ~" 40 | alias repos="pushd ~/Developer" 41 | 42 | alias l="eza -lg" 43 | alias la="eza -alH" 44 | 45 | for level in {1..9}; do 46 | tree="tree -C -L ${level} -h"; 47 | t=$(repeat ${level} echo -n "t"); 48 | eval "alias ${t}='${tree}'"; 49 | eval "alias t${level}='${tree}'"; 50 | done 51 | 52 | alias dotfiles="pushd ~/Developer/github.com/leostera/dotfiles" 53 | alias gitconf="nvim ~/.config/git/config" 54 | alias reload="source ~/.zshrc" 55 | alias tmuxrc="nvim ~/.config/tmux/tmux.conf" 56 | alias nvimrc="nvim ~/.config/nvim/init.lua" 57 | alias zshrc="nvim ~/.zshrc ; reload" 58 | -------------------------------------------------------------------------------- /home/.config/nvim/lua/config/options.lua: -------------------------------------------------------------------------------- 1 | -- Leader key 2 | vim.g.mapleader = "," 3 | vim.g.maplocalleader = "," 4 | 5 | -- Basic options 6 | vim.opt.number = true 7 | vim.opt.relativenumber = false 8 | vim.opt.mouse = "a" 9 | vim.opt.ignorecase = true 10 | vim.opt.smartcase = true 11 | vim.opt.hlsearch = false 12 | vim.opt.wrap = true 13 | vim.opt.breakindent = true 14 | vim.opt.tabstop = 2 15 | vim.opt.shiftwidth = 2 16 | vim.opt.expandtab = true 17 | vim.opt.autoindent = true 18 | vim.opt.smartindent = true 19 | 20 | -- Visual 21 | vim.opt.termguicolors = true 22 | vim.opt.signcolumn = "yes" 23 | vim.opt.cursorline = false 24 | vim.opt.scrolloff = 8 25 | 26 | -- Folding 27 | vim.opt.foldenable = false 28 | vim.opt.foldmethod = "manual" 29 | 30 | -- Completion 31 | vim.opt.completeopt = { "menuone", "noinsert", "noselect" } 32 | vim.opt.shortmess:append("c") 33 | 34 | -- Split behavior 35 | vim.opt.splitright = true 36 | vim.opt.splitbelow = true 37 | 38 | -- File handling 39 | vim.opt.undofile = true 40 | vim.opt.backup = false 41 | vim.opt.writebackup = false 42 | vim.opt.swapfile = false 43 | 44 | -- Performance 45 | vim.opt.updatetime = 250 46 | vim.opt.timeoutlen = 300 47 | 48 | -- Filetype-specific settings 49 | vim.api.nvim_create_autocmd({ "BufNewFile", "BufRead" }, { 50 | pattern = "*.caramel", 51 | callback = function() 52 | vim.bo.syntax = "rust" 53 | end, 54 | }) 55 | 56 | vim.api.nvim_create_autocmd({ "BufNewFile", "BufRead" }, { 57 | pattern = "*.core", 58 | callback = function() 59 | vim.bo.syntax = "erlang" 60 | end, 61 | }) 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015-Present, Leandro Ostera . 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are 6 | met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above copyright 12 | notice, this list of conditions and the following disclaimer in the 13 | documentation and/or other materials provided with the distribution. 14 | 15 | * The names of its contributors may not be used to endorse or promote 16 | products derived from this software without specific prior written 17 | permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /home/.config/zsh/env: -------------------------------------------------------------------------------- 1 | export ENV=local 2 | export HOSTNAME=$(hostname) 3 | export LANG=en_us.utf-8 4 | export LC_CTYPE=en_US.UTF-8 5 | export LC_ALL=en_US.UTF-8 6 | 7 | export FZF_DEFAULT_COMMAND="\ 8 | rg . \ 9 | --files \ 10 | --follow \ 11 | --glob '!*cache/*' \ 12 | --glob '!_build/*' \ 13 | --glob '!.git/*' \ 14 | --unrestricted \ 15 | --hidden \ 16 | " 17 | 18 | export FZF_DEFAULT_DIRECTORY_COMMAND="\ 19 | rg . \ 20 | --files \ 21 | --null \ 22 | | xargs -0 dirname \ 23 | | sort -u 24 | " 25 | 26 | export XDG_CONFIG_PATH="${XDG_CONFIG_PATH}:~/.config" 27 | export ANDROID_HOME=/home/ostera/Android/Sdk/ 28 | export CLASS_PATH="$CLASS_PATH:${HOME}/.tla" 29 | export EDITOR=vim 30 | export GCLOUD_CONFIG=~/.config/gcloud 31 | export GCLOUD_CREDENTIALS=${GCLOUD_CONFIG}/credentials 32 | export GOOGLE_APPLICATION_CREDENTIALS=${GCLOUD_CONFIG}/application_default_credentials.json 33 | export GOPATH=~/.go 34 | export GPG_TTY=$(tty) 35 | export HISTFILE=~/.zhistory 36 | export HISTSIZE=1000000 37 | export NODE_ENV=development 38 | export NODE_PATH=./lib/:./modules/ 39 | export NVM_DIR=~/.nvm 40 | export RBENV_ROOT=~/.rbenv 41 | export SAVEHIST=1000000 42 | export BAT_THEME="gruvbox-dark" 43 | export TERM="xterm-256color" 44 | export ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=20 45 | export JAVA_HOME="/opt/homebrew/opt/openjdk" 46 | export LIBRARY_PATH=/opt/homebrew/opt/mariadb-connector-c/lib/mariadb:$LIBRARY_PATH 47 | 48 | export NIX_PATH=darwin=$HOME/.nix-defexpr/darwin:darwin-config=$HOME/.config/nixpkgs/darwin/configuration.nix:$NIX_PATH 49 | 50 | export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@3/lib/pkgconfig:$PKG_CONFIG_PATH" 51 | -------------------------------------------------------------------------------- /home/.config/nvim/lua/config/keymaps.lua: -------------------------------------------------------------------------------- 1 | local keymap = vim.keymap.set 2 | local opts = { noremap = true, silent = true } 3 | 4 | -- LSP keymaps (defined globally, will work when LSP attaches) 5 | keymap("n", "e", vim.diagnostic.open_float, opts) 6 | keymap("n", "[d", vim.diagnostic.goto_prev, opts) 7 | keymap("n", "]d", vim.diagnostic.goto_next, opts) 8 | keymap("n", "q", vim.diagnostic.setloclist, opts) 9 | keymap("n", "do", vim.diagnostic.open_float, opts) 10 | 11 | -- Better window navigation 12 | keymap("n", "", "h", opts) 13 | keymap("n", "", "j", opts) 14 | keymap("n", "", "k", opts) 15 | keymap("n", "", "l", opts) 16 | 17 | -- Comments (vim-commentary) 18 | keymap("n", "c", "gcc", { remap = true }) 19 | keymap("v", "c", "gc", { remap = true }) 20 | 21 | -- FZF 22 | keymap("n", "", ":FZF", opts) 23 | keymap("n", "", ":Files", opts) 24 | keymap("n", "f", ":Rg", opts) 25 | keymap("n", "b", ":Buffers", opts) 26 | 27 | -- Tab management 28 | keymap("n", "tt", ":tabnew", opts) 29 | keymap("n", "tl", ":tabnext", opts) 30 | keymap("n", "tr", ":tabprevious", opts) 31 | keymap("n", "t1", "1gt", opts) 32 | keymap("n", "t2", "2gt", opts) 33 | keymap("n", "t3", "3gt", opts) 34 | keymap("n", "t4", "4gt", opts) 35 | keymap("n", "t5", "5gt", opts) 36 | keymap("n", "t6", "6gt", opts) 37 | keymap("n", "t7", "7gt", opts) 38 | keymap("n", "t8", "8gt", opts) 39 | keymap("n", "t9", "9gt", opts) 40 | keymap("n", "t0", ":tablast", opts) 41 | 42 | -- Splits 43 | keymap("n", "v", ":vsplit", opts) 44 | keymap("n", "h", ":split", opts) 45 | 46 | -- ESC alternative 47 | keymap("i", "jk", "", opts) 48 | -------------------------------------------------------------------------------- /home/.config/tmux/tmux.conf: -------------------------------------------------------------------------------- 1 | # Pane numbering 2 | set -g renumber-windows on 3 | set -g base-index 0 4 | setw -g pane-base-index 0 5 | 6 | # Unlimited scrollback! 7 | set-option -g history-limit 100000 8 | 9 | # TrueColor! 10 | set-option -ga terminal-overrides ",xterm-256color*:Tc" 11 | 12 | # C-b is not acceptable -- Vim uses it 13 | # C-a is not acceptable -- I use it to go to the beginning of the term line 14 | set-option -g prefix C-q 15 | bind C-q last-window 16 | 17 | # Copy text like vim 18 | setw -g mode-keys vi 19 | 20 | unbind [ 21 | unbind Space 22 | bind-key Space copy-mode 23 | 24 | bind-key -T copy-mode-vi 'v' send -X begin-selection 25 | bind-key -T copy-mode-vi 'y' send -X copy-selection 26 | 27 | unbind p 28 | bind-key 'p' paste-buffer 29 | 30 | 31 | # Fuzzy search through all sessions/windows 32 | unbind s 33 | bind s split-window -c "#{pane_current_path}" -v '~/.tmux/scripts/find.sh' 34 | 35 | # Set reload config 36 | unbind r 37 | bind r source-file ~/.config/tmux/tmux.conf; display "Configuration reloaded." 38 | 39 | # Move around panes like vim 40 | bind h select-pane -L 41 | bind j select-pane -D 42 | bind k select-pane -U 43 | bind l select-pane -R 44 | 45 | # Split windows into panes like vim's splits 46 | # preserving the current path 47 | unbind '"' 48 | unbind % 49 | unbind v 50 | unbind b 51 | unbind c 52 | bind v split-window -v -c "#{pane_current_path}" 53 | bind b split-window -h -c "#{pane_current_path}" 54 | bind c new-window -c "#{pane_current_path}" 55 | 56 | # Trying it out 57 | bind N previous-window 58 | 59 | unbind L 60 | bind L next-layout 61 | 62 | # Status Bar 63 | set -g status on 64 | set -g status-interval 1 65 | 66 | set -g status-justify centre 67 | set -g status-position top 68 | 69 | set -g status-left-length 50 70 | set -g status-right-length 80 71 | 72 | # source ~/.config/tmux/tmux.${OS_THEME}.conf 73 | # source ~/.config/tmux/tmux.dark.conf 74 | # source ~/.config/tmux/tmux.light.conf 75 | source ~/.config/tmux/tmux.dark.catppuccin.conf 76 | -------------------------------------------------------------------------------- /obs/profile/basic.ini: -------------------------------------------------------------------------------- 1 | [General] 2 | Name=Untitled 3 | 4 | [Video] 5 | BaseCX=1920 6 | BaseCY=1080 7 | OutputCX=1920 8 | OutputCY=1080 9 | ScaleType=bicubic 10 | FPSType=0 11 | FPSCommon=30 12 | FPSInt=30 13 | FPSNum=30 14 | FPSDen=1 15 | ColorFormat=NV12 16 | ColorSpace=709 17 | ColorRange=Partial 18 | SdrWhiteLevel=300 19 | HdrNominalPeakLevel=1000 20 | 21 | [Panels] 22 | CookieId=BBB26068F130277F 23 | 24 | [Output] 25 | Mode=Advanced 26 | FilenameFormatting=%CCYY-%MM-%DD %hh-%mm-%ss 27 | DelayEnable=false 28 | DelaySec=20 29 | DelayPreserve=true 30 | Reconnect=true 31 | RetryDelay=2 32 | MaxRetries=25 33 | BindIP=default 34 | IPFamily=IPv4+IPv6 35 | NewSocketLoopEnable=false 36 | LowLatencyEnable=false 37 | 38 | [SimpleOutput] 39 | VBitrate=6000 40 | StreamEncoder=apple_h264 41 | ApplePreset= 42 | FilePath=/Users/ostera/Movies 43 | RecFormat2=mkv 44 | ABitrate=160 45 | UseAdvanced=false 46 | Preset=veryfast 47 | NVENCPreset2=p5 48 | RecQuality=Stream 49 | RecRB=false 50 | RecRBTime=20 51 | RecRBSize=512 52 | RecRBPrefix=Replay 53 | StreamAudioEncoder=aac 54 | RecAudioEncoder=aac 55 | RecTracks=1 56 | RecEncoder=x264 57 | 58 | [AdvOut] 59 | TrackIndex=1 60 | RecType=Standard 61 | RecSplitFileType=Time 62 | RecTracks=1 63 | FLVTrack=1 64 | FFOutputToFile=true 65 | FFFormat= 66 | FFFormatMimeType= 67 | FFVEncoderId=0 68 | FFVEncoder= 69 | FFAEncoderId=0 70 | FFAEncoder= 71 | FFAudioMixes=1 72 | VodTrackIndex=6 73 | RescaleRes=1920x1080 74 | RecRescaleRes=1920x1080 75 | FFRescaleRes=1920x1080 76 | Encoder=com.apple.videotoolbox.videoencoder.ave.avc 77 | ApplyServiceSettings=true 78 | UseRescale=false 79 | RecFilePath=/Users/ostera/Movies 80 | RecFormat2=mkv 81 | RecUseRescale=false 82 | RecEncoder=none 83 | FFFilePath=/Users/ostera/Movies 84 | FFVBitrate=2500 85 | FFVGOPSize=250 86 | FFUseRescale=false 87 | FFIgnoreCompat=false 88 | FFABitrate=160 89 | Track1Bitrate=160 90 | Track2Bitrate=160 91 | Track3Bitrate=160 92 | Track4Bitrate=160 93 | Track5Bitrate=160 94 | Track6Bitrate=160 95 | RecSplitFileTime=15 96 | RecSplitFileSize=2048 97 | RecRB=false 98 | RecRBTime=20 99 | RecRBSize=512 100 | AudioEncoder=CoreAudio_AAC 101 | RecAudioEncoder=CoreAudio_AAC 102 | VodTrackEnabled=true 103 | FFExtension=mp4 104 | 105 | [Auth] 106 | Type=Twitch 107 | 108 | [Stream1] 109 | IgnoreRecommended=false 110 | 111 | [Audio] 112 | MonitoringDeviceId=default 113 | MonitoringDeviceName=Default 114 | SampleRate=48000 115 | ChannelSetup=Stereo 116 | MeterDecayRate=23.53 117 | PeakMeterType=0 118 | -------------------------------------------------------------------------------- /home/.config/nixpkgs/darwin/configuration.nix: -------------------------------------------------------------------------------- 1 | { config, pkgs, ...}: 2 | 3 | { 4 | imports = [ 5 | ../home.nix 6 | ]; 7 | 8 | nixpkgs.hostPlatform = "aarch64-darwin"; 9 | 10 | environment.systemPackages = 11 | with pkgs; [ 12 | ]; 13 | 14 | system.defaults = { 15 | dock = { 16 | autohide = true; 17 | autohide-delay = 0.0; 18 | autohide-time-modifier = 0.0; 19 | minimize-to-application = true; 20 | mru-spaces = false; 21 | orientation = "bottom"; 22 | show-recents = false; 23 | tilesize = 64; 24 | }; 25 | 26 | screencapture.location = "${builtins.getEnv ("HOME")}/Desktop/Screenshots"; 27 | 28 | finder = { 29 | AppleShowAllExtensions = true; 30 | _FXShowPosixPathInTitle = true; 31 | FXEnableExtensionChangeWarning = false; 32 | }; 33 | 34 | trackpad = { 35 | Clicking = true; 36 | }; 37 | 38 | NSGlobalDomain._HIHideMenuBar = false; 39 | }; 40 | 41 | # fonts = { 42 | # fontDir.enable = true; 43 | # fonts = with pkgs; [ 44 | # (nerdfonts.override { fonts = [ 45 | # "FiraCode" 46 | # "SourceCodePro" 47 | # ]; }) 48 | # ]; 49 | # }; 50 | 51 | homebrew = { 52 | brewPrefix = "/opt/homebrew/bin"; 53 | enable = true; 54 | onActivation.autoUpdate = false; 55 | global = { 56 | brewfile = true; 57 | lockfiles = false; 58 | }; 59 | 60 | taps = [ 61 | "homebrew/bundle" 62 | "homebrew/cask-fonts" 63 | "homebrew/cask-versions" 64 | "homebrew/services" 65 | "ubuntu/microk8s" 66 | ]; 67 | 68 | brews = [ 69 | "cloudflared" 70 | "coreutils" 71 | "direnv" 72 | "deno" 73 | "valgrind" 74 | "freetds" 75 | "golang" 76 | "hevea" 77 | "hyperfine" 78 | "libsodium" 79 | "make" 80 | "mmv" 81 | "openjdk" 82 | "protobuf" 83 | "tidy-html5" 84 | "watchexec" 85 | "zellij" 86 | "rbenv" 87 | "swift" 88 | # "Cmake" 89 | # "llvm" 90 | # "pulumi" 91 | ]; 92 | 93 | casks = [ 94 | "1password" 95 | "1password-cli" 96 | "alacritty" 97 | "basictex" 98 | "brave-browser" 99 | # "db-browser-for-sqlite" 100 | "discord" 101 | "docker" 102 | "kitty" 103 | "linear-linear" 104 | "miro" 105 | "ngrok" 106 | "notion" 107 | "obs" 108 | "pgadmin4" 109 | "postman" 110 | "steam" 111 | "telegram" 112 | "visual-studio-code" 113 | "vlc" 114 | "wezterm" 115 | # "racket" 116 | ]; 117 | }; 118 | 119 | system.keyboard.enableKeyMapping = true; 120 | system.keyboard.remapCapsLockToControl = true; 121 | 122 | environment.darwinConfig = "$HOME/.config/nixpkgs/darwin/configuration.nix"; 123 | 124 | system.stateVersion = 4; 125 | } 126 | -------------------------------------------------------------------------------- /home/.config/git/config: -------------------------------------------------------------------------------- 1 | [user] 2 | name = Leandro Ostera 3 | email = leandro@abstractmachines.dev 4 | signingkey = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHtw0I3+2bdzPl234KQTVhBqHXCnDvlOf/2xn+ATKyZj 5 | 6 | [github] 7 | user = ostera 8 | 9 | [gpg] 10 | format = ssh 11 | 12 | [gpg "ssh"] 13 | program = /Applications/1Password.app/Contents/MacOS/op-ssh-sign 14 | allowedSignersFile = /Users/ostera/.config/git/allowed_signers 15 | 16 | [core] 17 | excludesfile = ~/.config/git/ignore 18 | editor = nvim 19 | filemode = false 20 | trustctime = false 21 | 22 | [alias] 23 | A = add -A 24 | amend = commit -S --amend 25 | b = branch -rv 26 | c = commit -S 27 | cam = commit -S -am 28 | cm = commit -S -m 29 | co = checkout 30 | cob = checkout -b 31 | cod = checkout development 32 | com = checkout main 33 | cp = cherry-pick 34 | cpa = cherry-pick --abort 35 | cpc = cherry-pick --continue 36 | d = diff 37 | d1 = diff HEAD~1 38 | d2 = diff HEAD~2 39 | d3 = diff HEAD~3 40 | d4 = diff HEAD~4 41 | d5 = diff HEAD~5 42 | dh = diff HEAD 43 | dm = diff main 44 | dt = difftool 45 | fall = fetch --all 46 | fixup = commit --fixup 47 | l = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%C(bold blue)<%an> (%G?)%Creset' --abbrev-commit 48 | lo = log --color --stat 49 | p = push 50 | pall = pull --all 51 | patch = apply --reject --ignore-whitespace --ignore-space-change 52 | pod = push origin development 53 | pom = push origin main --tags 54 | pomfu = push origin main --tags --force --set-upstream 55 | purge = reset --hard HEAD 56 | ra = rebase --abort 57 | rao = remote add origin 58 | rc = rebase --continue 59 | rl = reflog --date=iso --decorate 60 | rom = rebase origin/main 61 | s = status -s 62 | sl = shortlog 63 | ss = status 64 | autosquash = rebase -i --autosquash 65 | t = tag -s 66 | tags = tag --sort "v:refname" 67 | unstage = reset --soft HEAD 68 | 69 | [commit] 70 | gpgsign = true 71 | 72 | [color] 73 | ui = auto 74 | 75 | [color "branch"] 76 | current = green 77 | local = blue 78 | remote = yellow 79 | 80 | [color "diff"] 81 | new = green 82 | old = red 83 | frag = magenta 84 | meta = blue 85 | 86 | [color "status"] 87 | added = green bold 88 | removed = red 89 | changed = green 90 | untracked = cyan 91 | 92 | [credential] 93 | helper = osxkeychain 94 | 95 | [diff] 96 | renames = copies 97 | tool = vimdiff 98 | 99 | [difftool] 100 | prompt = false 101 | 102 | [mergetool] 103 | prompt = false 104 | 105 | [diff] 106 | renames = copies 107 | 108 | [help] 109 | autocorrect = 1 110 | 111 | [init] 112 | defaultBranch = main 113 | 114 | [push] 115 | default = simple 116 | autoSetupRemote = true 117 | rebase = true 118 | [filter "lfs"] 119 | clean = git-lfs clean -- %f 120 | smudge = git-lfs smudge -- %f 121 | process = git-lfs filter-process 122 | required = true 123 | [credential "https://github.com"] 124 | helper = 125 | helper = !/opt/homebrew/bin/gh auth git-credential 126 | [credential "https://gist.github.com"] 127 | helper = 128 | helper = !/opt/homebrew/bin/gh auth git-credential 129 | -------------------------------------------------------------------------------- /home/.config/nvim/lua/config/lsp.lua: -------------------------------------------------------------------------------- 1 | -- LSP keybindings on attach 2 | local on_attach = function(client, bufnr) 3 | local bufopts = { noremap = true, silent = true, buffer = bufnr } 4 | 5 | vim.keymap.set("n", "gD", vim.lsp.buf.declaration, bufopts) 6 | vim.keymap.set("n", "gd", vim.lsp.buf.definition, bufopts) 7 | vim.keymap.set("n", "K", vim.lsp.buf.hover, bufopts) 8 | vim.keymap.set("n", "gi", vim.lsp.buf.implementation, bufopts) 9 | vim.keymap.set("n", "", vim.lsp.buf.signature_help, bufopts) 10 | vim.keymap.set("n", "wa", vim.lsp.buf.add_workspace_folder, bufopts) 11 | vim.keymap.set("n", "wr", vim.lsp.buf.remove_workspace_folder, bufopts) 12 | vim.keymap.set("n", "wl", function() 13 | print(vim.inspect(vim.lsp.buf.list_workspace_folders())) 14 | end, bufopts) 15 | vim.keymap.set("n", "D", vim.lsp.buf.type_definition, bufopts) 16 | vim.keymap.set("n", "rn", vim.lsp.buf.rename, bufopts) 17 | vim.keymap.set("n", "ca", vim.lsp.buf.code_action, bufopts) 18 | vim.keymap.set("n", "gr", vim.lsp.buf.references, bufopts) 19 | vim.keymap.set("n", "F", function() 20 | vim.lsp.buf.format({ async = true }) 21 | end, bufopts) 22 | 23 | -- Format on save 24 | if client.server_capabilities.documentFormattingProvider then 25 | vim.api.nvim_create_autocmd("BufWritePre", { 26 | group = vim.api.nvim_create_augroup("LspFormat", { clear = true }), 27 | buffer = bufnr, 28 | callback = function() 29 | vim.lsp.buf.format({ async = false }) 30 | end, 31 | }) 32 | end 33 | end 34 | 35 | -- Use the modern vim.lsp.config API if available (nvim 0.11+), otherwise fall back to lspconfig 36 | local has_modern_lsp = vim.fn.has("nvim-0.11") == 1 and vim.lsp.config ~= nil 37 | 38 | if has_modern_lsp then 39 | -- Modern API (nvim 0.11+) 40 | vim.lsp.config("*", { 41 | on_attach = on_attach, 42 | }) 43 | 44 | vim.lsp.enable("zls") 45 | vim.lsp.enable("ocamllsp") 46 | vim.lsp.enable("denols") 47 | vim.lsp.enable("elixirls") 48 | vim.lsp.enable("phpactor") 49 | vim.lsp.enable("lua_ls") 50 | else 51 | -- Legacy lspconfig approach (nvim < 0.11) 52 | local lspconfig = require("lspconfig") 53 | 54 | lspconfig.zls.setup({ on_attach = on_attach }) 55 | lspconfig.denolds.setup({ on_attach = on_attach, filetypes = { "typescript", "typescriptreact", "typescript.tsx" } }) 56 | lspconfig.elixirls.setup({ on_attach = on_attach, cmd = { vim.fn.system("brew --prefix elixir-ls"):gsub("%s+$", "") .. "/bin/elixir-ls" } }) 57 | 58 | lspconfig.lua_ls.setup({ 59 | on_attach = on_attach, 60 | settings = { 61 | Lua = { 62 | diagnostics = { globals = { "vim" } }, 63 | workspace = { library = vim.api.nvim_get_runtime_file("", true), checkThirdParty = false }, 64 | telemetry = { enable = false }, 65 | }, 66 | }, 67 | }) 68 | end 69 | 70 | -- Zig-specific formatting and code actions 71 | vim.api.nvim_create_autocmd("BufWritePre", { 72 | pattern = { "*.zig", "*.zon" }, 73 | callback = function() 74 | vim.lsp.buf.format() 75 | vim.lsp.buf.code_action({ 76 | context = { only = { "source.fixAll" } }, 77 | apply = true, 78 | }) 79 | vim.lsp.buf.code_action({ 80 | context = { only = { "source.organizeImports" } }, 81 | apply = true, 82 | }) 83 | end, 84 | }) 85 | -------------------------------------------------------------------------------- /Brewfile: -------------------------------------------------------------------------------- 1 | tap "leostera/macos-cross-toolchains" 2 | tap "oven-sh/bun" 3 | tap "rossmacarthur/tap" 4 | # Automatic configure script builder 5 | brew "autoconf" 6 | # Official Amazon AWS command-line interface 7 | brew "awscli" 8 | # Clone of cat(1) with syntax highlighting and Git integration 9 | brew "bat" 10 | # CLI tool for Cloudflare Workers 11 | brew "cloudflare-wrangler" 12 | # Cross-platform make 13 | brew "cmake" 14 | # GNU File, Shell, and Text utilities 15 | brew "coreutils" 16 | # Fast Lexical Analyzer, generates Scanners (tokenizers) 17 | brew "flex" 18 | # Tool for building toolchains 19 | brew "crosstool-ng" 20 | # Load/unload environment variables based on $PWD 21 | brew "direnv" 22 | # Pack, ship and run any application as a lightweight container 23 | brew "docker" 24 | # Modern, maintained replacement for ls 25 | brew "eza" 26 | # Command-line fuzzy finder written in Go 27 | brew "fzf" 28 | # GitHub command-line tool 29 | brew "gh" 30 | # Command-line utility for uploading Gists 31 | brew "gist" 32 | # GNU Pretty Good Privacy (PGP) package 33 | brew "gnupg" 34 | # Open source programming language to build simple/reliable/efficient software 35 | brew "go" 36 | # Improved top (interactive process viewer) 37 | brew "htop" 38 | # Client library for huggingface.co hub 39 | brew "huggingface-cli" 40 | # Command-line benchmarking tool 41 | brew "hyperfine" 42 | # Lightweight and flexible command-line JSON processor 43 | brew "jq" 44 | # Minimalist GNU for Windows and GCC cross-compilers 45 | brew "mingw-w64" 46 | # Ambitious Vim-fork focused on extensibility and agility 47 | brew "neovim" 48 | # AI coding agent, built for the terminal 49 | brew "opencode" 50 | # Shell command parallelization utility 51 | brew "parallel" 52 | # Parse HTML at the command-line 53 | brew "pup" 54 | # Search tool like grep and The Silver Searcher 55 | brew "ripgrep" 56 | # Rust toolchain installer 57 | brew "rustup" 58 | # Command-line tool for the Amazon S3 service 59 | brew "s3cmd" 60 | # Terminal multiplexer 61 | brew "tmux" 62 | # Display directories as trees (with optional color/HTML output) 63 | brew "tree" 64 | # Extremely fast Python package installer and resolver, written in Rust 65 | brew "uv" 66 | # Internet file retriever 67 | brew "wget" 68 | # PDF viewer 69 | brew "xpdf" 70 | # Programming language designed for robustness, optimality, and clarity 71 | brew "zig" 72 | # UNIX shell (command interpreter) 73 | brew "zsh" 74 | # aarch64-unknown-linux-gnu Toolchain 75 | brew "leostera/macos-cross-toolchains/aarch64-unknown-linux-gnu" 76 | # aarch64-unknown-linux-musl Toolchain 77 | brew "leostera/macos-cross-toolchains/aarch64-unknown-linux-musl" 78 | # x86_64-unknown-linux-gnu Toolchain 79 | brew "leostera/macos-cross-toolchains/x86_64-unknown-linux-gnu" 80 | # x86_64-unknown-linux-musl Toolchain 81 | brew "leostera/macos-cross-toolchains/x86_64-unknown-linux-musl" 82 | # Incredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one. 83 | brew "oven-sh/bun/bun" 84 | # Command-line tool to remap macOS keyboard keys 85 | brew "rossmacarthur/tap/kb-remap" 86 | # Password manager that keeps all passwords secure behind one password 87 | cask "1password" 88 | # Command-line interface for 1Password 89 | cask "1password-cli" 90 | # Collection of apps and services for photography, design, video, web, and UX 91 | cask "adobe-creative-cloud" 92 | # Chromium based browser 93 | cask "arc" 94 | # Voice and text chat software 95 | cask "discord" 96 | # Set of tools to manage resources and applications hosted on Google Cloud 97 | cask "gcloud-cli" 98 | # Terminal emulator that uses platform-native UI and GPU acceleration 99 | cask "ghostty" 100 | # App to manage software development and track bugs 101 | cask "linear-linear" 102 | # Discover, download, and run local LLMs 103 | cask "lm-studio" 104 | # Reverse proxy, secure introspectable tunnels to localhost 105 | cask "ngrok" 106 | # Open-source software for live streaming and screen recording 107 | cask "obs" 108 | # Replacement for Docker Desktop 109 | cask "orbstack" 110 | # Administration and development platform for PostgreSQL 111 | cask "pgadmin4" 112 | # Move and resize windows using keyboard shortcuts or snap areas 113 | cask "rectangle" 114 | # Music streaming service 115 | cask "spotify" 116 | # Video game digital distribution service 117 | cask "steam" 118 | # Messaging app with a focus on speed and security 119 | cask "telegram" 120 | # Native desktop client for WhatsApp 121 | cask "whatsapp" 122 | -------------------------------------------------------------------------------- /home/.config/nvim/lazy-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "Dockerfile.vim": { "branch": "master", "commit": "2a31e6bcea5977209c05c728c4253d82fd873c82" }, 3 | "Jenkinsfile-vim-syntax": { "branch": "master", "commit": "0d05729168ea44d60862f17cffa80024ab30bcc9" }, 4 | "alloy.vim": { "branch": "master", "commit": "c5d54e3df0a2b9043d2e5322b344896976403367" }, 5 | "applescript.vim": { "branch": "master", "commit": "00840b4059c7884120913907f4778092edb006f7" }, 6 | "catppuccin": { "branch": "main", "commit": "ce4a8e0d5267e67056f9f4dcf6cb1d0933c8ca00" }, 7 | "csv.vim": { "branch": "master", "commit": "78be83fec47de100abfe7cc1c4c26768fc892d7e" }, 8 | "dart-vim-plugin": { "branch": "master", "commit": "4bdc04e2540edf90fda2812434c11d19dc04bc8f" }, 9 | "ebnf.vim": { "branch": "master", "commit": "f3e5ba3fee6a07493afd9c4b805f11fca1c14edd" }, 10 | "fzf": { "branch": "master", "commit": "60a5be1e659515b4974f0155bf64cfa172b2cc0b" }, 11 | "fzf.vim": { "branch": "master", "commit": "879db51d0965515cdaef9b7f6bdeb91c65d2829e" }, 12 | "gleam.vim": { "branch": "main", "commit": "7174886f4974629a4427b0c703d6ce77f39422c5" }, 13 | "goyo.vim": { "branch": "master", "commit": "fa0263d456dd43f5926484d1c4c7022dfcb21ba9" }, 14 | "idris-vim": { "branch": "master", "commit": "091ed6b267749927777423160eeab520109dd9c1" }, 15 | "lalrpop.vim": { "branch": "master", "commit": "7073eec8efdeff37cacd4bca378c28dad02c3c14" }, 16 | "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, 17 | "lightline.vim": { "branch": "master", "commit": "e358557e1a9f9fc860416c8eb2e34c0404078155" }, 18 | "mason-lspconfig.nvim": { "branch": "main", "commit": "7d527c76c43f46294de9c19d39c5a86317809b4b" }, 19 | "mason.nvim": { "branch": "main", "commit": "57e5a8addb8c71fb063ee4acda466c7cf6ad2800" }, 20 | "n3.vim": { "branch": "master", "commit": "e94ef0f815b1594dfdbe16ecfdb8895a30f7d675" }, 21 | "nvim-lspconfig": { "branch": "master", "commit": "07f4e93de92e8d4ea7ab99602e3a8c9ac0fb778a" }, 22 | "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, 23 | "pollen.vim": { "branch": "master", "commit": "2d3ac904d323d11ec81b37bd9a1bcd0818085bb3" }, 24 | "rust-tools.nvim": { "branch": "master", "commit": "676187908a1ce35ffcd727c654ed68d851299d3e" }, 25 | "rust.vim": { "branch": "master", "commit": "889b9a7515db477f4cb6808bef1769e53493c578" }, 26 | "setcolors.vim": { "branch": "master", "commit": "eef7a46d8313c22ba265cdbdfa1892060a33d758" }, 27 | "swift.vim": { "branch": "master", "commit": "75990ecbcaccae5cfb77fb847a7bfa0b925b858d" }, 28 | "tla.vim": { "branch": "master", "commit": "86c88eb269c342f310e3b505ff49550b51ee985b" }, 29 | "typescript-vim": { "branch": "master", "commit": "4740441db1e070ef8366c888c658000dd032e4cb" }, 30 | "vim-astro": { "branch": "main", "commit": "9b4674ecfe1dd84b5fb9b4de1653975de6e8e2e1" }, 31 | "vim-coffee-script": { "branch": "master", "commit": "28421258a8dde5a50deafbfc19cd9873cacfaa79" }, 32 | "vim-colorschemes": { "branch": "master", "commit": "fd8f122cef604330c96a6a6e434682dbdfb878c9" }, 33 | "vim-commentary": { "branch": "master", "commit": "64a654ef4a20db1727938338310209b6a63f60c9" }, 34 | "vim-elixir": { "branch": "master", "commit": "6dff29176eb35e025bc94b262bf6d4e517e11f7d" }, 35 | "vim-flutter": { "branch": "master", "commit": "2c528672b0b8a21875689389bc3eb22678e8d983" }, 36 | "vim-fugitive": { "branch": "master", "commit": "61b51c09b7c9ce04e821f6cf76ea4f6f903e3cf4" }, 37 | "vim-gitgutter": { "branch": "main", "commit": "23f4fa532b1edcca87ec62d060f8ea39b02e363a" }, 38 | "vim-glsl": { "branch": "master", "commit": "40dd0b143ef93f3930a8a409f60c1bb85e28b727" }, 39 | "vim-graphql": { "branch": "master", "commit": "b8580b970722b48580add3b9fd9e13a6a2f0f4f0" }, 40 | "vim-javascript": { "branch": "master", "commit": "b26c9edb3563e02f5c0b20580f7cf9743e95b157" }, 41 | "vim-jsx": { "branch": "master", "commit": "8879e0d9c5ba0e04ecbede1c89f63b7a0efa24af" }, 42 | "vim-markdown": { "branch": "master", "commit": "f9f845f28f4da33a7655accb22f4ad21f7d9fb66" }, 43 | "vim-nix": { "branch": "master", "commit": "7235c7ce2cea530cb6b59bc3e46d4bfe917d15c8" }, 44 | "vim-racket": { "branch": "master", "commit": "2c7ec0f35a2ad1ca00305e5d67837bc1f1d4b6cc" }, 45 | "vim-rescript": { "branch": "master", "commit": "aea571554254ab9da4f997b20d2ebca2fd099c52" }, 46 | "vim-scala": { "branch": "master", "commit": "7657218f14837395a4e6759f15289bad6febd1b4" }, 47 | "vim-sparql": { "branch": "master", "commit": "e00990bc7c3fa5a8aa7187884c9c3243a866c187" }, 48 | "vim-surround": { "branch": "master", "commit": "3d188ed2113431cf8dac77be61b842acb64433d9" }, 49 | "vim-terraform": { "branch": "master", "commit": "520498fab16a3a11f2ae1b8cb65e0a1684bc317a" }, 50 | "vim-toml": { "branch": "main", "commit": "1b63257680eeb65677eb1ca5077809a982756d58" }, 51 | "vim-wasm": { "branch": "master", "commit": "8ee107a8c2034ef2b195fc82214ed2b4530a99b6" }, 52 | "vimtex": { "branch": "master", "commit": "32bcb3922c20588e00de68f73c86312eda2141ad" } 53 | } 54 | -------------------------------------------------------------------------------- /home/.config/nvim/lua/config/plugins.lua: -------------------------------------------------------------------------------- 1 | return { 2 | -- Comments 3 | { "tpope/vim-commentary" }, 4 | 5 | -- FZF fuzzy finder 6 | { 7 | "junegunn/fzf", 8 | build = "./install --all", 9 | }, 10 | { "junegunn/fzf.vim" }, 11 | 12 | -- Status line 13 | { "itchyny/lightline.vim" }, 14 | 15 | -- Zen mode 16 | { "junegunn/goyo.vim" }, 17 | 18 | -- Git integration 19 | { "tpope/vim-fugitive" }, 20 | { "airblade/vim-gitgutter" }, 21 | 22 | -- Editing enhancements 23 | { "tpope/vim-surround" }, 24 | 25 | -- LSP Configuration 26 | { 27 | "neovim/nvim-lspconfig", 28 | dependencies = { 29 | "williamboman/mason.nvim", 30 | "williamboman/mason-lspconfig.nvim", 31 | }, 32 | config = function() 33 | require("config.lsp") 34 | end, 35 | }, 36 | 37 | -- Mason for LSP server management 38 | { 39 | "williamboman/mason.nvim", 40 | config = function() 41 | require("mason").setup() 42 | end, 43 | }, 44 | 45 | { 46 | "williamboman/mason-lspconfig.nvim", 47 | config = function() 48 | require("mason-lspconfig").setup({ 49 | ensure_installed = { 50 | "rust_analyzer", 51 | "lua_ls", 52 | "elixirls", 53 | "denols", 54 | "zls", 55 | }, 56 | automatic_installation = true, 57 | }) 58 | end, 59 | }, 60 | 61 | -- Rust tools 62 | { 63 | "simrat39/rust-tools.nvim", 64 | ft = "rust", 65 | config = function() 66 | require("rust-tools").setup({ 67 | tools = { 68 | autoSetHints = true, 69 | hover_with_actions = true, 70 | inlay_hints = { 71 | show_parameter_hints = false, 72 | parameter_hints_prefix = "", 73 | other_hints_prefix = "", 74 | }, 75 | }, 76 | server = { 77 | settings = { 78 | ["rust-analyzer"] = { 79 | checkOnSave = { 80 | command = "clippy", 81 | }, 82 | }, 83 | }, 84 | }, 85 | }) 86 | end, 87 | }, 88 | 89 | -- Treesitter for syntax highlighting 90 | { 91 | "nvim-treesitter/nvim-treesitter", 92 | build = ":TSUpdate", 93 | config = function() 94 | require("nvim-treesitter.configs").setup({ 95 | ensure_installed = { 96 | "lua", 97 | "vim", 98 | "vimdoc", 99 | "rust", 100 | "elixir", 101 | "erlang", 102 | "ocaml", 103 | "ocaml_interface", 104 | "typescript", 105 | "javascript", 106 | "html", 107 | "css", 108 | "json", 109 | "yaml", 110 | "toml", 111 | "markdown", 112 | "bash", 113 | }, 114 | highlight = { enable = true }, 115 | indent = { enable = true }, 116 | auto_install = true, 117 | }) 118 | end, 119 | }, 120 | 121 | -- Language support plugins 122 | { "vim-scripts/applescript.vim", ft = "applescript" }, 123 | { "ekalinin/Dockerfile.vim", ft = "dockerfile" }, 124 | { "keith/swift.vim", ft = "swift" }, 125 | { "tpope/vim-markdown", ft = "markdown" }, 126 | { "wuelnerdotexe/vim-astro", ft = "astro" }, 127 | { "rust-lang/rust.vim", ft = "rust" }, 128 | { "qnighy/lalrpop.vim", ft = "lalrpop" }, 129 | { "wlangstroth/vim-racket", ft = "racket" }, 130 | { "fasiha/pollen.vim", ft = "pollen" }, 131 | { "mxw/vim-jsx", ft = { "javascript", "javascriptreact" } }, 132 | { "pangloss/vim-javascript", ft = "javascript" }, 133 | { "leafgarland/typescript-vim", ft = "typescript" }, 134 | { "kchmck/vim-coffee-script", ft = "coffee" }, 135 | { "elixir-editors/vim-elixir", ft = "elixir" }, 136 | { "idris-hackers/idris-vim", ft = "idris" }, 137 | { "derekwyatt/vim-scala", ft = "scala" }, 138 | { "jparise/vim-graphql", ft = "graphql" }, 139 | { "cespare/vim-toml", ft = "toml" }, 140 | { "hwayne/tla.vim", ft = "tla" }, 141 | { "rhysd/vim-wasm", ft = "wasm" }, 142 | { "hashivim/vim-terraform", ft = "terraform" }, 143 | { "martinda/Jenkinsfile-vim-syntax", ft = "Jenkinsfile" }, 144 | { "lervag/vimtex", ft = "tex" }, 145 | { "LnL7/vim-nix", ft = "nix" }, 146 | { "vim-scripts/n3.vim", ft = "n3" }, 147 | { "whybin/alloy.vim", ft = "alloy" }, 148 | { "vim-scripts/ebnf.vim", ft = "ebnf" }, 149 | { "dart-lang/dart-vim-plugin", ft = "dart" }, 150 | { "thosakwe/vim-flutter", ft = "dart" }, 151 | { "chrisbra/csv.vim", ft = "csv" }, 152 | { "rvesse/vim-sparql", ft = "sparql" }, 153 | { "tikhomirov/vim-glsl", ft = "glsl" }, 154 | { "rescript-lang/vim-rescript", ft = "rescript" }, 155 | { "gleam-lang/gleam.vim", ft = "gleam" }, 156 | 157 | -- Colorschemes 158 | { "flazz/vim-colorschemes" }, 159 | { "felixhummel/setcolors.vim" }, 160 | { 161 | "catppuccin/nvim", 162 | name = "catppuccin", 163 | priority = 1000, 164 | config = function() 165 | require("catppuccin").setup({ 166 | flavour = "mocha", -- latte, frappe, macchiato, mocha 167 | }) 168 | vim.cmd("colorscheme catppuccin") 169 | end, 170 | }, 171 | } 172 | -------------------------------------------------------------------------------- /home/.config/zsh/completions/_tusk: -------------------------------------------------------------------------------- 1 | #compdef tusk 2 | 3 | _tusk() { 4 | local -a builtin_commands package_commands all_commands 5 | 6 | builtin_commands=( 7 | 'build:Build packages' 8 | 'run:Run a binary' 9 | 'test:Run tests' 10 | 'bench:Run benchmarks' 11 | 'clean:Clean build artifacts' 12 | 'install:Install dependencies' 13 | 'new:Create new package' 14 | 'server:Manage tusk server' 15 | 'rpc:Send RPC commands' 16 | 'mcp:MCP server commands' 17 | 'completions:Generate shell completions' 18 | 'doc:Generate documentation' 19 | 'lsp:Start LSP server' 20 | 'version:Show version' 21 | ) 22 | 23 | # Load package commands dynamically (format: "package:command\tdescription") 24 | local -a raw_lines package_commands package_descs 25 | raw_lines=(${(f)"$(tusk completions --commands 2>/dev/null)"}) 26 | 27 | # Parse tab-separated name and description 28 | package_commands=() 29 | package_descs=() 30 | for line in $raw_lines; do 31 | local name="${line%%$'\t'*}" 32 | local desc="${line#*$'\t'}" 33 | package_commands+=("$name") 34 | package_descs+=("$desc") 35 | done 36 | 37 | local context state state_descr line 38 | typeset -A opt_args 39 | 40 | # Check if we've passed -- separator, if so use default file completion 41 | local i 42 | for i in {2..$CURRENT}; do 43 | if [[ "${words[$i]}" == "--" ]]; then 44 | _files 45 | return 0 46 | fi 47 | done 48 | 49 | # If we're completing the first argument (the command), show all commands 50 | if [[ $CURRENT -eq 2 ]]; then 51 | # Combine builtin and package commands for _describe 52 | local -a all_commands_with_descs 53 | all_commands_with_descs=($builtin_commands) 54 | 55 | # Add package commands in "name:description" format 56 | for i in {1..${#package_commands[@]}}; do 57 | # Escape colons in the command name for _describe 58 | local escaped_name="${package_commands[$i]//:/\\:}" 59 | all_commands_with_descs+=("$escaped_name:${package_descs[$i]}") 60 | done 61 | 62 | # Show all commands with descriptions, sorted by _describe 63 | _describe -t commands 'command' all_commands_with_descs 64 | return 0 65 | fi 66 | 67 | case "$words[2]" in 68 | run) 69 | # Check if we're completing the binary name (position 3) 70 | if [[ $CURRENT -eq 3 ]]; then 71 | local -a binaries 72 | binaries=(${(f)"$(tusk completions --binaries 2>/dev/null)"}) 73 | compadd -a binaries 74 | fi 75 | ;; 76 | build) 77 | # Check if we're completing the package name (position 3) 78 | if [[ $CURRENT -eq 3 ]]; then 79 | local -a packages 80 | packages=(${(f)"$(tusk completions --packages 2>/dev/null)"}) 81 | compadd -a packages 82 | fi 83 | ;; 84 | test) 85 | # Check if we're completing the test pattern (position 3) 86 | if [[ $CURRENT -eq 3 ]]; then 87 | local -a tests 88 | tests=(${(f)"$(tusk completions --tests 2>/dev/null)"}) 89 | compadd -a tests 90 | else 91 | _arguments \ 92 | '(-p --package)'{-p,--package}'[Run tests from package]:package:->packages' \ 93 | '(-v --verbose)'{-v,--verbose}'[Verbose output]' 94 | 95 | case $state in 96 | packages) 97 | local -a packages 98 | packages=(${(f)"$(tusk completions --packages 2>/dev/null)"}) 99 | _describe 'package' packages 100 | ;; 101 | esac 102 | fi 103 | ;; 104 | bench) 105 | # Check if we're completing the benchmark pattern (position 3) 106 | if [[ $CURRENT -eq 3 ]]; then 107 | local -a benches 108 | benches=(${(f)"$(tusk completions --benchmarks 2>/dev/null)"}) 109 | compadd -a benches 110 | else 111 | _arguments \ 112 | '(-p --package)'{-p,--package}'[Run benchmarks from package]:package:->packages' \ 113 | '(-v --verbose)'{-v,--verbose}'[Verbose output]' 114 | 115 | case $state in 116 | packages) 117 | local -a packages 118 | packages=(${(f)"$(tusk completions --packages 2>/dev/null)"}) 119 | _describe 'package' packages 120 | ;; 121 | esac 122 | fi 123 | ;; 124 | completions) 125 | _arguments \ 126 | '--shell[Shell type]:shell:(bash zsh fish)' \ 127 | '--packages[List packages]' \ 128 | '--binaries[List binaries]' \ 129 | '--tests[List tests]' \ 130 | '--benchmarks[List benchmarks]' \ 131 | '--commands[List commands]' 132 | ;; 133 | clean|install|new|server|rpc|mcp|doc|lsp|version) 134 | # These commands have their own completion logic 135 | # Can be extended later 136 | ;; 137 | *:*) 138 | # Package command (format: package:command) 139 | # Just complete files - users can use --help to learn about options 140 | _files 141 | ;; 142 | *) 143 | _describe 'command' all_commands 144 | ;; 145 | esac 146 | } 147 | 148 | _tusk "$@" 149 | -------------------------------------------------------------------------------- /AGENTS.md: -------------------------------------------------------------------------------- 1 | # AGENTS.md 2 | 3 | > Context file for AI agents working with this dotfiles repository 4 | 5 | ## Repository Overview 6 | 7 | This is a **minimal, no-nonsense dotfiles setup** for macOS that follows these principles: 8 | 1. Symlink config files to the right places 9 | 2. Use `brew bundle` to install applications 10 | 3. Keep it simple - no complex frameworks 11 | 12 | **Install location**: `~/Developer/github.com/leostera/dotfiles` 13 | 14 | ## Repository Structure 15 | 16 | ``` 17 | dotfiles/ 18 | ├── home/ # Files to symlink to $HOME 19 | │ ├── .bin/ # Custom scripts (symlinked to ~/.bin) 20 | │ └── .config/ # XDG config files (symlinked to ~/.config) 21 | │ ├── direnv/ # direnv configuration 22 | │ ├── ghostty/ # Terminal emulator config 23 | │ ├── git/ # Git config (not ~/.gitconfig!) 24 | │ ├── nvim/ # Neovim configuration (Lua-based) 25 | │ ├── ssh/ # SSH config 26 | │ ├── tmux/ # Tmux configuration 27 | │ └── zsh/ # Zsh shell configuration 28 | ├── obs/ # OBS streaming configs 29 | ├── tools/ # Setup and utility scripts 30 | ├── bootstrap.sh # Main installation script 31 | ├── Brewfile # Homebrew packages/casks 32 | └── remote-install.sh # Remote curl-install script 33 | ``` 34 | 35 | ## Key Files & Their Purpose 36 | 37 | ### Installation Scripts 38 | 39 | - **`bootstrap.sh`**: Main setup - installs Homebrew, runs `brew bundle`, symlinks configs 40 | - **`tools/symlink`**: Symlinks all config files from `home/` to `$HOME` 41 | - **`remote-install.sh`**: Downloads and bootstraps dotfiles from GitHub 42 | 43 | ### Configuration Files 44 | 45 | #### Neovim (`home/.config/nvim/`) 46 | - **Fully Lua-based** modern Neovim config (migrated from VimScript) 47 | - **Plugin Manager**: lazy.nvim (auto-installs on first boot) 48 | - **LSP Manager**: Mason (auto-installs language servers) 49 | - **Structure**: 50 | - `init.lua` - Entry point with lazy.nvim bootstrap 51 | - `lua/config/options.lua` - Vim settings 52 | - `lua/config/keymaps.lua` - Key mappings 53 | - `lua/config/plugins.lua` - Plugin specifications 54 | - `lua/config/lsp.lua` - LSP server configurations 55 | - `ftdetect/lore.vim` - Custom filetype detection 56 | - `syntax/lore.vim` - Custom syntax highlighting 57 | 58 | **Leader key**: `,` (comma) 59 | **Key mappings**: 60 | - `,` → FZF 61 | - `` → Files 62 | - `,f` → Ripgrep search 63 | - `,b` → Buffers 64 | 65 | **LSP servers** (auto-installed via Mason): 66 | - `rust_analyzer` - Rust 67 | - `lua_ls` - Lua 68 | - `elixirls` - Elixir 69 | - `denols` - TypeScript/JavaScript 70 | - `zls` - Zig 71 | 72 | #### Zsh (`home/.config/zsh/`) 73 | - Split into modular files: `alias`, `env`, `path`, `prompt`, `zshrc` 74 | - **Important**: `~/.zshrc` is symlinked to `~/.config/zsh/zshrc` 75 | 76 | **Key aliases**: 77 | - `dotfiles` → `pushd ~/Developer/github.com/leostera/dotfiles` 78 | - `repo()` → Clone and cd into GitHub repos 79 | - `vim` / `v` → `nvim` 80 | - `nvimrc` → Edit nvim config 81 | - `gitconf` → Edit git config 82 | - `reload` → Reload zsh config 83 | 84 | #### Git (`home/.config/git/`) 85 | - **Location**: `~/.config/git/config` (NOT `~/.gitconfig`) 86 | - Uses 1Password for SSH signing 87 | - GPG format: SSH 88 | - Many useful aliases (see file for full list) 89 | 90 | #### Custom Scripts (`home/.bin/`) 91 | Small utility scripts for git workflows: 92 | - `github-clone` - Clone GitHub repos to `~/Developer/github.com/` 93 | - `fixup`, `squash` - Git workflow helpers 94 | - `git-dirty` - Check if repo has uncommitted changes 95 | - `co` - Interactive branch checkout with fzf 96 | 97 | ### Package Management 98 | 99 | **`Brewfile`**: Contains all Homebrew packages and casks 100 | - CLI tools: bat, fzf, ripgrep, neovim, tmux, etc. 101 | - Apps: 1Password, Arc, Ghostty, Discord, OBS, etc. 102 | 103 | ## Workflow & Development Patterns 104 | 105 | ### Directory Structure Convention 106 | GitHub repos are cloned to: `~/Developer/github.com/{owner}/{repo}` 107 | - Enforced by `github-clone` script 108 | - Used by `repo()` function in zsh aliases 109 | 110 | ### Key Customizations 111 | 1. **Custom filetype**: `.lore` files (syntax highlighting defined) 112 | 2. **Custom syntax**: `.caramel` → Rust syntax, `.core` → Erlang syntax 113 | 3. **Leader key**: Changed from default to `,` 114 | 4. **Terminal**: Using Ghostty (replaced Kitty) 115 | 116 | ## Making Changes 117 | 118 | ### Adding a New Package 119 | 1. Add to `Brewfile` 120 | 2. Run `brew bundle` from dotfiles directory 121 | 122 | ### Modifying Neovim Config 123 | - Edit files in `home/.config/nvim/lua/config/` 124 | - lazy.nvim auto-manages plugins 125 | - Mason auto-installs LSP servers 126 | 127 | ### Adding Zsh Aliases 128 | - Edit `home/.config/zsh/alias` 129 | - Run `reload` to apply changes 130 | 131 | ### Symlink New Config 132 | 1. Add file/directory to `home/.config/` 133 | 2. Optionally update `tools/symlink` if special handling needed 134 | 3. Run `./tools/symlink` 135 | 136 | ## Important Notes for AI Agents 137 | 138 | 1. **Never create `~/.vimrc` or `~/.vim/`** - This repo uses Neovim with Lua config only 139 | 2. **Git config is XDG-compliant** - It's at `~/.config/git/config`, not `~/.gitconfig` 140 | 3. **Hardcoded paths are intentional** - The `~/Developer/github.com/` structure is by design 141 | 4. **Leader key is `,`** - Not space, not backslash 142 | 5. **Minimal philosophy** - Don't add complex frameworks or over-engineer solutions 143 | 6. **Auto-install everything** - Neovim plugins and LSP servers install on first boot 144 | 7. **No nix for now** - README mentions nix but it's not actively used (ignore nixpkgs dir) 145 | 146 | ## Bootstrap Process 147 | 148 | 1. Clone/download to `~/Developer/github.com/leostera/dotfiles` 149 | 2. Run `./bootstrap.sh`: 150 | - Installs Homebrew (if needed) 151 | - Runs `brew bundle` 152 | - Runs `kb-remap` (keyboard remapping) 153 | - Runs `./tools/symlink` 154 | - Launches new zsh shell 155 | - Runs `./tools/setup-upstream` 156 | 3. First `nvim` run: 157 | - Installs lazy.nvim 158 | - Installs all plugins 159 | - Mason installs LSP servers 160 | 161 | ## Common Tasks 162 | 163 | **Update all packages**: `brew bundle` (in dotfiles dir) 164 | **Update nvim plugins**: Open nvim, run `:Lazy update` 165 | **Update LSP servers**: Open nvim, run `:Mason` 166 | **Reload shell config**: `reload` (alias) 167 | **Edit nvim config**: `nvimrc` (alias) 168 | **Jump to dotfiles**: `dotfiles` (alias) 169 | -------------------------------------------------------------------------------- /obs/scenes.json: -------------------------------------------------------------------------------- 1 | { 2 | "AuxAudioDevice1": { 3 | "prev_ver": 503316482, 4 | "name": "Keyboard", 5 | "uuid": "88c3839a-d2fe-4e5e-a41a-b1ecf09ed07c", 6 | "id": "coreaudio_input_capture", 7 | "versioned_id": "coreaudio_input_capture", 8 | "settings": { 9 | "device_id": "AppleUSBAudioEngine:Apogee Electronics Corp:Duet 3:1100000:1,2" 10 | }, 11 | "mixers": 255, 12 | "sync": 0, 13 | "flags": 0, 14 | "volume": 1.0, 15 | "balance": 0.5, 16 | "enabled": true, 17 | "muted": true, 18 | "push-to-mute": false, 19 | "push-to-mute-delay": 0, 20 | "push-to-talk": false, 21 | "push-to-talk-delay": 0, 22 | "hotkeys": { 23 | "libobs.mute": [], 24 | "libobs.unmute": [], 25 | "libobs.push-to-mute": [], 26 | "libobs.push-to-talk": [] 27 | }, 28 | "deinterlace_mode": 0, 29 | "deinterlace_field_order": 0, 30 | "monitoring_type": 0, 31 | "private_settings": { 32 | "mixer_hidden": true 33 | } 34 | }, 35 | "current_scene": "coding", 36 | "current_program_scene": "coding", 37 | "scene_order": [ 38 | { 39 | "name": "Intro" 40 | }, 41 | { 42 | "name": "coming back" 43 | }, 44 | { 45 | "name": "cam-only" 46 | }, 47 | { 48 | "name": "coding" 49 | } 50 | ], 51 | "name": "Untitled", 52 | "groups": [], 53 | "quick_transitions": [ 54 | { 55 | "name": "Cut", 56 | "duration": 300, 57 | "hotkeys": [], 58 | "id": 1, 59 | "fade_to_black": false 60 | }, 61 | { 62 | "name": "Fade", 63 | "duration": 300, 64 | "hotkeys": [], 65 | "id": 2, 66 | "fade_to_black": false 67 | }, 68 | { 69 | "name": "Fade", 70 | "duration": 300, 71 | "hotkeys": [], 72 | "id": 3, 73 | "fade_to_black": true 74 | } 75 | ], 76 | "transitions": [], 77 | "saved_projectors": [], 78 | "current_transition": "Fade", 79 | "transition_duration": 300, 80 | "preview_locked": false, 81 | "scaling_enabled": false, 82 | "scaling_level": 0, 83 | "scaling_off_x": 0.0, 84 | "scaling_off_y": 0.0, 85 | "virtual-camera": { 86 | "type2": 3 87 | }, 88 | "modules": { 89 | "scripts-tool": [], 90 | "output-timer": { 91 | "streamTimerHours": 0, 92 | "streamTimerMinutes": 0, 93 | "streamTimerSeconds": 30, 94 | "recordTimerHours": 0, 95 | "recordTimerMinutes": 0, 96 | "recordTimerSeconds": 30, 97 | "autoStartStreamTimer": false, 98 | "autoStartRecordTimer": false, 99 | "pauseRecordTimer": true 100 | }, 101 | "auto-scene-switcher": { 102 | "interval": 300, 103 | "non_matching_scene": "", 104 | "switch_if_not_matching": false, 105 | "active": false, 106 | "switches": [] 107 | } 108 | }, 109 | "sources": [ 110 | { 111 | "prev_ver": 503316482, 112 | "name": "cam-only", 113 | "uuid": "eba5ffd2-94dd-4ff0-9cda-02b8f9d8b405", 114 | "id": "scene", 115 | "versioned_id": "scene", 116 | "settings": { 117 | "custom_size": false, 118 | "id_counter": 2, 119 | "items": [ 120 | { 121 | "name": "zv-e10", 122 | "source_uuid": "cfee3bd9-fee7-4c7a-b2a1-e0953679d929", 123 | "visible": true, 124 | "locked": false, 125 | "rot": 0.0, 126 | "pos": { 127 | "x": 73.0, 128 | "y": 173.0 129 | }, 130 | "scale": { 131 | "x": 1.0, 132 | "y": 1.0 133 | }, 134 | "align": 5, 135 | "bounds_type": 0, 136 | "bounds_align": 0, 137 | "bounds": { 138 | "x": 0.0, 139 | "y": 0.0 140 | }, 141 | "crop_left": 0, 142 | "crop_top": 0, 143 | "crop_right": 0, 144 | "crop_bottom": 0, 145 | "id": 2, 146 | "group_item_backup": false, 147 | "scale_filter": "disable", 148 | "blend_method": "default", 149 | "blend_type": "normal", 150 | "show_transition": { 151 | "duration": 0 152 | }, 153 | "hide_transition": { 154 | "duration": 0 155 | }, 156 | "private_settings": {} 157 | } 158 | ] 159 | }, 160 | "mixers": 0, 161 | "sync": 0, 162 | "flags": 0, 163 | "volume": 1.0, 164 | "balance": 0.5, 165 | "enabled": true, 166 | "muted": false, 167 | "push-to-mute": false, 168 | "push-to-mute-delay": 0, 169 | "push-to-talk": false, 170 | "push-to-talk-delay": 0, 171 | "hotkeys": { 172 | "OBSBasic.SelectScene": [], 173 | "libobs.show_scene_item.2": [], 174 | "libobs.hide_scene_item.2": [] 175 | }, 176 | "deinterlace_mode": 0, 177 | "deinterlace_field_order": 0, 178 | "monitoring_type": 0, 179 | "private_settings": {} 180 | }, 181 | { 182 | "prev_ver": 503316482, 183 | "name": "coding", 184 | "uuid": "4f8ea2d1-bf88-4da0-88e7-ce2fe3d62e30", 185 | "id": "scene", 186 | "versioned_id": "scene", 187 | "settings": { 188 | "custom_size": false, 189 | "id_counter": 12, 190 | "items": [ 191 | { 192 | "name": "main-screen", 193 | "source_uuid": "ea02bb68-5d43-4a74-833b-7754de07a167", 194 | "visible": true, 195 | "locked": true, 196 | "rot": 0.0, 197 | "pos": { 198 | "x": 0.0, 199 | "y": -68.0 200 | }, 201 | "scale": { 202 | "x": 1.0, 203 | "y": 1.0 204 | }, 205 | "align": 5, 206 | "bounds_type": 2, 207 | "bounds_align": 0, 208 | "bounds": { 209 | "x": 1728.0, 210 | "y": 1173.0 211 | }, 212 | "crop_left": 0, 213 | "crop_top": 0, 214 | "crop_right": 0, 215 | "crop_bottom": 0, 216 | "id": 1, 217 | "group_item_backup": false, 218 | "scale_filter": "disable", 219 | "blend_method": "default", 220 | "blend_type": "normal", 221 | "show_transition": { 222 | "duration": 0 223 | }, 224 | "hide_transition": { 225 | "duration": 0 226 | }, 227 | "private_settings": {} 228 | }, 229 | { 230 | "name": "zv-e10", 231 | "source_uuid": "cfee3bd9-fee7-4c7a-b2a1-e0953679d929", 232 | "visible": true, 233 | "locked": true, 234 | "rot": 0.0, 235 | "pos": { 236 | "x": 1337.0, 237 | "y": 752.0 238 | }, 239 | "scale": { 240 | "x": 0.45546874403953552, 241 | "y": 0.45555555820465088 242 | }, 243 | "align": 5, 244 | "bounds_type": 0, 245 | "bounds_align": 0, 246 | "bounds": { 247 | "x": 0.0, 248 | "y": 0.0 249 | }, 250 | "crop_left": 0, 251 | "crop_top": 0, 252 | "crop_right": 0, 253 | "crop_bottom": 0, 254 | "id": 3, 255 | "group_item_backup": false, 256 | "scale_filter": "disable", 257 | "blend_method": "default", 258 | "blend_type": "normal", 259 | "show_transition": { 260 | "duration": 0 261 | }, 262 | "hide_transition": { 263 | "duration": 0 264 | }, 265 | "private_settings": {} 266 | }, 267 | { 268 | "name": "Coding Overlay", 269 | "source_uuid": "4dc26fa2-778b-4695-97d8-b6b19bbbfd03", 270 | "visible": true, 271 | "locked": true, 272 | "rot": 0.0, 273 | "pos": { 274 | "x": 0.0, 275 | "y": 0.0 276 | }, 277 | "scale": { 278 | "x": 1.0, 279 | "y": 1.0 280 | }, 281 | "align": 5, 282 | "bounds_type": 0, 283 | "bounds_align": 0, 284 | "bounds": { 285 | "x": 0.0, 286 | "y": 0.0 287 | }, 288 | "crop_left": 0, 289 | "crop_top": 0, 290 | "crop_right": 0, 291 | "crop_bottom": 0, 292 | "id": 4, 293 | "group_item_backup": false, 294 | "scale_filter": "disable", 295 | "blend_method": "default", 296 | "blend_type": "normal", 297 | "show_transition": { 298 | "duration": 0 299 | }, 300 | "hide_transition": { 301 | "duration": 0 302 | }, 303 | "private_settings": {} 304 | }, 305 | { 306 | "name": "Duet", 307 | "source_uuid": "88242e78-5b96-48de-a9eb-49bfc767e2c4", 308 | "visible": true, 309 | "locked": false, 310 | "rot": 0.0, 311 | "pos": { 312 | "x": 0.0, 313 | "y": 0.0 314 | }, 315 | "scale": { 316 | "x": 1.0, 317 | "y": 1.0 318 | }, 319 | "align": 5, 320 | "bounds_type": 0, 321 | "bounds_align": 0, 322 | "bounds": { 323 | "x": 0.0, 324 | "y": 0.0 325 | }, 326 | "crop_left": 0, 327 | "crop_top": 0, 328 | "crop_right": 0, 329 | "crop_bottom": 0, 330 | "id": 5, 331 | "group_item_backup": false, 332 | "scale_filter": "disable", 333 | "blend_method": "default", 334 | "blend_type": "normal", 335 | "show_transition": { 336 | "duration": 0 337 | }, 338 | "hide_transition": { 339 | "duration": 0 340 | }, 341 | "private_settings": {} 342 | }, 343 | { 344 | "name": "Spotify", 345 | "source_uuid": "56d9152c-2117-4761-b480-d11ed613f684", 346 | "visible": true, 347 | "locked": false, 348 | "rot": 0.0, 349 | "pos": { 350 | "x": 0.0, 351 | "y": 0.0 352 | }, 353 | "scale": { 354 | "x": 1.0, 355 | "y": 1.0 356 | }, 357 | "align": 5, 358 | "bounds_type": 0, 359 | "bounds_align": 0, 360 | "bounds": { 361 | "x": 0.0, 362 | "y": 0.0 363 | }, 364 | "crop_left": 0, 365 | "crop_top": 0, 366 | "crop_right": 0, 367 | "crop_bottom": 0, 368 | "id": 7, 369 | "group_item_backup": false, 370 | "scale_filter": "disable", 371 | "blend_method": "default", 372 | "blend_type": "normal", 373 | "show_transition": { 374 | "duration": 0 375 | }, 376 | "hide_transition": { 377 | "duration": 0 378 | }, 379 | "private_settings": {} 380 | }, 381 | { 382 | "name": "Follower Goal Overlay", 383 | "source_uuid": "685ca614-686f-4bf9-90ce-751a602fe436", 384 | "visible": true, 385 | "locked": false, 386 | "rot": 0.0, 387 | "pos": { 388 | "x": 1597.0, 389 | "y": 15.0 390 | }, 391 | "scale": { 392 | "x": 0.20472973585128784, 393 | "y": 0.20624999701976776 394 | }, 395 | "align": 5, 396 | "bounds_type": 0, 397 | "bounds_align": 0, 398 | "bounds": { 399 | "x": 0.0, 400 | "y": 0.0 401 | }, 402 | "crop_left": 0, 403 | "crop_top": 0, 404 | "crop_right": 0, 405 | "crop_bottom": 0, 406 | "id": 9, 407 | "group_item_backup": false, 408 | "scale_filter": "disable", 409 | "blend_method": "default", 410 | "blend_type": "normal", 411 | "show_transition": { 412 | "duration": 0 413 | }, 414 | "hide_transition": { 415 | "duration": 0 416 | }, 417 | "private_settings": {} 418 | }, 419 | { 420 | "name": "Now Playing", 421 | "source_uuid": "78f37af3-42b0-4b76-82d3-6acf84be74c1", 422 | "visible": true, 423 | "locked": false, 424 | "rot": 0.0, 425 | "pos": { 426 | "x": 1645.0, 427 | "y": -49.0 428 | }, 429 | "scale": { 430 | "x": 0.44499999284744263, 431 | "y": 0.44499999284744263 432 | }, 433 | "align": 5, 434 | "bounds_type": 0, 435 | "bounds_align": 0, 436 | "bounds": { 437 | "x": 0.0, 438 | "y": 0.0 439 | }, 440 | "crop_left": 0, 441 | "crop_top": 0, 442 | "crop_right": 0, 443 | "crop_bottom": 0, 444 | "id": 10, 445 | "group_item_backup": false, 446 | "scale_filter": "disable", 447 | "blend_method": "default", 448 | "blend_type": "normal", 449 | "show_transition": { 450 | "duration": 0 451 | }, 452 | "hide_transition": { 453 | "duration": 0 454 | }, 455 | "private_settings": {} 456 | }, 457 | { 458 | "name": "Current Poll", 459 | "source_uuid": "39d7bfd0-3ffb-4134-93aa-f860b4063927", 460 | "visible": false, 461 | "locked": false, 462 | "rot": 0.0, 463 | "pos": { 464 | "x": 1440.0, 465 | "y": 599.0 466 | }, 467 | "scale": { 468 | "x": 0.60000002384185791, 469 | "y": 0.60000002384185791 470 | }, 471 | "align": 5, 472 | "bounds_type": 0, 473 | "bounds_align": 0, 474 | "bounds": { 475 | "x": 0.0, 476 | "y": 0.0 477 | }, 478 | "crop_left": 0, 479 | "crop_top": 0, 480 | "crop_right": 0, 481 | "crop_bottom": 0, 482 | "id": 11, 483 | "group_item_backup": false, 484 | "scale_filter": "disable", 485 | "blend_method": "default", 486 | "blend_type": "normal", 487 | "show_transition": { 488 | "duration": 0 489 | }, 490 | "hide_transition": { 491 | "duration": 0 492 | }, 493 | "private_settings": {} 494 | }, 495 | { 496 | "name": "System", 497 | "source_uuid": "88445db0-648f-42ce-a212-6807f941aadd", 498 | "visible": true, 499 | "locked": false, 500 | "rot": 0.0, 501 | "pos": { 502 | "x": 0.0, 503 | "y": 0.0 504 | }, 505 | "scale": { 506 | "x": 1.0, 507 | "y": 1.0 508 | }, 509 | "align": 5, 510 | "bounds_type": 0, 511 | "bounds_align": 0, 512 | "bounds": { 513 | "x": 0.0, 514 | "y": 0.0 515 | }, 516 | "crop_left": 0, 517 | "crop_top": 0, 518 | "crop_right": 0, 519 | "crop_bottom": 0, 520 | "id": 12, 521 | "group_item_backup": false, 522 | "scale_filter": "disable", 523 | "blend_method": "default", 524 | "blend_type": "normal", 525 | "show_transition": { 526 | "duration": 0 527 | }, 528 | "hide_transition": { 529 | "duration": 0 530 | }, 531 | "private_settings": {} 532 | } 533 | ] 534 | }, 535 | "mixers": 0, 536 | "sync": 0, 537 | "flags": 0, 538 | "volume": 1.0, 539 | "balance": 0.5, 540 | "enabled": true, 541 | "muted": false, 542 | "push-to-mute": false, 543 | "push-to-mute-delay": 0, 544 | "push-to-talk": false, 545 | "push-to-talk-delay": 0, 546 | "hotkeys": { 547 | "OBSBasic.SelectScene": [], 548 | "libobs.show_scene_item.1": [], 549 | "libobs.hide_scene_item.1": [], 550 | "libobs.show_scene_item.3": [], 551 | "libobs.hide_scene_item.3": [], 552 | "libobs.show_scene_item.4": [], 553 | "libobs.hide_scene_item.4": [], 554 | "libobs.show_scene_item.5": [], 555 | "libobs.hide_scene_item.5": [], 556 | "libobs.show_scene_item.7": [], 557 | "libobs.hide_scene_item.7": [], 558 | "libobs.show_scene_item.9": [], 559 | "libobs.hide_scene_item.9": [], 560 | "libobs.show_scene_item.10": [], 561 | "libobs.hide_scene_item.10": [], 562 | "libobs.show_scene_item.11": [], 563 | "libobs.hide_scene_item.11": [], 564 | "libobs.show_scene_item.12": [], 565 | "libobs.hide_scene_item.12": [] 566 | }, 567 | "deinterlace_mode": 0, 568 | "deinterlace_field_order": 0, 569 | "monitoring_type": 0, 570 | "private_settings": {} 571 | }, 572 | { 573 | "prev_ver": 503316482, 574 | "name": "Coding Overlay", 575 | "uuid": "4dc26fa2-778b-4695-97d8-b6b19bbbfd03", 576 | "id": "browser_source", 577 | "versioned_id": "browser_source", 578 | "settings": { 579 | "url": "https://streamelements.com/overlay/658471962c16b1688cdd2203/SPtp541QPP1OOLkpV6MK3Amm8nlZwMxeGAUPI4RneUKW9i5l", 580 | "width": 1920, 581 | "height": 1080, 582 | "restart_when_active": false 583 | }, 584 | "mixers": 255, 585 | "sync": 0, 586 | "flags": 0, 587 | "volume": 1.0, 588 | "balance": 0.5, 589 | "enabled": true, 590 | "muted": false, 591 | "push-to-mute": false, 592 | "push-to-mute-delay": 0, 593 | "push-to-talk": false, 594 | "push-to-talk-delay": 0, 595 | "hotkeys": { 596 | "libobs.mute": [], 597 | "libobs.unmute": [], 598 | "libobs.push-to-mute": [], 599 | "libobs.push-to-talk": [], 600 | "ObsBrowser.Refresh": [] 601 | }, 602 | "deinterlace_mode": 0, 603 | "deinterlace_field_order": 0, 604 | "monitoring_type": 0, 605 | "private_settings": {} 606 | }, 607 | { 608 | "prev_ver": 503316482, 609 | "name": "coming back", 610 | "uuid": "520b77b5-c235-420d-8174-02f3cf11c624", 611 | "id": "scene", 612 | "versioned_id": "scene", 613 | "settings": { 614 | "id_counter": 7, 615 | "custom_size": false, 616 | "items": [ 617 | { 618 | "name": "coming back video", 619 | "source_uuid": "57ab5930-2251-45f7-b038-01f661fe79ff", 620 | "visible": true, 621 | "locked": false, 622 | "rot": 0.0, 623 | "pos": { 624 | "x": 0.0, 625 | "y": 0.0 626 | }, 627 | "scale": { 628 | "x": 1.0, 629 | "y": 1.0 630 | }, 631 | "align": 5, 632 | "bounds_type": 2, 633 | "bounds_align": 0, 634 | "bounds": { 635 | "x": 1920.0, 636 | "y": 1080.0 637 | }, 638 | "crop_left": 0, 639 | "crop_top": 0, 640 | "crop_right": 0, 641 | "crop_bottom": 0, 642 | "id": 1, 643 | "group_item_backup": false, 644 | "scale_filter": "disable", 645 | "blend_method": "default", 646 | "blend_type": "normal", 647 | "show_transition": { 648 | "duration": 0 649 | }, 650 | "hide_transition": { 651 | "duration": 0 652 | }, 653 | "private_settings": {} 654 | }, 655 | { 656 | "name": "intro overlay", 657 | "source_uuid": "54e625b2-2b38-49a9-9dbe-05067638640e", 658 | "visible": true, 659 | "locked": false, 660 | "rot": 0.0, 661 | "pos": { 662 | "x": 0.0, 663 | "y": 0.0 664 | }, 665 | "scale": { 666 | "x": 1.0, 667 | "y": 1.0 668 | }, 669 | "align": 5, 670 | "bounds_type": 2, 671 | "bounds_align": 0, 672 | "bounds": { 673 | "x": 1920.0, 674 | "y": 1080.0 675 | }, 676 | "crop_left": 0, 677 | "crop_top": 0, 678 | "crop_right": 0, 679 | "crop_bottom": 0, 680 | "id": 2, 681 | "group_item_backup": false, 682 | "scale_filter": "disable", 683 | "blend_method": "default", 684 | "blend_type": "normal", 685 | "show_transition": { 686 | "duration": 0 687 | }, 688 | "hide_transition": { 689 | "duration": 0 690 | }, 691 | "private_settings": {} 692 | }, 693 | { 694 | "name": "Spotify", 695 | "source_uuid": "56d9152c-2117-4761-b480-d11ed613f684", 696 | "visible": true, 697 | "locked": false, 698 | "rot": 0.0, 699 | "pos": { 700 | "x": 0.0, 701 | "y": 0.0 702 | }, 703 | "scale": { 704 | "x": 1.0, 705 | "y": 1.0 706 | }, 707 | "align": 5, 708 | "bounds_type": 0, 709 | "bounds_align": 0, 710 | "bounds": { 711 | "x": 0.0, 712 | "y": 0.0 713 | }, 714 | "crop_left": 0, 715 | "crop_top": 0, 716 | "crop_right": 0, 717 | "crop_bottom": 0, 718 | "id": 3, 719 | "group_item_backup": false, 720 | "scale_filter": "disable", 721 | "blend_method": "default", 722 | "blend_type": "normal", 723 | "show_transition": { 724 | "duration": 0 725 | }, 726 | "hide_transition": { 727 | "duration": 0 728 | }, 729 | "private_settings": {} 730 | }, 731 | { 732 | "name": "Duet", 733 | "source_uuid": "88242e78-5b96-48de-a9eb-49bfc767e2c4", 734 | "visible": true, 735 | "locked": false, 736 | "rot": 0.0, 737 | "pos": { 738 | "x": 0.0, 739 | "y": 0.0 740 | }, 741 | "scale": { 742 | "x": 1.0, 743 | "y": 1.0 744 | }, 745 | "align": 5, 746 | "bounds_type": 0, 747 | "bounds_align": 0, 748 | "bounds": { 749 | "x": 0.0, 750 | "y": 0.0 751 | }, 752 | "crop_left": 0, 753 | "crop_top": 0, 754 | "crop_right": 0, 755 | "crop_bottom": 0, 756 | "id": 4, 757 | "group_item_backup": false, 758 | "scale_filter": "disable", 759 | "blend_method": "default", 760 | "blend_type": "normal", 761 | "show_transition": { 762 | "duration": 0 763 | }, 764 | "hide_transition": { 765 | "duration": 0 766 | }, 767 | "private_settings": {} 768 | }, 769 | { 770 | "name": "Follower Goal Overlay", 771 | "source_uuid": "685ca614-686f-4bf9-90ce-751a602fe436", 772 | "visible": true, 773 | "locked": false, 774 | "rot": 0.0, 775 | "pos": { 776 | "x": 1597.0, 777 | "y": 15.0 778 | }, 779 | "scale": { 780 | "x": 0.20472973585128784, 781 | "y": 0.20624999701976776 782 | }, 783 | "align": 5, 784 | "bounds_type": 0, 785 | "bounds_align": 0, 786 | "bounds": { 787 | "x": 0.0, 788 | "y": 0.0 789 | }, 790 | "crop_left": 0, 791 | "crop_top": 0, 792 | "crop_right": 0, 793 | "crop_bottom": 0, 794 | "id": 6, 795 | "group_item_backup": false, 796 | "scale_filter": "disable", 797 | "blend_method": "default", 798 | "blend_type": "normal", 799 | "show_transition": { 800 | "duration": 0 801 | }, 802 | "hide_transition": { 803 | "duration": 0 804 | }, 805 | "private_settings": {} 806 | }, 807 | { 808 | "name": "Now Playing", 809 | "source_uuid": "78f37af3-42b0-4b76-82d3-6acf84be74c1", 810 | "visible": true, 811 | "locked": false, 812 | "rot": 0.0, 813 | "pos": { 814 | "x": -66.0, 815 | "y": -93.0 816 | }, 817 | "scale": { 818 | "x": 0.44499999284744263, 819 | "y": 0.44499999284744263 820 | }, 821 | "align": 5, 822 | "bounds_type": 0, 823 | "bounds_align": 0, 824 | "bounds": { 825 | "x": 0.0, 826 | "y": 0.0 827 | }, 828 | "crop_left": 0, 829 | "crop_top": 0, 830 | "crop_right": 0, 831 | "crop_bottom": 0, 832 | "id": 7, 833 | "group_item_backup": false, 834 | "scale_filter": "disable", 835 | "blend_method": "default", 836 | "blend_type": "normal", 837 | "show_transition": { 838 | "duration": 0 839 | }, 840 | "hide_transition": { 841 | "duration": 0 842 | }, 843 | "private_settings": {} 844 | } 845 | ] 846 | }, 847 | "mixers": 0, 848 | "sync": 0, 849 | "flags": 0, 850 | "volume": 1.0, 851 | "balance": 0.5, 852 | "enabled": true, 853 | "muted": false, 854 | "push-to-mute": false, 855 | "push-to-mute-delay": 0, 856 | "push-to-talk": false, 857 | "push-to-talk-delay": 0, 858 | "hotkeys": { 859 | "OBSBasic.SelectScene": [], 860 | "libobs.show_scene_item.1": [], 861 | "libobs.hide_scene_item.1": [], 862 | "libobs.show_scene_item.2": [], 863 | "libobs.hide_scene_item.2": [], 864 | "libobs.show_scene_item.3": [], 865 | "libobs.hide_scene_item.3": [], 866 | "libobs.show_scene_item.4": [], 867 | "libobs.hide_scene_item.4": [], 868 | "libobs.show_scene_item.6": [], 869 | "libobs.hide_scene_item.6": [], 870 | "libobs.show_scene_item.7": [], 871 | "libobs.hide_scene_item.7": [] 872 | }, 873 | "deinterlace_mode": 0, 874 | "deinterlace_field_order": 0, 875 | "monitoring_type": 0, 876 | "private_settings": {} 877 | }, 878 | { 879 | "prev_ver": 503316482, 880 | "name": "coming back video", 881 | "uuid": "57ab5930-2251-45f7-b038-01f661fe79ff", 882 | "id": "ffmpeg_source", 883 | "versioned_id": "ffmpeg_source", 884 | "settings": { 885 | "hw_decode": true, 886 | "local_file": "/Users/ostera/Library/Mobile Documents/com~apple~CloudDocs/Stream/2023/assets/stream_coming_back.mp4", 887 | "looping": true, 888 | "clear_on_media_end": false 889 | }, 890 | "mixers": 255, 891 | "sync": 0, 892 | "flags": 0, 893 | "volume": 1.0, 894 | "balance": 0.5, 895 | "enabled": true, 896 | "muted": false, 897 | "push-to-mute": false, 898 | "push-to-mute-delay": 0, 899 | "push-to-talk": false, 900 | "push-to-talk-delay": 0, 901 | "hotkeys": { 902 | "libobs.mute": [], 903 | "libobs.unmute": [], 904 | "libobs.push-to-mute": [], 905 | "libobs.push-to-talk": [], 906 | "MediaSource.Restart": [], 907 | "MediaSource.Play": [], 908 | "MediaSource.Pause": [], 909 | "MediaSource.Stop": [] 910 | }, 911 | "deinterlace_mode": 0, 912 | "deinterlace_field_order": 0, 913 | "monitoring_type": 0, 914 | "private_settings": { 915 | "mixer_hidden": true 916 | } 917 | }, 918 | { 919 | "prev_ver": 503316482, 920 | "name": "Current Poll", 921 | "uuid": "39d7bfd0-3ffb-4134-93aa-f860b4063927", 922 | "id": "browser_source", 923 | "versioned_id": "browser_source", 924 | "settings": { 925 | "url": "https://www.twitch.tv/popout/leostera/poll", 926 | "restart_when_active": true 927 | }, 928 | "mixers": 255, 929 | "sync": 0, 930 | "flags": 0, 931 | "volume": 1.0, 932 | "balance": 0.5, 933 | "enabled": true, 934 | "muted": false, 935 | "push-to-mute": false, 936 | "push-to-mute-delay": 0, 937 | "push-to-talk": false, 938 | "push-to-talk-delay": 0, 939 | "hotkeys": { 940 | "libobs.mute": [], 941 | "libobs.unmute": [], 942 | "libobs.push-to-mute": [], 943 | "libobs.push-to-talk": [], 944 | "ObsBrowser.Refresh": [] 945 | }, 946 | "deinterlace_mode": 0, 947 | "deinterlace_field_order": 0, 948 | "monitoring_type": 0, 949 | "private_settings": {} 950 | }, 951 | { 952 | "prev_ver": 503316482, 953 | "name": "Duet", 954 | "uuid": "88242e78-5b96-48de-a9eb-49bfc767e2c4", 955 | "id": "coreaudio_input_capture", 956 | "versioned_id": "coreaudio_input_capture", 957 | "settings": { 958 | "device_id": "AppleUSBAudioEngine:Apogee Electronics Corp:Duet 3:1100000:1,2" 959 | }, 960 | "mixers": 255, 961 | "sync": 0, 962 | "flags": 2, 963 | "volume": 0.94343453645706177, 964 | "balance": 0.5, 965 | "enabled": true, 966 | "muted": false, 967 | "push-to-mute": false, 968 | "push-to-mute-delay": 0, 969 | "push-to-talk": false, 970 | "push-to-talk-delay": 0, 971 | "hotkeys": { 972 | "libobs.mute": [], 973 | "libobs.unmute": [], 974 | "libobs.push-to-mute": [], 975 | "libobs.push-to-talk": [] 976 | }, 977 | "deinterlace_mode": 0, 978 | "deinterlace_field_order": 0, 979 | "monitoring_type": 0, 980 | "private_settings": {} 981 | }, 982 | { 983 | "prev_ver": 503316482, 984 | "name": "Follower Goal Overlay", 985 | "uuid": "685ca614-686f-4bf9-90ce-751a602fe436", 986 | "id": "browser_source", 987 | "versioned_id": "browser_source", 988 | "settings": { 989 | "url": "https://dashboard.twitch.tv/widgets/goal/leostera", 990 | "width": 1480, 991 | "height": 160 992 | }, 993 | "mixers": 255, 994 | "sync": 0, 995 | "flags": 0, 996 | "volume": 1.0, 997 | "balance": 0.5, 998 | "enabled": true, 999 | "muted": false, 1000 | "push-to-mute": false, 1001 | "push-to-mute-delay": 0, 1002 | "push-to-talk": false, 1003 | "push-to-talk-delay": 0, 1004 | "hotkeys": { 1005 | "libobs.mute": [], 1006 | "libobs.unmute": [], 1007 | "libobs.push-to-mute": [], 1008 | "libobs.push-to-talk": [], 1009 | "ObsBrowser.Refresh": [] 1010 | }, 1011 | "deinterlace_mode": 0, 1012 | "deinterlace_field_order": 0, 1013 | "monitoring_type": 0, 1014 | "private_settings": {} 1015 | }, 1016 | { 1017 | "prev_ver": 503316482, 1018 | "name": "Intro", 1019 | "uuid": "0a9cbab5-4e0d-4bb4-b939-3264f6ed9d61", 1020 | "id": "scene", 1021 | "versioned_id": "scene", 1022 | "settings": { 1023 | "custom_size": false, 1024 | "id_counter": 14, 1025 | "items": [ 1026 | { 1027 | "name": "Spotify", 1028 | "source_uuid": "56d9152c-2117-4761-b480-d11ed613f684", 1029 | "visible": true, 1030 | "locked": false, 1031 | "rot": 0.0, 1032 | "pos": { 1033 | "x": 0.0, 1034 | "y": 0.0 1035 | }, 1036 | "scale": { 1037 | "x": 1.0, 1038 | "y": 1.0 1039 | }, 1040 | "align": 5, 1041 | "bounds_type": 0, 1042 | "bounds_align": 0, 1043 | "bounds": { 1044 | "x": 0.0, 1045 | "y": 0.0 1046 | }, 1047 | "crop_left": 0, 1048 | "crop_top": 0, 1049 | "crop_right": 0, 1050 | "crop_bottom": 0, 1051 | "id": 8, 1052 | "group_item_backup": false, 1053 | "scale_filter": "disable", 1054 | "blend_method": "default", 1055 | "blend_type": "normal", 1056 | "show_transition": { 1057 | "duration": 0 1058 | }, 1059 | "hide_transition": { 1060 | "duration": 0 1061 | }, 1062 | "private_settings": {} 1063 | }, 1064 | { 1065 | "name": "Duet", 1066 | "source_uuid": "88242e78-5b96-48de-a9eb-49bfc767e2c4", 1067 | "visible": true, 1068 | "locked": false, 1069 | "rot": 0.0, 1070 | "pos": { 1071 | "x": 0.0, 1072 | "y": 0.0 1073 | }, 1074 | "scale": { 1075 | "x": 1.0, 1076 | "y": 1.0 1077 | }, 1078 | "align": 5, 1079 | "bounds_type": 0, 1080 | "bounds_align": 0, 1081 | "bounds": { 1082 | "x": 0.0, 1083 | "y": 0.0 1084 | }, 1085 | "crop_left": 0, 1086 | "crop_top": 0, 1087 | "crop_right": 0, 1088 | "crop_bottom": 0, 1089 | "id": 9, 1090 | "group_item_backup": false, 1091 | "scale_filter": "disable", 1092 | "blend_method": "default", 1093 | "blend_type": "normal", 1094 | "show_transition": { 1095 | "duration": 0 1096 | }, 1097 | "hide_transition": { 1098 | "duration": 0 1099 | }, 1100 | "private_settings": {} 1101 | }, 1102 | { 1103 | "name": "intro video", 1104 | "source_uuid": "2312e1e3-bb25-48fc-ba1f-55b395c2ed80", 1105 | "visible": true, 1106 | "locked": false, 1107 | "rot": 0.0, 1108 | "pos": { 1109 | "x": 0.0, 1110 | "y": 0.0 1111 | }, 1112 | "scale": { 1113 | "x": 1.0, 1114 | "y": 1.0 1115 | }, 1116 | "align": 5, 1117 | "bounds_type": 2, 1118 | "bounds_align": 0, 1119 | "bounds": { 1120 | "x": 1920.0, 1121 | "y": 1080.0 1122 | }, 1123 | "crop_left": 0, 1124 | "crop_top": 0, 1125 | "crop_right": 0, 1126 | "crop_bottom": 0, 1127 | "id": 10, 1128 | "group_item_backup": false, 1129 | "scale_filter": "disable", 1130 | "blend_method": "default", 1131 | "blend_type": "normal", 1132 | "show_transition": { 1133 | "duration": 0 1134 | }, 1135 | "hide_transition": { 1136 | "duration": 0 1137 | }, 1138 | "private_settings": {} 1139 | }, 1140 | { 1141 | "name": "Follower Goal Overlay", 1142 | "source_uuid": "685ca614-686f-4bf9-90ce-751a602fe436", 1143 | "visible": true, 1144 | "locked": false, 1145 | "rot": 0.0, 1146 | "pos": { 1147 | "x": 1597.0, 1148 | "y": 15.0 1149 | }, 1150 | "scale": { 1151 | "x": 0.20472973585128784, 1152 | "y": 0.20624999701976776 1153 | }, 1154 | "align": 5, 1155 | "bounds_type": 0, 1156 | "bounds_align": 0, 1157 | "bounds": { 1158 | "x": 0.0, 1159 | "y": 0.0 1160 | }, 1161 | "crop_left": 0, 1162 | "crop_top": 0, 1163 | "crop_right": 0, 1164 | "crop_bottom": 0, 1165 | "id": 11, 1166 | "group_item_backup": false, 1167 | "scale_filter": "disable", 1168 | "blend_method": "default", 1169 | "blend_type": "normal", 1170 | "show_transition": { 1171 | "id": "fade_transition", 1172 | "versioned_id": "fade_transition", 1173 | "name": "Follower Goal Overlay Show Transition", 1174 | "transition": {}, 1175 | "duration": 300 1176 | }, 1177 | "hide_transition": { 1178 | "duration": 0 1179 | }, 1180 | "private_settings": {} 1181 | }, 1182 | { 1183 | "name": "intro overlay", 1184 | "source_uuid": "54e625b2-2b38-49a9-9dbe-05067638640e", 1185 | "visible": true, 1186 | "locked": false, 1187 | "rot": 0.0, 1188 | "pos": { 1189 | "x": 0.0, 1190 | "y": 0.0 1191 | }, 1192 | "scale": { 1193 | "x": 1.0, 1194 | "y": 1.0 1195 | }, 1196 | "align": 5, 1197 | "bounds_type": 2, 1198 | "bounds_align": 0, 1199 | "bounds": { 1200 | "x": 1920.0, 1201 | "y": 1080.0 1202 | }, 1203 | "crop_left": 0, 1204 | "crop_top": 0, 1205 | "crop_right": 0, 1206 | "crop_bottom": 0, 1207 | "id": 7, 1208 | "group_item_backup": false, 1209 | "scale_filter": "disable", 1210 | "blend_method": "default", 1211 | "blend_type": "normal", 1212 | "show_transition": { 1213 | "duration": 0 1214 | }, 1215 | "hide_transition": { 1216 | "duration": 0 1217 | }, 1218 | "private_settings": {} 1219 | }, 1220 | { 1221 | "name": "Now Playing", 1222 | "source_uuid": "78f37af3-42b0-4b76-82d3-6acf84be74c1", 1223 | "visible": true, 1224 | "locked": false, 1225 | "rot": 0.0, 1226 | "pos": { 1227 | "x": -66.0, 1228 | "y": -93.0 1229 | }, 1230 | "scale": { 1231 | "x": 0.44499999284744263, 1232 | "y": 0.44499999284744263 1233 | }, 1234 | "align": 5, 1235 | "bounds_type": 0, 1236 | "bounds_align": 0, 1237 | "bounds": { 1238 | "x": 0.0, 1239 | "y": 0.0 1240 | }, 1241 | "crop_left": 0, 1242 | "crop_top": 0, 1243 | "crop_right": 0, 1244 | "crop_bottom": 0, 1245 | "id": 12, 1246 | "group_item_backup": false, 1247 | "scale_filter": "disable", 1248 | "blend_method": "default", 1249 | "blend_type": "normal", 1250 | "show_transition": { 1251 | "duration": 0 1252 | }, 1253 | "hide_transition": { 1254 | "duration": 0 1255 | }, 1256 | "private_settings": {} 1257 | }, 1258 | { 1259 | "name": "Coding Overlay", 1260 | "source_uuid": "4dc26fa2-778b-4695-97d8-b6b19bbbfd03", 1261 | "visible": false, 1262 | "locked": false, 1263 | "rot": 0.0, 1264 | "pos": { 1265 | "x": 0.0, 1266 | "y": 0.0 1267 | }, 1268 | "scale": { 1269 | "x": 1.0, 1270 | "y": 1.0 1271 | }, 1272 | "align": 5, 1273 | "bounds_type": 0, 1274 | "bounds_align": 0, 1275 | "bounds": { 1276 | "x": 0.0, 1277 | "y": 0.0 1278 | }, 1279 | "crop_left": 0, 1280 | "crop_top": 0, 1281 | "crop_right": 0, 1282 | "crop_bottom": 0, 1283 | "id": 13, 1284 | "group_item_backup": false, 1285 | "scale_filter": "disable", 1286 | "blend_method": "default", 1287 | "blend_type": "normal", 1288 | "show_transition": { 1289 | "duration": 0 1290 | }, 1291 | "hide_transition": { 1292 | "duration": 0 1293 | }, 1294 | "private_settings": {} 1295 | }, 1296 | { 1297 | "name": "System", 1298 | "source_uuid": "88445db0-648f-42ce-a212-6807f941aadd", 1299 | "visible": true, 1300 | "locked": false, 1301 | "rot": 0.0, 1302 | "pos": { 1303 | "x": 0.0, 1304 | "y": 0.0 1305 | }, 1306 | "scale": { 1307 | "x": 1.0, 1308 | "y": 1.0 1309 | }, 1310 | "align": 5, 1311 | "bounds_type": 0, 1312 | "bounds_align": 0, 1313 | "bounds": { 1314 | "x": 0.0, 1315 | "y": 0.0 1316 | }, 1317 | "crop_left": 0, 1318 | "crop_top": 0, 1319 | "crop_right": 0, 1320 | "crop_bottom": 0, 1321 | "id": 14, 1322 | "group_item_backup": false, 1323 | "scale_filter": "disable", 1324 | "blend_method": "default", 1325 | "blend_type": "normal", 1326 | "show_transition": { 1327 | "duration": 0 1328 | }, 1329 | "hide_transition": { 1330 | "duration": 0 1331 | }, 1332 | "private_settings": {} 1333 | } 1334 | ] 1335 | }, 1336 | "mixers": 0, 1337 | "sync": 0, 1338 | "flags": 0, 1339 | "volume": 1.0, 1340 | "balance": 0.5, 1341 | "enabled": true, 1342 | "muted": false, 1343 | "push-to-mute": false, 1344 | "push-to-mute-delay": 0, 1345 | "push-to-talk": false, 1346 | "push-to-talk-delay": 0, 1347 | "hotkeys": { 1348 | "OBSBasic.SelectScene": [], 1349 | "libobs.show_scene_item.8": [], 1350 | "libobs.hide_scene_item.8": [], 1351 | "libobs.show_scene_item.9": [], 1352 | "libobs.hide_scene_item.9": [], 1353 | "libobs.show_scene_item.10": [], 1354 | "libobs.hide_scene_item.10": [], 1355 | "libobs.show_scene_item.11": [], 1356 | "libobs.hide_scene_item.11": [], 1357 | "libobs.show_scene_item.7": [], 1358 | "libobs.hide_scene_item.7": [], 1359 | "libobs.show_scene_item.12": [], 1360 | "libobs.hide_scene_item.12": [], 1361 | "libobs.show_scene_item.13": [], 1362 | "libobs.hide_scene_item.13": [], 1363 | "libobs.show_scene_item.14": [], 1364 | "libobs.hide_scene_item.14": [] 1365 | }, 1366 | "deinterlace_mode": 0, 1367 | "deinterlace_field_order": 0, 1368 | "monitoring_type": 0, 1369 | "private_settings": {} 1370 | }, 1371 | { 1372 | "prev_ver": 503316482, 1373 | "name": "intro overlay", 1374 | "uuid": "54e625b2-2b38-49a9-9dbe-05067638640e", 1375 | "id": "browser_source", 1376 | "versioned_id": "browser_source", 1377 | "settings": { 1378 | "url": "https://streamelements.com/overlay/6585aa6717cad839e68a26c7/SPtp541QPP1OOLkpV6MK3Amm8nlZwMxeGAUPI4RneUKW9i5l", 1379 | "width": 1920, 1380 | "height": 1080, 1381 | "restart_when_active": false 1382 | }, 1383 | "mixers": 255, 1384 | "sync": 0, 1385 | "flags": 0, 1386 | "volume": 1.0, 1387 | "balance": 0.5, 1388 | "enabled": true, 1389 | "muted": false, 1390 | "push-to-mute": false, 1391 | "push-to-mute-delay": 0, 1392 | "push-to-talk": false, 1393 | "push-to-talk-delay": 0, 1394 | "hotkeys": { 1395 | "libobs.mute": [], 1396 | "libobs.unmute": [], 1397 | "libobs.push-to-mute": [], 1398 | "libobs.push-to-talk": [], 1399 | "ObsBrowser.Refresh": [] 1400 | }, 1401 | "deinterlace_mode": 0, 1402 | "deinterlace_field_order": 0, 1403 | "monitoring_type": 0, 1404 | "private_settings": {} 1405 | }, 1406 | { 1407 | "prev_ver": 503316482, 1408 | "name": "intro video", 1409 | "uuid": "2312e1e3-bb25-48fc-ba1f-55b395c2ed80", 1410 | "id": "ffmpeg_source", 1411 | "versioned_id": "ffmpeg_source", 1412 | "settings": { 1413 | "local_file": "/Users/ostera/Library/Mobile Documents/com~apple~CloudDocs/Stream/2023/assets/stream_starting_soon.mp4", 1414 | "hw_decode": true, 1415 | "looping": true 1416 | }, 1417 | "mixers": 255, 1418 | "sync": 0, 1419 | "flags": 0, 1420 | "volume": 1.0, 1421 | "balance": 0.5, 1422 | "enabled": true, 1423 | "muted": false, 1424 | "push-to-mute": false, 1425 | "push-to-mute-delay": 0, 1426 | "push-to-talk": false, 1427 | "push-to-talk-delay": 0, 1428 | "hotkeys": { 1429 | "libobs.mute": [], 1430 | "libobs.unmute": [], 1431 | "libobs.push-to-mute": [], 1432 | "libobs.push-to-talk": [], 1433 | "MediaSource.Restart": [], 1434 | "MediaSource.Play": [], 1435 | "MediaSource.Pause": [], 1436 | "MediaSource.Stop": [] 1437 | }, 1438 | "deinterlace_mode": 0, 1439 | "deinterlace_field_order": 0, 1440 | "monitoring_type": 0, 1441 | "private_settings": { 1442 | "mixer_hidden": true 1443 | } 1444 | }, 1445 | { 1446 | "prev_ver": 503316482, 1447 | "name": "main-screen", 1448 | "uuid": "ea02bb68-5d43-4a74-833b-7754de07a167", 1449 | "id": "screen_capture", 1450 | "versioned_id": "screen_capture", 1451 | "settings": { 1452 | "application": "com.1password.1password", 1453 | "type": 0, 1454 | "window": 112528, 1455 | "show_cursor": true, 1456 | "hide_obs": true, 1457 | "show_hidden_windows": true 1458 | }, 1459 | "mixers": 255, 1460 | "sync": 0, 1461 | "flags": 0, 1462 | "volume": 1.0, 1463 | "balance": 0.5, 1464 | "enabled": true, 1465 | "muted": true, 1466 | "push-to-mute": false, 1467 | "push-to-mute-delay": 0, 1468 | "push-to-talk": false, 1469 | "push-to-talk-delay": 0, 1470 | "hotkeys": { 1471 | "libobs.mute": [], 1472 | "libobs.unmute": [], 1473 | "libobs.push-to-mute": [], 1474 | "libobs.push-to-talk": [] 1475 | }, 1476 | "deinterlace_mode": 0, 1477 | "deinterlace_field_order": 0, 1478 | "monitoring_type": 0, 1479 | "private_settings": { 1480 | "mixer_hidden": true 1481 | } 1482 | }, 1483 | { 1484 | "prev_ver": 503316482, 1485 | "name": "Now Playing", 1486 | "uuid": "78f37af3-42b0-4b76-82d3-6acf84be74c1", 1487 | "id": "browser_source", 1488 | "versioned_id": "browser_source", 1489 | "settings": { 1490 | "url": "https://widget.nowplaying.site/Nsjg03SHZMtN7SIW" 1491 | }, 1492 | "mixers": 255, 1493 | "sync": 0, 1494 | "flags": 0, 1495 | "volume": 1.0, 1496 | "balance": 0.5, 1497 | "enabled": true, 1498 | "muted": false, 1499 | "push-to-mute": false, 1500 | "push-to-mute-delay": 0, 1501 | "push-to-talk": false, 1502 | "push-to-talk-delay": 0, 1503 | "hotkeys": { 1504 | "libobs.mute": [], 1505 | "libobs.unmute": [], 1506 | "libobs.push-to-mute": [], 1507 | "libobs.push-to-talk": [], 1508 | "ObsBrowser.Refresh": [] 1509 | }, 1510 | "deinterlace_mode": 0, 1511 | "deinterlace_field_order": 0, 1512 | "monitoring_type": 0, 1513 | "private_settings": {} 1514 | }, 1515 | { 1516 | "prev_ver": 503316482, 1517 | "name": "Spotify", 1518 | "uuid": "56d9152c-2117-4761-b480-d11ed613f684", 1519 | "id": "sck_audio_capture", 1520 | "versioned_id": "sck_audio_capture", 1521 | "settings": { 1522 | "application": "com.spotify.client", 1523 | "type": 1 1524 | }, 1525 | "mixers": 223, 1526 | "sync": 0, 1527 | "flags": 0, 1528 | "volume": 0.028936503455042839, 1529 | "balance": 0.5, 1530 | "enabled": true, 1531 | "muted": false, 1532 | "push-to-mute": false, 1533 | "push-to-mute-delay": 0, 1534 | "push-to-talk": false, 1535 | "push-to-talk-delay": 0, 1536 | "hotkeys": { 1537 | "libobs.mute": [], 1538 | "libobs.unmute": [], 1539 | "libobs.push-to-mute": [], 1540 | "libobs.push-to-talk": [] 1541 | }, 1542 | "deinterlace_mode": 0, 1543 | "deinterlace_field_order": 0, 1544 | "monitoring_type": 0, 1545 | "private_settings": {} 1546 | }, 1547 | { 1548 | "prev_ver": 503316482, 1549 | "name": "System", 1550 | "uuid": "88445db0-648f-42ce-a212-6807f941aadd", 1551 | "id": "sck_audio_capture", 1552 | "versioned_id": "sck_audio_capture", 1553 | "settings": {}, 1554 | "mixers": 223, 1555 | "sync": 0, 1556 | "flags": 0, 1557 | "volume": 0.069942452013492584, 1558 | "balance": 0.5, 1559 | "enabled": true, 1560 | "muted": true, 1561 | "push-to-mute": false, 1562 | "push-to-mute-delay": 0, 1563 | "push-to-talk": false, 1564 | "push-to-talk-delay": 0, 1565 | "hotkeys": { 1566 | "libobs.mute": [], 1567 | "libobs.unmute": [], 1568 | "libobs.push-to-mute": [], 1569 | "libobs.push-to-talk": [] 1570 | }, 1571 | "deinterlace_mode": 0, 1572 | "deinterlace_field_order": 0, 1573 | "monitoring_type": 0, 1574 | "private_settings": {} 1575 | }, 1576 | { 1577 | "prev_ver": 503316482, 1578 | "name": "zv-e10", 1579 | "uuid": "cfee3bd9-fee7-4c7a-b2a1-e0953679d929", 1580 | "id": "av_capture_input", 1581 | "versioned_id": "av_capture_input_v2", 1582 | "settings": { 1583 | "device": "0x100000054c0de3", 1584 | "device_name": "ZV-E10", 1585 | "buffering": false, 1586 | "resolution": "{\"width\":1280,\"height\":720}", 1587 | "frame_rate": { 1588 | "numerator": 25.0, 1589 | "denominator": 1.0 1590 | }, 1591 | "use_preset": true 1592 | }, 1593 | "mixers": 255, 1594 | "sync": 0, 1595 | "flags": 0, 1596 | "volume": 1.0, 1597 | "balance": 0.5, 1598 | "enabled": true, 1599 | "muted": false, 1600 | "push-to-mute": false, 1601 | "push-to-mute-delay": 0, 1602 | "push-to-talk": false, 1603 | "push-to-talk-delay": 0, 1604 | "hotkeys": { 1605 | "libobs.mute": [], 1606 | "libobs.unmute": [], 1607 | "libobs.push-to-mute": [], 1608 | "libobs.push-to-talk": [] 1609 | }, 1610 | "deinterlace_mode": 0, 1611 | "deinterlace_field_order": 0, 1612 | "monitoring_type": 0, 1613 | "private_settings": {} 1614 | } 1615 | ] 1616 | } --------------------------------------------------------------------------------