veronicaexplains-net-sk5zao.txt (17153B)
1 [1] Veronica Explains 2 3 • [4]About 4 • [5]FAQ 5 • [6]Contact 6 • [7]RSS 7 8 [9]Sign in [10]Subscribe 9 [11]intentional tech 10 11 It's time to talk about my writerdeck 12 13 [12] vkc 14 15 [13]vkc 16 17 23 May 2026 — 10 min read 18 [14] Share 19 A picture of a laptop with a tty screen running vim, the screen is filled with 20 the words from a video script. 21 22 tldr: 23 24 • I installed console-only Debian on an old laptop (no desktop OS at all) 25 • I added some packages to make it work better for writing: 26 □ network-manager for connecting to hotspots while I'm away 27 □ kmscon for custom fonts and more than 16 colors in the tty 28 □ tmux for a nice status bar and rudimentary screen tiling, as well as 29 acpi and light for battery and backlight details, respectively 30 □ neovim as my editor and vim-vimwiki to give myself a personal wiki 31 □ syncthing to sync and backup my work 32 33 I have an attention problem. 34 35 A couple of weeks ago, I decided to convert my old laptop into a [15]writerdeck 36 , a dedicated writing device free from the distractions of the modern internet. 37 38 Lots of folks build really elaborate offline devices for this, and I'd love to 39 do that... someday. Right now I have no shortage of projects and the point is 40 to get writing, so I used what I had: a six-year-old laptop which still runs 41 great, has plenty of power, but isn't getting much use anymore. 42 43 Crucially, this laptop has an excellent keyboard, and a matte screen, which 44 makes it awesome to type on for long stretches, and functional enough in the 45 daylight (I like to sit outside with my dog and write). It's also a [16] 46 System76 Galago Pro (not sponsored), which means it's already Linux friendly 47 and has great support in the kernel. 48 49 Setting up a tty instead of a desktop 50 51 Now, you could certainly just use a regular desktop OS and keep it offline, 52 although that's easier said than done. I don't think you can fully remove the 53 browsers from a modern Mac or Windows PC. At least not in a supported way. 54 55 Of course, I'm a Linux user, and I have any number of options. I could have 56 gone with a simple desktop or window manager and just not installed a browser, 57 but I wanted something that really broke the desktop OS muscle memory and 58 forced me into thinking about my words with intention. 59 60 I opted for a tty-based setup, using [17]Debian (Trixie at the time of 61 writing). Console only- no x11 or Wayland, no desktop getting in my way. 62 63 Installing Debian is easy enough. I use the text-based installer mode, and for 64 this writerdeck, I opted to skip full-disk encryption (there's nothing on this 65 device that isn't going to be public anyway). 66 67 Folks always tell me they get hung up on things because they don't set 68 themselves up with sudo on Debian. If you're coming from Mint or Ubuntu or 69 virtually any other desktop-oriented distro, this could trip you up. If you 70 want to use sudo for admin tasks, skip adding a root password. That'll disable 71 root and set you up as a sudo user. 72 73 A Debian TUI installer screen showing the "set up users and passwords" dialog 74 (for setting a root password).Leave this blank if you want to use a sudo user! 75 A lot of folks don't know about this quirk and get into trouble if they're 76 coming from other distros. 77 78 On the desktop setup screen, I chose to remove all desktop features, because 79 again, I want this thing to be a minimal device. Just me and the words, no GUI 80 getting in my way. 81 82 A Debian TUI installer screen showing the "software selection" dialog (for 83 installing a desktop environment).I removed the selection for "Debian desktop 84 environment" and "GNOME" here. This way it's just a tty. 85 86 When things wrap up, you'll be greeted with a bland console login. Perfect 87 place to get started. 88 89 A Debian tty login prompt. Black background with a login prompt in small white 90 text.It's boring. Perfect. 91 92 Installing network-manager 93 94 After signing in for the first time and making sure I was up-to-date with a 95 quick sudo apt update and a sudo apt upgrade, I chose to replace the regular 96 network stack with the network-manager package. Mainly to get access to the 97 very good curses tool nm-tui for connecting to networks. 98 99 nm-tui is a thousand times easier than editing config files for setting up 100 network devices. And while I will be working mostly offline with this device 101 when I'm away from home, I do appreciate the ability to connect it to the 102 network to back up files should the need arise. 103 104 After installing network-manager with sudo apt install network-manager, you can 105 use nm-tui to scan for available Wi-Fi networks and get hooked up. Depending on 106 your hardware, you might also have WAN access here. Pretty cool. 107 108 A network manager TUI screen. It's a curses screen that offers a small amount 109 of network configuration options.Having a TUI for networking is a nice 110 quality-of-life improvement. 111 112 Installing neovim and kmscon 113 114 I couldn't wait any longer, I installed neovim as soon as I could with sudo apt 115 install neovim. I didn't want to edit with nano. Nothing personal, I'm just a 116 vim user all the way now. 117 118 Normally I use traditional vim but I opted for neovim as I'm trying to get to 119 know it a bit more. 120 121 Then, I installed kmscon, which for Debian Trixie needed to be added from 122 backports. 123 124 First, I updated my Debian source list by editing the file at /etc/apt/ 125 sources.list to add the following two lines: 126 127 deb http://deb.debian.org/debian/ trixie-backports main contrib non-free non-free-firmware 128 deb-src http://deb.debian.org/debian/ trixie-backports main contrib non-free non-free-firmware 129 130 A quick sudo apt update and then I can simply run sudo apt install -t 131 trixie-backports kmscon. This will install the kmscon package from backports, 132 as well as its dependencies, and set it to automatically start on boot. Next 133 reboot, you'll see the familiar tty, but now it's scalable with ctrl-plus and 134 ctrl-minus, like most modern web browsers. 135 136 From here, I have a totally functional writerdeck. I could be done here and be 137 reasonably satisfied with an offline, pleasant writing experience. But I wanted 138 a few more nicities which I've grown accustomed to. 139 140 tmux for multiplexing and a pretty status bar 141 142 Next, I installed tmux for basic terminal tiling and a pretty status bar. This 143 is packaged for Debian (and virtually everyone else), and is installed with 144 sudo apt install tmux. 145 146 I also installed acpi for battery details, and light to control the screen 147 backlight. You can install these at the same time with sudo apt install acpi 148 light. I set these up in my .tmux.conf file, which is kept in your home 149 directory. Here's how I used them. 150 151 ACPI for battery readouts 152 153 Once the acpi package is installed, you should be able to see your battery with 154 acpi -b (assuming your laptop has a battery which is detected with acpi, which 155 has worked so far on every laptop I've tried in my house). 156 157 So, to get the specific percentage and nothing more, you can pipe acpi -b into 158 grep like so: 159 160 acpi -b | grep -m1 -o -P '.{0,2}%' 161 162 This grep is a bit hard to understand, so let's break it down: 163 164 • -m1 says stop reading the file after one line. I did this because some 165 laptops I've used have multiple batteries, and I only care about the 166 primary battery. You can probably leave this out if acpi -b only returns a 167 single line. 168 • -o prints only the matched parts of the line. I don't want a large printout 169 with the remaining time. You might! 170 • -P interprets the pattern as a Perl-compatible regular expression. Then '. 171 {0,2}%' gets us the percent sign and the two numbers preceding the percent. 172 (This won't show "100%" but I can live with that, because this laptop 173 doesn't get there anymore.) 174 175 I wanted to replace the default details in the tmux status bar with a battery 176 readout, so I do so with the following in my .tmux.conf: 177 178 # give me a battery readout instead of the time 179 set-window-option -g status-right "#(acpi -b | grep -m1 -o -P '.{0,2}%')" 180 181 Light for brightness 182 183 Next, we can use the very simple light command we installed earlier to control 184 the brightness. On my laptop, F8 and F9 have brightness indicators printed on 185 the keys, so it's a perfect fit. 186 187 light -U 10 decreases the brightness by ten percent, and light -A 10 increases 188 it. 189 190 So, to bind F8 and F9 to decrease/increase brightness control, I simply add 191 this to my .tmux.conf: 192 193 # keybinding for brightness 194 bind -n F8 run-shell 'light -U 10' # decrease 195 bind -n F9 run-shell 'light -A 10' # increase 196 197 Now, next time I start tmux, I'll have brightness controls. Very neat! 198 199 Additional tmux customization 200 201 Lastly, I like the status line for tmux at the top of the screen, because 202 neovim puts a status line at the bottom of the screen. That's achieved by 203 adding set -g status-position top to the .tmux.conf file. 204 205 Also, I have a habit of specifying the color. I think it's green by default but 206 I set it anyway (I might change it in the future, who knows) with set -g 207 status-style bg=green. 208 209 So, my final tmux.conf looks like this: 210 211 # bar position and color 212 set -g status-position top 213 set -g status-style bg=green 214 215 # keybinding for brightness 216 bind -n F8 run-shell 'light -U 10' # decrease 217 bind -n F9 run-shell 'light -A 10' # increase 218 219 # give me a battery readout instead of the time 220 set-window-option -g status-right "#(acpi -b | grep -m1 -o -P '.{0,2}%')" 221 222 This isn't a tmux lesson, but by default, to do a split, you use Ctrl-B to 223 break out of regular mode and into the tmux command mode, and then the % key to 224 split vertically, or " to split horizontally. Ctrl-B, then an arrow will move 225 your focus between panes. 226 227 Someday, I'll do a formal tmux lesson. Moving on! 228 229 neovim and vimwiki 230 231 I know a lot of folks won't want to use neovim or vim, opting instead for emacs 232 or helix or micro or nano or blammo or something else I didn't mention (but 233 someone's about to). 234 235 That's great. I'm happy for you. I'm a vim user though, so that's what I set 236 up. 237 238 neovim includes some reasonably great colorschemes which you can try out with 239 the :colorscheme option. I chose blue, which fit my retro vibe just fine, but 240 you could pick anything you want or even write one yourself from scratch. 241 242 I added that to my .config/nvim/init.vim file with colorscheme blue, and I also 243 added set linebreak so that way words would wrap to the next line (I don't 244 normally do this on my desktop but this thing's one job is writing). 245 246 Lastly, I set up vimwiki, which I already covered in a separate [18]blog post. 247 The only thing that's changed is instead of installing vimwiki with a plugin, 248 on Trixie it's packaged, so you can install it with sudo apt install 249 vim-vimwiki. 250 251 Installing Syncthing 252 253 I set up syncthing according to the [19]Syncthing docs, which are pretty good 254 and I won't repeat those too much here. 255 256 I set up syncthing to connect my writerdeck's vimwiki folder to my server's 257 writing folder, which is a subdirectory inside another, more private vimwiki 258 setup. I do it this way so that if there's sensitive notes in my desktop 259 vimwiki, they don't sync to the writerdeck. If I had encryption on this device, 260 I wouldn't mind that though, and I might set up password-based LUKS encryption 261 just to gain access to my vimwiki diary on the writerdeck. 262 263 The one place where I strayed from a stock syncthing setup is that because I 264 don't have a desktop with a traditional browser, I had to set my syncthing web 265 GUI to be [20]listening on all addresses instead of just 127.0.0.1. I don't 266 love this approach, but again, this thing has nothing private on it. A better 267 way would be to set up a SOCKS proxy and connect that way, but that's a topic 268 for a future post. 269 270 Setting it up to autologin 271 272 The last thing I did to make this writerdeck my own was to set up automatic 273 login. 274 275 I want to be able to open this up and start writing quickly- autologin is a 276 simple way to get there. 277 278 Autologin with kmscon 279 280 Because I installed kmscon, this is pretty easy, just update the (gasp) systemd 281 service with sudo systemctl edit [email protected]. 282 283 Then, I just added the following: 284 285 [Service] 286 ExecStart= 287 ExecStart=/usr/bin/kmscon --login -- /bin/login -f my_username_goes_here 288 289 This tells kmscon to start what comes after the -- after --login. In my case, 290 that's the default /bin/login program with the parameter -f and then my 291 username. 292 293 Launching tmux on boot 294 295 After kmscon signs me in, I want tmux to automatically launch into vimwiki. But 296 only if I'm on the main tty (the default virtual terminal). 297 298 I can do this easily by adding a small bash if/then to my .bashrc: 299 300 # Launch tmux if we aren't already running tmux and we're in the default tty 301 if [ -z "${TMUX}" ] && [ $(tty) == "/dev/pts/0" ]; then 302 exec tmux new-session -d 'vim -c VimwikiIndex' \; attach 303 fi 304 305 This works by checking to make sure we're not in tmux already (which would be 306 recursive and bad), and it also makes sure we're in the first virtual tty. If 307 those two conditions are met, then it launches a new tmux session with the 308 command vim -c VimwikiIndex (which tells vim to connect to the Vimwiki index). 309 It then attaches to that session. 310 311 After using it for a few projects, I love it. 312 313 I've had this thing going for a week or so now, and I've used it to write this 314 blog post, the script for the companion video, and another future script I'm 315 working up right now. And it's awesome. 316 317 I may extend this idea with a spell checker, or perhaps set up a "writerdeck 318 terminal" in my workspace using an old 486, to really bring myself back to a 319 more intentional experience (with an even better keyboard!). 320 321 The point is to write more, and to be less distracted doing so. I have always 322 struggled immensely with the fact that the browser nags at me. I get 323 notifications about apps needing my attention. My music player tells me the 324 next song we're playing. It's all very convenient, and very distracting. 325 326 I'm trying to be more intentional with my tech choices. I want devices that do 327 one thing really well, and that when I'm done with that one thing, I can put 328 them away, and do something else. I don't want everything to follow me around 329 everywhere. 330 331 If that's you, maybe you would benefit from a writerdeck. For me, it's been 332 great. :) 333 334 Update: This got a lot of attention and I wrote a [21]follow-up blog post 335 answering questions from the internet. 336 337 Read more 338 339 [22] It's me, holding a laptop with a blue screen and lots of text in front of 340 my face. The words "writerdeck FAQ" are superimposed to my side. 341 342 Writerdeck: FAQ 343 344 Folks have been asking me questions about my writerdeck setup. Here, I attempt 345 to answer them. 346 347 28 May 2026 348 [23] A close-up of my smiling face, holding a phone with the GrapheneOS logo on 349 it and the word "FAQ". 350 351 Living with GrapheneOS: FAQ 352 353 Over the last three years I've had a lot of folks ask me questions about using 354 GrapheneOS. Let's answer them! 355 356 04 Mar 2026 357 [24] The four members of The Stop Bits sitting on a couch. Superimposed is the 358 date "Feb 14, 2026" and the words "VCF SoCal // Orange, CA". 359 360 Upcoming performance + quick housekeeping note 361 362 I will be at VCF SoCal this Saturday, February 14, 2026, in Orange, CA, US! 363 364 09 Feb 2026 365 [25] A heavily dithered screenshot of the front page of veronicaexplains.net, 366 which says "subscribing is awesome and so are you", and a "subscribe" field 367 with an example email address in it. 368 369 Wait, veronicaexplains.net? 370 371 My website is now using Ghost instead of WordPress, and that means you can get 372 me in your inbox. Everyone loves emails, right? 373 374 05 Feb 2026 375 Veronica Explains 376 377 • [26]Sign up 378 • [27]"AI" disclosure 379 • [28]FAQ 380 381 Powered by [29]Ghost 382 383 Veronica Explains 384 385 Linux mom, vintage tech enthusiast, nerdy musician. 386 387 [30][ ] Subscribe Email sent 388 389 [38]Mastodon verification link [39]GoToSocial verification link 390 391 References: 392 393 [1] https://veronicaexplains.net/ 394 [4] https://veronicaexplains.net/about/ 395 [5] https://veronicaexplains.net/faq/ 396 [6] https://veronicaexplains.net/contact/ 397 [7] https://veronicaexplains.net/rss/ 398 [9] https://veronicaexplains.net/my-first-writerdeck/#/portal/signin 399 [10] https://veronicaexplains.net/my-first-writerdeck/#/portal/signup 400 [11] https://veronicaexplains.net/tag/intentional-tech/ 401 [12] https://veronicaexplains.net/author/vkc/ 402 [13] https://veronicaexplains.net/author/vkc/ 403 [14] https://veronicaexplains.net/my-first-writerdeck/#/share 404 [15] https://www.writerdeck.org/?ref=veronicaexplains.net 405 [16] https://system76.com/?ref=veronicaexplains.net 406 [17] https://debian.org/?ref=veronicaexplains.net 407 [18] https://veronicaexplains.net/vimwiki-101/ 408 [19] https://docs.syncthing.net/intro/getting-started.html?ref=veronicaexplains.net#getting-started 409 [20] https://docs.syncthing.net/intro/getting-started.html?ref=veronicaexplains.net#getting-started 410 [21] https://veronicaexplains.net/writerdeck-faq/ 411 [22] https://veronicaexplains.net/writerdeck-faq/ 412 [23] https://veronicaexplains.net/grapheneos-faq/ 413 [24] https://veronicaexplains.net/2026-vcf-socal-announcement/ 414 [25] https://veronicaexplains.net/launching-ghost-on-new-domain/ 415 [26] https://veronicaexplains.net/my-first-writerdeck/#/portal/ 416 [27] https://veronicaexplains.net/ai-disclosure/ 417 [28] https://veronicaexplains.net/faq/ 418 [29] https://ghost.org/ 419 [38] https://linuxmom.net/@vkc 420 [39] https://explains.social/@veronica