{"id":49575235,"url":"https://github.com/rollecode/dotfiles","last_synced_at":"2026-05-03T16:11:07.344Z","repository":{"id":145570978,"uuid":"40712662","full_name":"rollecode/dotfiles","owner":"rollecode","description":".files https://dotfiles.github.io/","archived":false,"fork":false,"pushed_at":"2026-04-26T14:52:57.000Z","size":787,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-05-02T13:33:29.050Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rollecode.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-08-14T11:54:49.000Z","updated_at":"2026-04-26T14:53:02.000Z","dependencies_parsed_at":"2023-05-13T08:00:25.889Z","dependency_job_id":null,"html_url":"https://github.com/rollecode/dotfiles","commit_stats":null,"previous_names":["rollecode/dotfiles"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/rollecode/dotfiles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rollecode%2Fdotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rollecode%2Fdotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rollecode%2Fdotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rollecode%2Fdotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rollecode","download_url":"https://codeload.github.com/rollecode/dotfiles/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rollecode%2Fdotfiles/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32575402,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-03T16:11:06.659Z","updated_at":"2026-05-03T16:11:07.339Z","avatar_url":"https://github.com/rollecode.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rolle's dotfiles\n\n![Version](https://img.shields.io/badge/version-2.5.12-purple.svg?style=for-the-badge) ![bash](https://img.shields.io/badge/bash-%23121011.svg?style=for-the-badge\u0026color=%23222222\u0026logo=gnu-bash\u0026logoColor=white) ![linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge\u0026logo=linux\u0026logoColor=black) ![macOS](https://img.shields.io/badge/macOS-000000?style=for-the-badge\u0026logo=apple\u0026logoColor=white) ![Lua](https://img.shields.io/badge/Lua-2C2D72?style=for-the-badge\u0026logo=lua\u0026logoColor=white) ![Neovim](https://img.shields.io/badge/Neovim-0.10+-57A143?style=for-the-badge\u0026logo=neovim\u0026logoColor=white) ![WezTerm](https://img.shields.io/badge/WezTerm-4E49EE?style=for-the-badge\u0026logo=wezterm\u0026logoColor=white)\n  \nCross-platform configuration files for Neovim and WezTerm with OS-specific settings.\n\n\u003cimg width=\"813\" height=\"240\" alt=\"image\" src=\"https://github.com/user-attachments/assets/928941fa-fde7-4c05-b9e2-cc81bc1fe2f5\" /\u003e\n\n## Installation \n\n```bash\nbash \u003c(curl -fsSL https://raw.githubusercontent.com/ronilaukkarinen/dotfiles/master/install.sh)\n```\n\n## Features\n\n🎯 **Modular structure** - Shared configs + OS-specific overrides\u003cbr\u003e\n🔐 **Secrets management** - API keys in gitignored files\u003cbr\u003e\n🌍 **Cross-platform** - Works on Linux, macOS, and Windows\u003cbr\u003e\n🎮 **Gamification \u0026 stats** - [Code::Stats](https://codestats.net/users/rolle) and [gamify](https://github.com/GrzegorzSzczepanek/gamify.nvim) with streak tracking\u003cbr\u003e\n🤖 **Claude Code integration** - Automatic XP tracking for AI-assisted coding\n\n## Requirements\n\n- [Neovim](https://neovim.io/) - 0.10+ required\n- [WezTerm](https://wezfurlong.org/wezterm/) - Terminal emulator\n- [Liga SFMono Nerd Font](https://github.com/shaunsingh/SFMono-Nerd-Font-Ligaturized) - Ligaturized SF Mono with Nerd Font icons\n- [Monaspace](https://monaspace.githubnext.com/) - Monaspace Krypton NF font\n- [Claude Code](https://claude.ai/download) - AI-assisted coding with Code::Stats integration\n\n## Manual installation\n\nFor selective updates or if you prefer manual setup:\n\n### Clone the repository\n\n```bash\ngit clone git@github.com:ronilaukkarinen/dotfiles.git ~/Projects/dotfiles\n```\n\n### Symlink configs (Linux/macOS)\n\n```bash\n# WezTerm\nln -sf ~/Projects/dotfiles/wezterm ~/.config/wezterm\n\n# Neovim\nln -sf ~/Projects/dotfiles/nvim ~/.config/nvim\n\n# Hammerspoon (macOS only)\nln -sf ~/Projects/dotfiles/hammerspoon ~/.hammerspoon\n```\n\n### Symlink configs (Windows - PowerShell as Admin)\n\n```powershell\n# Clone repository\ngit clone git@github.com:ronilaukkarinen/dotfiles.git $env:USERPROFILE\\Projects\\dotfiles\n\n# WezTerm\nNew-Item -ItemType SymbolicLink -Path \"$env:USERPROFILE\\.config\\wezterm\" -Target \"$env:USERPROFILE\\Projects\\dotfiles\\wezterm\" -Force\n\n# Neovim\nNew-Item -ItemType SymbolicLink -Path \"$env:USERPROFILE\\AppData\\Local\\nvim\" -Target \"$env:USERPROFILE\\Projects\\dotfiles\\nvim\" -Force\n```\n\n### Configure secrets\n\n```bash\n# Neovim\ncp ~/Projects/dotfiles/nvim/lua/secrets.lua.example ~/Projects/dotfiles/nvim/lua/secrets.lua\nnvim ~/Projects/dotfiles/nvim/lua/secrets.lua\n\n# Claude Code\ncp ~/Projects/dotfiles/claude-code/secrets.sh.example ~/Projects/dotfiles/claude-code/secrets.sh\nnvim ~/Projects/dotfiles/claude-code/secrets.sh\n```\n\nGet your Code::Stats API key from https://codestats.net/my/machines\n\n**With symlinks, any changes you make to your configs automatically update the repo!** Just commit and push when ready.\n\nLinter and formatter notifications appear automatically when you open files - nvim-lint will warn you if a linter is missing for that specific file type.\n\n## Claude code integration\n\nTrack your AI-assisted coding activity with Code::Stats automatically! Every time Claude Code writes or edits a file, you earn XP (1 XP per line). A custom status line shows model, session duration, lines changed, and XP at the bottom of the Claude Code terminal.\n\nThe install script sets up symlinks automatically. For manual setup:\n\n```bash\nmkdir -p ~/.claude/hooks\nln -sf ~/Projects/dotfiles/claude-code/codestats-hook.sh ~/.claude/hooks/codestats-hook.sh\nln -sf ~/Projects/dotfiles/claude-code/statusline.sh ~/.claude/statusline.sh\n```\n\n### Configure Claude code hooks\n\nAdd the following to your `~/.claude/settings.json` (this file cannot be symlinked as it varies per machine):\n\n```json\n{\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Edit|Write|NotebookEdit\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"~/.claude/hooks/codestats-hook.sh\",\n            \"async\": true\n          }\n        ]\n      }\n    ]\n  },\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"~/.claude/statusline.sh\"\n  }\n}\n```\n\n### How it works\n\nThe hook automatically:\n- Detects file type from extension (JavaScript, Python, Markdown, Bash, etc.)\n- Calculates XP based on lines written (1 XP per line)\n- Sends the XP to Code::Stats API asynchronously (non-blocking)\n- Displays running XP total in the status line\n\nThe status line shows: `Opus 4.6 · 45m · +156 -23 · XP: 4312 +5 (Shell)`\n\n### Auto-save conversations\n\nAutomatically save and archive all your Claude Code conversations with searchable markdown transcripts. This uses the [claude-conversation-saver](https://github.com/sirkitree/claude-conversation-saver) plugin wrapping the [conversation-logger](https://github.com/sirkitree/claude-conversation-saver) skill. Read more at [Jerad Bitner's blog post](https://jeradbitner.com/blog/claude-code-auto-save-conversations).\n\nRun this command in Claude Code:\n\n```\n/plugin marketplace add https://github.com/sirkitree/claude-conversation-saver\n```\n\nThen restart Claude Code. The plugin will automatically save conversations after each response to `~/.claude/conversation-logs/` with markdown transcripts, JSONL raw data, and session metadata.\n\nThe plugin needs these tools (likely already installed):\n\n- `git` - for cloning the skill\n- `jq` - JSON processor for parsing data\n- `python3` - for markdown conversion\n\nInstall missing dependencies:\n\nArch Linux:\n\n```bash\nsudo pacman -S git jq python\n```\n\nDebian/Ubuntu:\n\n```bash\nsudo apt install git jq python3\n```\n\nmacOS:\n\n```bash\nbrew install git jq python3\n```\n\nAfter installation, conversations are automatically saved. Use these slash commands:\n\n- `/convo-search \u003cquery\u003e` - search across all saved conversations\n- `/convo-list` - list all saved conversations\n- `/convo-recent` - show recent conversations\n\nThis ensures you never lose important conversations and can search through your entire Claude Code history!\n\n### Setup on other machines\n\nOn any other machine where you use Claude Code, just run the install script:\n\n```bash\nbash \u003c(curl -fsSL https://raw.githubusercontent.com/ronilaukkarinen/dotfiles/master/install.sh)\n```\n\nThen configure your secrets and `~/.claude/settings.json` as instructed.\n\n### Setup on remote servers\n\nFor remote servers where you use Claude Code via SSH, run the install script:\n\n```bash\nbash \u003c(curl -fsSL https://raw.githubusercontent.com/ronilaukkarinen/dotfiles/master/install.sh)\n```\n\nOr for manual Claude Code hook setup only:\n\n```bash\n# Clone dotfiles\ngit clone git@github.com:ronilaukkarinen/dotfiles.git ~/Projects/dotfiles\n\n# Create secrets file with your API key\necho '#!/bin/bash\nexport CODESTATS_API_KEY=\"YOUR_API_KEY_HERE\"' \u003e ~/Projects/dotfiles/claude-code/secrets.sh\nchmod +x ~/Projects/dotfiles/claude-code/secrets.sh\n\n# Symlink the hook and status line\nmkdir -p ~/.claude/hooks\nln -sf ~/Projects/dotfiles/claude-code/codestats-hook.sh ~/.claude/hooks/codestats-hook.sh\nln -sf ~/Projects/dotfiles/claude-code/statusline.sh ~/.claude/statusline.sh\n\n# Add hooks and statusLine to ~/.claude/settings.json (see above)\n```\n\n## Linters\n\nThe install script asks which linters you want to activate. You can enable/disable individual linters for different languages. Each linter checks code quality and shows errors/warnings inline as you type.\n\n### Available linters\n\n- **phpcs** - PHP Code Sniffer for PHP files\n- **stylelint** - CSS/SCSS linter\n- **flake8** - Python linter\n- **luacheck** - Lua linter\n- **jsonlint** - JSON linter\n- **eslint** - JavaScript linter\n\n### Manual activation\n\nTo manually enable/disable linters after installation, edit `~/Projects/dotfiles/nvim/lua/local.lua`:\n\n```lua\nreturn {\n    -- ... other settings ...\n\n    -- Linters (set to true to enable, false to disable)\n    enable_phpcs = true,      -- PHP linter\n    enable_stylelint = true,  -- CSS/SCSS linter\n    enable_flake8 = true,     -- Python linter\n    enable_luacheck = true,   -- Lua linter\n    enable_jsonlint = true,   -- JSON linter\n    enable_eslint = true,     -- JavaScript linter\n}\n```\n\nAfter editing, restart Neovim for changes to take effect.\n\n### Installing linters\n\nIf a linter is enabled but not installed, nvim-lint will show a notification with installation instructions when you open a file of that type.\n\n#### PHP (phpcs)\n\n```bash\ncomposer global require squizlabs/php_codesniffer\n```\n\n#### CSS/SCSS (stylelint)\n\n```bash\nnpm install -g stylelint\n```\n\n#### Python (flake8)\n\n```bash\npip install flake8\n```\n\n#### Lua (luacheck)\n\n```bash\nluarocks install luacheck\n```\n\n#### JSON (jsonlint)\n\n```bash\nnpm install -g jsonlint\n```\n\n#### JavaScript (eslint)\n\n```bash\nnpm install -g eslint\n```\n\n### Project-specific linters\n\nFor JavaScript/PHP projects, nvim-lint will automatically detect and use project-local linters:\n\n- **JavaScript**: Uses `node_modules/.bin/eslint` if available in your project\n- **PHP**: Uses `vendor/bin/phpcs` if available in your project\n\nThis ensures project-specific rules and configurations are respected.\n\n## Remote server setup\n\n### Install Neovim (first time), oneliner\n\n```bash\ncurl -L https://github.com/ronilaukkarinen/dotfiles/archive/refs/heads/master.tar.gz | tar xz \u0026\u0026 cp -r dotfiles-master/nvim ~/.config/ \u0026\u0026 rm -rf dotfiles-master \u0026\u0026 echo \"code_stats_api_key = 'SFxxxx'\\ncodestats_username = 'rolle'\" \u003e ~/.config/nvim/lua/secrets.lua\n```\n\n### Update Neovim, oneliner\n\n```bash\ncurl -L https://github.com/ronilaukkarinen/dotfiles/archive/refs/heads/master.tar.gz | tar xz \u0026\u0026 cp -r dotfiles-master/nvim/* ~/.config/nvim/ \u0026\u0026 rm -rf dotfiles-master\n```\n\n## Platform-specific notes\n\n### Linux\n\n- Uses `/usr/bin/python3`\n- nvm integration for Node.js\n- Wayland clipboard workaround for WezTerm\n\n### macOS\n\n- Uses Homebrew Python: `/opt/homebrew/bin/python3`\n- Background blur effects in WezTerm\n- Optimized font rendering (weight 500, size 13pt)\n\n### Windows\n\n- Uses system Python\n- **PowerShell as default shell** - Opens with PowerShell (`powershell.exe`) by default\n- **WSL Ubuntu 22.04** - Press `Ctrl+Shift+B` to spawn WSL Ubuntu in a split pane\n- **Launch menu** - Access PowerShell, WSL Ubuntu 22.04, Git Bash, or CMD via the launcher (`Ctrl+K` → search \"launcher\")\n- Adjusted keybindings where needed\n\n#### Making \"bash\" command open WSL Ubuntu 22.04\n\nTo make typing `bash` in PowerShell open WSL Ubuntu 22.04, add this to your PowerShell profile:\n\n```powershell\n# Override bash command to use WSL Ubuntu 22.04\nfunction bash {\n    wsl -d Ubuntu-22.04\n}\n```\n\nProfile location: `C:\\Users\\YourUsername\\Documents\\WindowsPowerShell\\Microsoft.PowerShell_profile.ps1`\n\nCreate the file if it doesn't exist, then restart PowerShell or run `. $PROFILE` to apply changes.\n\n## Installed plugins\n\n- [lazy.nvim](https://github.com/folke/lazy.nvim) - Plugin manager\n- [catppuccin](https://github.com/catppuccin/nvim) - Color scheme (Mocha variant)\n- [oklch-color-picker](https://github.com/eero-lehtinen/oklch-color-picker.nvim) - OKLCH color picker with graphical interface\n- [dashboard](https://github.com/nvimdev/dashboard-nvim) - Recent projects and files in start\n- [lualine](https://github.com/nvim-lualine/lualine.nvim) - Status bar with Code::Stats integration\n- [barbar](https://github.com/romgrk/barbar.nvim) - Buffer tabline with icons and animations\n- [auto-session](https://github.com/rmagatti/auto-session) - Auto-save and auto-restore sessions per directory\n- [cd-project.nvim](https://github.com/LintaoAmons/cd-project.nvim) - VSCode-like project manager\n- [telescope](https://github.com/nvim-telescope/telescope.nvim) - Fuzzy finder\n- [telescope-frecency](https://github.com/nvim-telescope/telescope-frecency.nvim) - Frecency algorithm for telescope\n- [gamify](https://github.com/GrzegorzSzczepanek/gamify.nvim) - Gamify coding with achievements and streaks\n- [gitsigns](https://github.com/lewis6991/gitsigns.nvim) - Git signs in gutter, inline blame, hunk actions\n- [mini.files](https://github.com/echasnovski/mini.files) - Lightweight file explorer\n- [which-key](https://github.com/folke/which-key.nvim) - Shows keybindings in popup\n- [presence](https://github.com/andweeb/presence.nvim) - Discord Rich Presence\n- [nvim-notify](https://github.com/rcarriga/nvim-notify) - Notification manager\n- [nvim-lint](https://github.com/mfussenegger/nvim-lint) - Linting with contextual diagnostics\n- [conform](https://github.com/stevearc/conform.nvim) - Auto-formatting on save\n- [indentmini](https://github.com/nvimdev/indentmini.nvim) - Minimal indent guides\n- [tiny-inline-diagnostic](https://github.com/rachartier/tiny-inline-diagnostic.nvim) - Inline diagnostic messages\n- [trouble](https://github.com/folke/trouble.nvim) - Diagnostics panel\n- [dropbar](https://github.com/Bekaboo/dropbar.nvim) - Context-aware breadcrumbs\n- [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter) - Better syntax highlighting with Tree-sitter\n- [blink.cmp](https://github.com/Saghen/blink.cmp) - Completion plugin\n- [minuet-ai](https://github.com/milanglacier/minuet-ai.nvim) - AI code completion with Ollama\n- [plenary.nvim](https://github.com/nvim-lua/plenary.nvim) - Lua utilities (includes custom Neovim AI helper)\n- [Comment.nvim](https://github.com/numToStr/Comment.nvim) - Toggle comments\n- [leap.nvim](https://github.com/ggandor/leap.nvim) - Jump to any location with search labels\n- [hardtime](https://github.com/m4xshen/hardtime.nvim) - Learn better Vim motions\n- [mason](https://github.com/williamboman/mason.nvim) - LSP server manager\n- [mason-lspconfig](https://github.com/williamboman/mason-lspconfig.nvim) - Bridge between mason and lspconfig\n- [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig) - LSP configuration\n\n## Custom features\n\n- Auto-restore sessions\n- Code::Stats XP in statusline\n- Gamify streak tracking\n- OS-specific configurations\n- Contextual linter notifications (only for files you're editing)\n\n## Hyprland\n\nLinux desktop uses [Hyprland](https://hypr.land/) with the [hy3](https://github.com/outfoxxed/hy3) plugin for i3-like manual tiling with smart autotile.\n\n### Tiling layout\n\nWindows float by default. Use `Super+V` to tile a window. The hy3 autotile feature prevents windows from becoming too narrow or short by automatically reorganizing the layout.\n\n### Hyprland keybindings\n\n#### Window management\n\n| Keybind | Action |\n|---------|--------|\n| Super + V | Toggle floating/tiled |\n| Super + C | Close window |\n| Super + Shift + C | Center window |\n| Super + T | Pin floating window |\n\n#### hy3 tiling controls\n\n| Keybind | Action |\n|---------|--------|\n| Super + arrows | Move focus between windows |\n| Super + Shift + arrows | Move window in layout |\n| Super + H | Group windows horizontally |\n| Super + J | Group windows vertically |\n| Super + G | Group windows as tabs |\n| Super + U | Untab (convert tabs to splits) |\n| Super + O | Toggle horizontal/vertical layout |\n| Super + E | Expand window into parent container |\n| Super + A | Focus parent container |\n| Super + Z | Focus child container |\n| Super + Shift + L | Lock group (prevent layout changes) |\n\n#### Workspaces\n\n| Keybind | Action |\n|---------|--------|\n| Super + 1-9 | Switch to workspace |\n| Super + Shift + 1-9 | Move window to workspace |\n| Super + Alt + left/right | Previous/next workspace |\n| Super + Ctrl + left/right | Move window to prev/next workspace |\n\n#### Other\n\n| Keybind | Action |\n|---------|--------|\n| Super + Q | Open terminal (WezTerm) |\n| Super + K | App launcher (DMS spotlight) |\n| Super + L | Lock screen |\n| Super + Shift + E | File manager |\n| Super + Tab | Window switcher |\n| Print | Screenshot area |\n| Shift + Print | Screenshot active window |\n| Ctrl + Print | Screenshot full screen |\n\n## Keybindings\n\n### WezTerm\n- `Ctrl+Shift+O` - Project switcher\n- `Ctrl+K` - Command palette\n- `Ctrl+Shift+B` - Spawn WSL Ubuntu 22.04 in split pane (Windows only)\n- `Ctrl+W` - Close pane\n- `Ctrl+Alt+Arrows` - Navigate panes\n- `Ctrl+Shift+Arrows` - Resize panes\n- `Ctrl+Shift+R` - Reload configuration\n\n### Neovim\n- `Ctrl+P` - Telescope frecency\n- `Ctrl+Shift+P` - Command palette\n- See individual plugin docs for more keybindings\n\n## Syncing gamify data\n\nTo sync your gamify streak and statistics across machines:\n\n### Install Syncthing\n\n#### Linux\n\n```bash\n# Debian/Ubuntu\nsudo apt install syncthing\n\n# Arch Linux\nsudo pacman -S syncthing\n```\n\n#### macOS\n\n```bash\nbrew install syncthing\n```\n\n### Enable auto-start\n\n#### Linux (systemd)\n\n```bash\n# Enable and start Syncthing service\nsystemctl --user enable syncthing.service\nsystemctl --user start syncthing.service\n```\n\n#### macOS\n\n```bash\n# Syncthing will auto-start after brew installation\nbrew services start syncthing\n```\n\n### Set up syncing\n\n1. Open the web UI at `http://127.0.0.1:8384`\n2. Set up GUI authentication (Settings → GUI → Set username and password)\n3. Add a new folder pointing to `~/.local/share/nvim/gamify/` with Folder Label \"nvim gamify\"\n4. In folder settings, go to Advanced:\n   - Tick Ignore Permissions\n   - Set Full Rescan Interval (s) to `300` (5 minutes for faster sync)\n5. Share this folder with your other devices\n6. Syncthing will keep your streaks in sync automatically\n\n### Remote access via nginx reverse proxy (Linux only)\n\nTo access Syncthing web UI from outside your network:\n\n#### Install nginx\n\n```bash\n# Debian/Ubuntu\nsudo apt install nginx\n\n# Arch Linux\nsudo pacman -S nginx\n```\n\n#### Create nginx reverse proxy configuration\n\n```bash\nsudo tee /etc/nginx/sites-available/syncthing \u003e /dev/null \u003c\u003c 'EOF'\nserver {\n  listen 0.0.0.0:8385;\n  listen [::]:8385;\n  server_name your-domain.example.com;\n\n  location / {\n    proxy_pass http://127.0.0.1:8384/;\n    proxy_http_version 1.1;\n    proxy_set_header Connection \"upgrade\";\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header X-Forwarded-For $remote_addr;\n    proxy_set_header X-Forwarded-Proto $scheme;\n\n    # by default nginx times out connections in one minute\n    proxy_read_timeout 1d;\n  }\n}\nEOF\n```\n\nReplace `your-domain.example.com` with your actual domain name.\n\n#### Enable the nginx site\n\n```bash\nsudo ln -s /etc/nginx/sites-available/syncthing /etc/nginx/sites-enabled/\nsudo nginx -t\nsudo systemctl enable nginx\nsudo systemctl start nginx\n```\n\n#### Configure router port forwarding\n\nSet up port forwarding in your router:\n\n- External port: `8385`\n- Internal IP: Your server's local IP (e.g., `192.168.1.100`)\n- Internal port: `8385`\n- Protocol: `TCP`\n\n#### Access Syncthing remotely\n\nYou can now access Syncthing from anywhere at `http://your-domain.example.com:8385/`\n\nMake sure you have GUI authentication enabled (step 2 in \"Set up syncing\" above).\n\n## Updates\n\n### With Symlinks\nSimply pull the latest changes:\n```bash\ncd ~/Projects/dotfiles \u0026\u0026 git pull\n```\nReload WezTerm (`Ctrl+Shift+R`) and restart Neovim to apply changes.\n\n### Without Symlinks\n\nPull and re-copy files:\n\n#### Linux/macOS\n\n```bash\ncd ~/Projects/dotfiles \u0026\u0026 git pull \u0026\u0026 cp -r wezterm ~/.config/ \u0026\u0026 cp -r nvim ~/.config/\n```\n\n#### Windows (PowerShell)\n\n```powershell\ncd ~/Projects/dotfiles; git pull; Copy-Item -Recurse -Force wezterm \"$env:USERPROFILE\\.config\\\"; Copy-Item -Recurse -Force nvim \"$env:USERPROFILE\\AppData\\Local\\\"\n```\n\n### .bashrc\n\nMy .bashrc changes depending on the system I'm on, but here are some useful lines to add.\n\n```bash\n# Add trailing slash when tab-completing directories\nbind 'set mark-directories on'\nbind 'set mark-symlinked-directories on'\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frollecode%2Fdotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frollecode%2Fdotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frollecode%2Fdotfiles/lists"}