<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Jeff Triplett</title><link href="https://jefftriplett.com/" rel="alternate"/><link href="https://jefftriplett.com/feed.xml" rel="self"/><id>https://jefftriplett.com/</id><updated>2026-06-13T16:04:52+00:00</updated><author><name>Jeff Triplett</name></author><subtitle>Thoughts about life, technology, development, and blog by Jeff Triplett.</subtitle><entry><title>How I Work From Anywhere Without Losing My Place</title><link href="https://jefftriplett.com/2026/how-i-work-from-anywhere-without-losing-my-place/" rel="alternate"/><published>2026-06-13T16:04:52+00:00</published><id>https://jefftriplett.com/2026/how-i-work-from-anywhere-without-losing-my-place/</id><summary type="html">&lt;p&gt;I’ve been running a new remote development setup for the last month or so, and the goal is simple: move between all of my devices without losing my place.&lt;/p&gt;
&lt;p&gt;The way I think about it, I have three default states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At my desk on my Mac Studio&lt;/li&gt;
&lt;li&gt;Home or out somewhere with my laptop or an iPad and a portable keyboard&lt;/li&gt;
&lt;li&gt;Only my phone, at practice or running errands&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wanted a setup that works across all three without rebuilding anything when I switch. I’d rather grab my iPhone or iPad with a portable keyboard than lug a laptop everywhere. If I’m at one of my kids’ practices and want to quickly follow up on something or implement an idea, I always have my phone with me.&lt;/p&gt;
&lt;p&gt;The stack is basically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tailscale.com"&gt;Tailscale&lt;/a&gt; - glues all of my devices onto one secure network&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tmux/tmux"&gt;tmux&lt;/a&gt; - keeps my dev environment alive so I can leave and come back without rebuilding&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mosh.org"&gt;Mosh&lt;/a&gt; - keeps remote connections resilient across flaky WiFi and network changes&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cmux.com"&gt;cmux&lt;/a&gt; - Ghostty + Workspaces for macOS, the desktop side of this&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getmoshi.app"&gt;Moshi&lt;/a&gt; - the best iPhone and iPad shell I have found&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first three are the foundation. They work the same no matter which device I’m sitting at. cmux is how I connect from a desktop or laptop, and Moshi is how I connect from my phone or iPad.&lt;/p&gt;
&lt;h2&gt;Tailscale ties the machines together&lt;/h2&gt;
&lt;p&gt;Start with Tailscale. I’ve used Tailscale for almost a decade because it’s free, has clients for everything like my phone, iPads, Macs, Linux boxes, and even routers and TVs. It’s a low-friction way to access all of your devices from anywhere securely and privately.&lt;/p&gt;
&lt;p&gt;Tailscale gives me a private network across my devices, so I can connect to my Mac Studio at the office, my Mac Mini at home, my MacBook Air, and Linux boxes without opening SSH to the public internet.&lt;/p&gt;
&lt;p&gt;That’s a big part of why I’m comfortable with this setup.&lt;/p&gt;
&lt;p&gt;These machines are not sitting there with public SSH ports open. They’re only reachable from my tailnet. Tailscale handles the secure network piece, and I don’t have to mess with WireGuard directly.&lt;/p&gt;
&lt;p&gt;It just works.&lt;/p&gt;
&lt;h2&gt;tmux keeps the work alive&lt;/h2&gt;
&lt;p&gt;tmux is the core of the setup. I’ve been running it for the last couple of months because I wanted something I could reconnect to later, similar to screen, but better suited to the way I actually work.&lt;/p&gt;
&lt;p&gt;A lot of the time, I have something running for work, a client, or one of my own projects. I might have Django in one pane, logs in another, and Claude Code or Codex running somewhere else. With tmux, I can leave that entire development environment in place and come back to it later. Being able to do that has been worth the switch on its own.&lt;/p&gt;
&lt;p&gt;I’m probably not using 90% of what tmux was built for. Mostly I’m using it to create sessions, connect to them, and disconnect without losing my place. I can split panes and move between them when I need to, but I find myself doing that less and less. The persistence is the part that actually matters to me.&lt;/p&gt;
&lt;p&gt;Some alternatives to tmux are &lt;a href="https://zellij.dev"&gt;Zellij&lt;/a&gt; and &lt;a href="https://herdr.dev"&gt;Herdr&lt;/a&gt;. I attempted to use Zellij, but struggled with the basics, so I bailed and went back to tmux. I haven’t tried Herdr, but I’ve seen people talking about it and wanted to include it.&lt;/p&gt;
&lt;h2&gt;Mosh makes remote sessions feel less fragile&lt;/h2&gt;
&lt;p&gt;The bigger improvement came when I added Mosh.&lt;/p&gt;
&lt;p&gt;Before I left for PyCon US, I decided I didn’t want to spend the week fighting flaky hotel, airport, and conference WiFi.&lt;/p&gt;
&lt;p&gt;I remembered that Mosh solves a lot of the disconnect problems SSH has, so I installed it on my server, my work Mac Studio, my home Mac Mini, and my MacBook Air before I left (Homebrew on macOS, your package manager of choice on Linux).&lt;/p&gt;
&lt;p&gt;I connected to a session before getting on the plane. About an hour into the flight, I opened my laptop, and the session resumed automatically. I didn’t have to rebuild anything or start over. It worked better than I thought it would.&lt;/p&gt;
&lt;p&gt;Mosh and tmux make a great pair. Mosh keeps the connection resilient, and tmux keeps the actual working state alive.&lt;/p&gt;
&lt;h2&gt;On a desktop or laptop, cmux ties it together&lt;/h2&gt;
&lt;p&gt;When I’m at a real keyboard, cmux is how I connect. It gives me Ghostty terminals and workspaces on macOS, which makes it easy to keep several machines and sessions organized at once.&lt;/p&gt;
&lt;p&gt;Where cmux really earns its place is how it handles agents and shared sessions. One workflow I’ve come to rely on: I’ll start a tmux session on a remote machine, then connect to it in a second terminal window in cmux. Then I’ll have Claude or Codex connect to that same machine and attach to the same tmux session to do the actual work, like setting up a new Linux box or installing packages.&lt;/p&gt;
&lt;p&gt;The nice part is that when Claude hits an interactive prompt, I can just take over the tmux session directly. I’m already attached. I can paste in API keys, answer prompts, or make changes that I wouldn’t want to hand off to an agent. Claude normally tries to handle those moments itself, and it doesn’t always do it well. This way I stay in control of the sensitive parts without losing the automation for everything else.&lt;/p&gt;
&lt;h2&gt;On my phone or iPad, Moshi is the missing piece&lt;/h2&gt;
&lt;p&gt;When I only have my phone or iPad with me, the part I was missing was a good way to connect to my remote sessions.&lt;/p&gt;
&lt;p&gt;I had tried Termius before, and it was decent, but I kept running into small UI issues. CLI apps are not really designed for phones and tablets, so little things like getting to the right key at the right time can become annoying fast.&lt;/p&gt;
&lt;p&gt;Then I tried &lt;a href="https://getmoshi.app"&gt;Moshi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Moshi is an iOS and iPad app for remote terminal connections. It also runs on Apple Silicon Macs as an iPad app, which is a nice bonus.&lt;/p&gt;
&lt;p&gt;Moshi has really good tmux support, and probably other multiplexers I haven’t tried yet. When I connect to a server that has tmux sessions running, Moshi prompts me with a list of those sessions before I even get to a shell. I don’t have to remember the command or go hunting around. I just pick the session and I’m back where I left off. That’s the feature that made the whole setup click.&lt;/p&gt;
&lt;p&gt;Moshi also has a good mobile UI for this kind of work. I created a couple of shortcuts, one for space and one for enter, and that gets me through most of what I need when I’m using Claude Code or Codex from my phone.&lt;/p&gt;
&lt;p&gt;Codex still has a few spots where it wants escape, and I haven’t fully figured that out yet. That may have been a connection issue, or it may be something I need to configure better.&lt;/p&gt;
&lt;p&gt;But for most of what I’m doing, it works shockingly well. I can open my phone, connect to an existing tmux session, check logs, nudge an agent, review what changed, or keep something moving without opening my laptop.&lt;/p&gt;
&lt;h3&gt;Setup was easier than expected&lt;/h3&gt;
&lt;p&gt;Moshi also handles setup nicely.&lt;/p&gt;
&lt;p&gt;When you connect to a server, it can show a QR code. You scan that from your phone, and it handles creating and copying the SSH key for you.&lt;/p&gt;
&lt;p&gt;That makes setup about as easy as I think it can be.&lt;/p&gt;
&lt;p&gt;On Apple devices, Moshi can also share connection settings across devices on the same Apple account. Once I had it set up, connecting from my iPad was painless. I hit the button, picked my session, and I was in.&lt;/p&gt;
&lt;p&gt;There is an Android version too. I haven’t tested it because I don’t have an Android device, but it’s there if you need it.&lt;/p&gt;
&lt;p&gt;Moshi is a paid app, unlike the rest of this stack, which is free or open source. It runs around $30 a year or around $80 for lifetime access, which felt reasonable given how much I’m using it.&lt;/p&gt;
&lt;h3&gt;Voice input&lt;/h3&gt;
&lt;p&gt;Moshi also supports voice input, which ended up being a bigger deal than I expected.&lt;/p&gt;
&lt;p&gt;On my Mac, I already use voice input a lot. I use tools like MacWhisper because voice to text has become a really good input method for me.&lt;/p&gt;
&lt;p&gt;Moshi brings that same idea to my phone and iPad.&lt;/p&gt;
&lt;p&gt;It can use Apple’s voice to text, and it can also run a Whisper model. That means I can connect to a remote session from my phone and use voice input to interact with the tools I already have running.&lt;/p&gt;
&lt;p&gt;Claude Code has voice support on the Mac, but that doesn’t really help when I’m remotely connected into another machine. Moshi having voice support built in makes the whole thing much more useful.&lt;/p&gt;
&lt;h2&gt;Where I’m using it&lt;/h2&gt;
&lt;p&gt;So far, I’ve been using this setup on Django TV, my job board, client work, and a bunch of one-off projects.&lt;/p&gt;
&lt;p&gt;I have a Mac Studio at the office and a Mac Mini at home, and I’m constantly moving between them from my MacBook Air. I’ve also been playing with &lt;a href="https://direnv.net"&gt;direnv&lt;/a&gt; so I can jump into a project and have the right environment load on the right machine. It’s not really part of this stack, but it pairs well with it.&lt;/p&gt;
&lt;p&gt;The split helps me keep things organized. Client work lives on the Mac Studio at the office. Side projects and personal work live on the Mac Mini at home. I can connect to whichever one I need without mixing everything together on my laptop. It also helps my MacBook Air battery, because the heavier work is happening somewhere else.&lt;/p&gt;
&lt;p&gt;And because the sessions are always running, I don’t have to worry about rebooting my MacBook Air or losing a Claude Code or Codex session mid-task. If one machine is having a problem, I can exit and switch to the other one while everything I care about stays up and running.&lt;/p&gt;
&lt;p&gt;Review has also gotten easier. I can pull up GitHub’s web interface or the GitHub desktop app from wherever I am and review pull requests without needing my full dev environment in front of me. The work is already staged. I just need a browser.&lt;/p&gt;
&lt;p&gt;I can still work locally when I want to. There’s nothing wrong with that. But keeping these remote sessions open all the time has been a much better experience.&lt;/p&gt;
&lt;p&gt;The databases are already connected. The processes are already running. The agents are already in context. I can leave things in progress and come back later without rebuilding the whole setup.&lt;/p&gt;
&lt;h2&gt;The glue code&lt;/h2&gt;
&lt;p&gt;I’ve also been writing some shell aliases and scripts to smooth over the rough edges, because I don’t want to memorize tmux’s command flags.&lt;/p&gt;
&lt;p&gt;I have a set of &lt;code&gt;tmux-*&lt;/code&gt; aliases that handle the things I actually do: create a new session, resume an existing one, and kill one when I’m done. That covers most of what I need without having to look anything up.&lt;/p&gt;
&lt;p&gt;On the cmux side, I’ve been experimenting with its CLI and API. I wrote &lt;a href="https://github.com/jefftriplett/dotfiles/blob/main/home/bin/cmux-dump"&gt;&lt;code&gt;cmux-dump&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/jefftriplett/dotfiles/blob/main/home/bin/cmux-restore"&gt;&lt;code&gt;cmux-restore&lt;/code&gt;&lt;/a&gt; commands to save and reload workspace layouts. The idea is to build out profiles for each project so I can get everything running the way I want it with one command. That might mean starting a tmux session on a remote machine and connecting to it over Mosh, all from a single alias.&lt;/p&gt;
&lt;p&gt;All of this lives in my &lt;a href="https://github.com/jefftriplett/dotfiles"&gt;dotfiles repo&lt;/a&gt; and will keep changing as I figure out what actually works. I’m still early in this part of the setup.&lt;/p&gt;
&lt;h2&gt;When and why you need each tool&lt;/h2&gt;
&lt;p&gt;You don’t have to adopt all five of these at once. Each one solves a specific problem, and you can add them as you hit that problem.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tailscale&lt;/strong&gt; is the one to start with if your machines aren’t already on a shared network. You need it the moment you want to reach a machine that isn’t sitting in front of you without exposing SSH to the public internet. If all of your work happens on one machine, you can skip it for now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tmux&lt;/strong&gt; is what you need when losing your terminal state hurts. If closing a laptop lid or dropping a connection means rebuilding your dev environment, restarting servers, or losing an agent session mid-task, tmux fixes that. It’s also the piece that lets two terminals, or you and an agent, share the same session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mosh&lt;/strong&gt; matters when your network is unreliable. Hotel WiFi, airports, conferences, tethering, or just moving between home and office. If you only ever connect over a stable wired network, plain SSH is fine. The moment you roam, Mosh is the difference between a session that survives and one you have to reconnect constantly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cmux&lt;/strong&gt; is for the desktop side, when you’re juggling several machines and sessions and want them organized into workspaces instead of a pile of terminal windows. Any terminal works here, but cmux makes the multi-machine setup easier to live in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moshi&lt;/strong&gt; is for the phone and iPad side. You need it when you want to check on or nudge work from wherever you are. Its tmux session picker, key shortcuts, and voice input are what make a phone a usable terminal instead of a frustrating one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The short version: Tailscale gets you to the machine, tmux keeps the work alive on it, Mosh keeps the connection from breaking, and cmux and Moshi are the front doors from a desk and from a phone.&lt;/p&gt;
&lt;h2&gt;This is not about working all the time&lt;/h2&gt;
&lt;p&gt;The real reason I like this setup is not because I want to maximize every spare minute of my life.&lt;/p&gt;
&lt;p&gt;It’s almost the opposite.&lt;/p&gt;
&lt;p&gt;This setup gives me more flexibility.&lt;/p&gt;
&lt;p&gt;If I have 15 minutes at my son’s track meets or baseball practice, I can pull out my phone and reconnect to something already in progress. If I’m waiting on slow tests, client feedback, or a deploy, I don’t have to sit glued to my desk.&lt;/p&gt;
&lt;p&gt;I can make dinner. I can pack lunch. I can pick up one of my kids. I can run an errand.&lt;/p&gt;
&lt;p&gt;Then, when something is ready, I can check in, make the next change, and keep moving.&lt;/p&gt;
&lt;p&gt;It makes the work less jarring. I don’t have to reset everything on my laptop just to make one small change or direct an agent for two minutes.&lt;/p&gt;
&lt;p&gt;The best part is that I can just close my laptop or walk away from my desk and know that my Claude and Codex sessions are going to keep running. When I come back, whether it’s on my phone or back at my desk, I can resume right where I left off without worrying about a disconnected session or a timed-out agent.&lt;/p&gt;
&lt;h2&gt;Why this feels different&lt;/h2&gt;
&lt;p&gt;The built-in remote options from tools like Claude Code and Codex work sometimes, but I kept running into connection weirdness when one laptop was trying to coordinate across multiple machines.&lt;/p&gt;
&lt;p&gt;What I wanted was something that didn’t require rebuilding context every time I moved. This stack gives me that. The connection doesn’t break. The session doesn’t disappear. The agents don’t lose their place.&lt;/p&gt;
&lt;p&gt;That’s a different kind of flexibility than I had before. It’s not about squeezing more work into more hours. It’s about not paying a tax every time I pick up where I left off.&lt;/p&gt;
&lt;p&gt;This is what’s working well for me right now, but I’m genuinely curious what you’re using. If you have a tool that replaces one of these or collapses a few layers into one, I want to hear about it. If you try any of this and it works for you, let me know. And if I’m holding one of these tools wrong and there’s a better way, I’m all ears for that too.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Written by Jeff via a mix of voice transcription and typed notes. Edited with Claude Code.&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2026/06/13/how-i-work-from-anywhere/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>Django Chat Podcast: E201</title><link href="https://jefftriplett.com/2026/django-chat-podcast-e201/" rel="alternate"/><published>2026-04-30T18:10:04+00:00</published><id>https://jefftriplett.com/2026/django-chat-podcast-e201/</id><summary type="html">&lt;p&gt;This week, I joined &lt;a href="https://wsvincent.com"&gt;Will Vincent&lt;/a&gt; and &lt;a href="https://noumenal.es"&gt;Carlton Gibson&lt;/a&gt; on the &lt;a href="https://djangochat.com"&gt;Django Chat&lt;/a&gt; podcast for &lt;a href="https://djangochat.com/episodes/djangocon-europe-recap-other-news-jeff-triplett"&gt;DjangoCon Europe Recap + Other News&lt;/a&gt;. You can also watch it on &lt;a href="https://djangotv.com/videos/djangochat/2026/djangocon-europe-recap-other-news-jeff-triplett/"&gt;DjangoTV via YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On this episode, we discussed &lt;a href="https://2026.djangocon.eu"&gt;DjangoCon Europe&lt;/a&gt;, which Carlton had attended. We caught up on what’s going on with &lt;a href="https://django-news.com"&gt;Django News&lt;/a&gt; and the &lt;a href="https://www.djangoproject.com"&gt;Django Software Foundation&lt;/a&gt;. We also spent a good chunk of time on AI workflows and tooling. And I got to have a little soapbox rant at the end, which is always fun for me.&lt;/p&gt;
&lt;h2&gt;Projects I Recommended&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pydantic/pydantic-ai"&gt;Pydantic AI&lt;/a&gt; is the Django ORM for accessing LLM providers&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/steipete/CodexBar"&gt;CodexBar&lt;/a&gt; - If you are on a Mac, CodexBar will let you easily track and see your token usage across 20+ providers&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ghostty.org"&gt;Ghostty&lt;/a&gt; - After almost two decades of using iTerm2, I switched.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cmux.com"&gt;cmux&lt;/a&gt; - Built on Ghostty but a nice UX to switch between Agent sessions&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goodsnooze.gumroad.com/l/macwhisper"&gt;MacWhisper&lt;/a&gt; - Still my favorite voice to text Mac app&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Books I Recommended&lt;/h2&gt;
&lt;p&gt;At the end of the episode, I recommended these two books:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.simonandschuster.co.uk/books/The-Greatest-Bedtime-Story-Ever/Jessie-Sima/9781665974523"&gt;The Greatest Bedtime Story Ever&lt;/a&gt; by Jessie Sima&lt;/li&gt;
&lt;li&gt;&lt;a href="https://us.macmillan.com/books/9780374619329/enshittification/"&gt;Enshittification: Why Everything Suddenly Got Worse and What to Do About It&lt;/a&gt; by Cory Doctorow &lt;em&gt;(I recommended this one, but maybe not for the reasons you might think)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I’m always excited and honored to be invited on the show, and I always enjoy it. I hope it was a good listen, and I especially appreciated getting to step on the soapbox one more time at the end.&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2026/04/30/djangochat-podcast-e/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>DjangoCon US Talks I'd Like to See 2026 Edition</title><link href="https://jefftriplett.com/2026/djangocon-us-talks-i-d-like-to-see-2026-edition/" rel="alternate"/><published>2026-03-19T20:54:26+00:00</published><id>https://jefftriplett.com/2026/djangocon-us-talks-i-d-like-to-see-2026-edition/</id><summary type="html">&lt;p&gt;This is my annual list of DjangoCon US talks I’d like to see. I have been doing this since 2015, and it’s one of my favorite traditions.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://2026.djangocon.us"&gt;DjangoCon US 2026&lt;/a&gt; is in Chicago this year, August 24-28.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;a href="https://pretalx.com/djangocon-us-2026/cfp"&gt;CFP&lt;/a&gt; is open. The deadline is March 23, 2026 at 11 AM CDT. Submit a talk!&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Past editions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://micro.webology.dev/2024/04/28/djangocon-us-talks.html"&gt;2024 Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jefftriplett.com/2023/djangocon-us-talks-i-d-like-to-see-2023-edition/"&gt;2023 Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jefftriplett.com/2022/djangocon-us-talks-i-d-like-to-see-2022-edition/"&gt;2022 Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jefftriplett.com/2018/djangocon-us-talks-i-d-like-to-see-2018-edition/"&gt;2018 Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jefftriplett.com/2017/django-talks-id-like-to-see/"&gt;2017 Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jefftriplett.com/2016/djangocon-us-talks-id-like-to-see/"&gt;2016 Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/jefftriplett/cdda63bf42c592b1a6c8"&gt;2015 Edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Drew’s Topics&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://winstel.dev"&gt;Drew Winstel&lt;/a&gt; published a great list of &lt;a href="https://winstel.dev/2026/01/05/talk-ideas-for-dcus-26/"&gt;talk ideas for DCUS ‘26&lt;/a&gt; with over 20 ideas. Here are some of my favorites from his list. Any of these would make good talk ideas, so check out Drew’s full list too.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPTs, LLMs, and AIs, oh my!&lt;/li&gt;
&lt;li&gt;Deployment at any size&lt;/li&gt;
&lt;li&gt;Unexpected use cases, especially ones that make the world better&lt;/li&gt;
&lt;li&gt;Clever hacks (such as Carlton Gibson’s single-file Django project)&lt;/li&gt;
&lt;li&gt;Using Django in machine learning projects&lt;/li&gt;
&lt;li&gt;New features in Django 6.x&lt;/li&gt;
&lt;li&gt;Development and testing techniques that help you build better code&lt;/li&gt;
&lt;li&gt;Convincing product management that you don’t need a SPA or yet another mobile app&lt;/li&gt;
&lt;li&gt;Personal growth: how the community helped you in some way and you’d like to pay it forward&lt;/li&gt;
&lt;li&gt;Adapting communities to changes in life&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;My Topics&lt;/h2&gt;
&lt;p&gt;Here are some topics that I’d personally like to see this year.&lt;/p&gt;
&lt;h3&gt;What’s coming in Python and Django&lt;/h3&gt;
&lt;p&gt;With some big shifts coming in Python 3.15 and 3.16, it would be really interesting to see more about what Django developers would benefit from knowing about what’s coming up. Something a little more core to Python would be interesting.&lt;/p&gt;
&lt;p&gt;I’d also love to see more Django talks, whether it’s from the Steering Council or anybody working on features for the Django 7 series. What’s coming? What are the big features being tackled?&lt;/p&gt;
&lt;h3&gt;Django’s deployment story&lt;/h3&gt;
&lt;p&gt;Last year I was on a panel called &lt;a href="https://djangotv.com/videos/djangocon-us/2025/panel-discussion-two-decades-of-django-the-past-present-and-future-with-velda-kiara/"&gt;Two Decades of Django: The Past, Present, and Future&lt;/a&gt;. During that panel, I challenged people to really look into Django’s deployment story and find ways to improve it. If we can remove one or two steps along the way, we can make the deployment story better.&lt;/p&gt;
&lt;p&gt;A couple of projects came out of that conversation that I really liked, including &lt;a href="https://github.com/nanorepublica/django-prodserver"&gt;Django Prod Server&lt;/a&gt;. Anything that makes deployments better and reduces the number of steps is worth exploring. If anybody has topics around improving Django’s deployment experience, that would be a great one to discuss.&lt;/p&gt;
&lt;h3&gt;Rust in our ecosystem&lt;/h3&gt;
&lt;p&gt;I’d like to hear more about Rust in our ecosystem. Tools like uv, Ruff, and Pydantic are all built with Rust. Pydantic led to Django Ninja and other applications built around it. Are you using Rust in your Django applications? Why? Where are you building with it? How is it improving your workflow? Is it for linters? Code formatters? Are you solving performance bottlenecks with Rust? What should Django learn from Rust? Which parts of Django would be better if rewritten in Rust? That story is really fascinating to me.&lt;/p&gt;
&lt;h3&gt;LLMs and Django&lt;/h3&gt;
&lt;p&gt;I’d like to see more LLM talks about the amazing things people are building. This could be with Pydantic AI, creating model agents, or things you’re building that either run Django websites or help people do amazing things with agents. What does it look like to give a functional brain to a Django app? That would be an interesting talk idea.&lt;/p&gt;
&lt;h3&gt;Agent skills and productivity&lt;/h3&gt;
&lt;p&gt;I’d also like to hear about agent skills. How are you improving your productivity? How are you taking some of the drudge work out of working with Django? What skills do you use? What problems are you solving that a skill helps you with? What should Django learn from LLMs, skills, and agents? That would be another interesting topic.&lt;/p&gt;
&lt;h3&gt;Real talk about LLMs and team productivity&lt;/h3&gt;
&lt;p&gt;There are a lot of talks about the negative things about LLMs and AI, and I think that is respectable and understandable. But it has become taboo for some weird reason that people who use LLMs every day aren’t speaking out about it and aren’t talking about the productivity gains they get. Especially if you’re on a small team doing a lot of stuff.&lt;/p&gt;
&lt;p&gt;If you’re working with a bigger team and everybody’s using these tools, how are you managing it? How are you getting through pull review processes? How are you making your code better? What’s working? What didn’t work? What’s scaled up for you?&lt;/p&gt;
&lt;p&gt;Everything is changing in our industry whether we like it or not. Agents are here. The companies as of today are not going anywhere and the bubble hasn’t burst. I’m really curious about team productivity. What do you like? What don’t you like?&lt;/p&gt;
&lt;h3&gt;Defending and embracing LLM traffic&lt;/h3&gt;
&lt;p&gt;On the flip side with LLMs, so many things have changed in the last year that we have to be a little more defensive with our websites, whether that’s using CDNs like Cloudflare or Fastly. I’m really interested in what people are doing to scale their servers now with LLMs in mind.&lt;/p&gt;
&lt;p&gt;Some people may or may not want to make their websites more LLM friendly. There are definitely advantages and disadvantages to doing that. Writing a website to be consumed by LLMs is an interesting topic, both defensively and in terms of how you take advantage of it.&lt;/p&gt;
&lt;h2&gt;Submit a talk&lt;/h2&gt;
&lt;p&gt;You can always go back to my &lt;a href="https://micro.webology.dev/2024/04/28/djangocon-us-talks.html"&gt;2024 list&lt;/a&gt; and of course there’s &lt;a href="https://winstel.dev/2026/01/05/talk-ideas-for-dcus-26/"&gt;Drew’s list&lt;/a&gt; too. Some of the best topics that will be submitted will be things that don’t fit either of our lists. The whole idea is just to give people a starting point for things we’d both personally like to see, but that shouldn’t limit your imagination.&lt;/p&gt;
&lt;p&gt;Outside opinions are great. Not everything needs to be about Django. We always get a bunch of community talks and talks that don’t have to be about the tech. But I think it’s an exciting year to really dig deeper into some of the tech because so much is changing on a weekly basis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://pretalx.com/djangocon-us-2026/cfp"&gt;Submit your talk for DjangoCon US 2026!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2026/03/19/djangocon-us-talks-id-like/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>How I Use django-simple-nav for Dashboards, Command Palettes, and More</title><link href="https://jefftriplett.com/2026/how-i-use-django-simple-nav-for-dashboards-command-palettes-and-more/" rel="alternate"/><published>2026-02-27T02:56:51+00:00</published><id>https://jefftriplett.com/2026/how-i-use-django-simple-nav-for-dashboards-command-palettes-and-more/</id><summary type="html">&lt;p&gt;I first got exposed to &lt;a href="https://github.com/westerveltco/django-simple-nav"&gt;django-simple-nav&lt;/a&gt; while working with &lt;a href="https://github.com/joshuadavidthomas"&gt;Josh Thomas&lt;/a&gt; at &lt;a href="https://github.com/westerveltco"&gt;the Westervelt Corporation&lt;/a&gt; over the last two or three years. It quickly became a go-to library in my toolkit. django-simple-nav lets you define nav items and groupings in Python, then hand them off to a Django template to render. I use it for sidebars, headers, dashboards, and other spots where I need a menu.&lt;/p&gt;
&lt;p&gt;Since then, I have also started using it on a lot of personal projects. It has been a great fit every time.&lt;/p&gt;
&lt;h2&gt;Defining nav items once and reusing them everywhere&lt;/h2&gt;
&lt;p&gt;Recently I wanted to reuse parts of a menu nav without having to update a bunch of different files. I had a dashboard with a sidebar full of links, and I also wanted a command palette that could search across all those same options when you hit Command-K from any page. django-simple-nav was a natural fit because you define your items once in Python and render them with whatever template you want.&lt;/p&gt;
&lt;p&gt;Here is an example of what that looks like in Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; django_simple_nav.nav &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Nav
&lt;span style="color:#f92672"&gt;from&lt;/span&gt; django_simple_nav.nav &lt;span style="color:#f92672"&gt;import&lt;/span&gt; NavGroup
&lt;span style="color:#f92672"&gt;from&lt;/span&gt; django_simple_nav.nav &lt;span style="color:#f92672"&gt;import&lt;/span&gt; NavItem

NAV_ITEMS &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
    NavItem(title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"Home"&lt;/span&gt;, url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"home"&lt;/span&gt;),
    NavItem(title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"Dashboard"&lt;/span&gt;, url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"dashboard"&lt;/span&gt;),
    NavGroup(
        title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"Admin &amp; Tools"&lt;/span&gt;,
        items&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[
            NavItem(title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"Admin"&lt;/span&gt;, url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"admin:index"&lt;/span&gt;, permissions&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;"is_staff"&lt;/span&gt;]),
        ],
    ),
    NavItem(title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"Login"&lt;/span&gt;, url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"login"&lt;/span&gt;),
    NavItem(title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"Logout"&lt;/span&gt;, url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"logout"&lt;/span&gt;),
]


&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DashboardNav&lt;/span&gt;(Nav):
    template_name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;"nav/dashboard.html"&lt;/span&gt;
    items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NAV_ITEMS


&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CommandPaletteNav&lt;/span&gt;(Nav):
    template_name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;"nav/command_palette.html"&lt;/span&gt;
    items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NAV_ITEMS&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Flexible URLs and named routes&lt;/h2&gt;
&lt;p&gt;A few things to notice here. When you create a nav item and you have a URL, you can either use the URL’s name or you can give it the path to it and it will figure out what it is. So if I want a nav item for the Django admin, I can use &lt;code&gt;"admin:index"&lt;/code&gt; as the URL.&lt;/p&gt;
&lt;h2&gt;Handling permissions without template logic&lt;/h2&gt;
&lt;p&gt;Another nice feature is the &lt;code&gt;permissions&lt;/code&gt; parameter. The Admin link uses &lt;code&gt;permissions=["is_staff"]&lt;/code&gt;, which means it only shows up for staff users. You can use this to hide things based on whether someone is staff, a superuser, or has specific Django permissions. This makes it nice to keep all of your nav options in one place without having to write special conditional logic in your templates to show or hide items for different users.&lt;/p&gt;
&lt;h2&gt;Rendering a dashboard nav with Django templates&lt;/h2&gt;
&lt;p&gt;The other thing to notice is the two Nav classes at the bottom: &lt;code&gt;DashboardNav&lt;/code&gt; and &lt;code&gt;CommandPaletteNav&lt;/code&gt;. They both use the same &lt;code&gt;NAV_ITEMS&lt;/code&gt; list but point to different templates. This is where the reuse really shines.&lt;/p&gt;
&lt;p&gt;Here is an example nav template at &lt;code&gt;templates/nav/dashboard.html&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;&lt;span style="color:#f92672"&gt;nav&lt;/span&gt;&gt;
  {% for item in items %}
    {% if item.items %}
      &lt;&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&gt;{{ item.title }}:
        {% for subitem in item.items %}
          &lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"{{ subitem.url }}"&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;{%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;subitem&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;active&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;%}&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"active"&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;{%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;endif&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;%}&lt;/span&gt;&gt;
            {{ subitem.title }}
          &lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&gt;
        {% endfor %}
      &lt;/&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&gt;
    {% else %}
      &lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"{{ item.url }}"&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;{%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;active&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;%}&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"active"&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;{%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;endif&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;%}&lt;/span&gt;&gt;
        {{ item.title }}
      &lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&gt;
    {% endif %}
  {% endfor %}
&lt;/&lt;span style="color:#f92672"&gt;nav&lt;/span&gt;&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then in your base template, you can render it with the template tag:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;{% load django_simple_nav %}

{% django_simple_nav "myapp.nav.DashboardNav" %}&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Building a command palette from the same nav items&lt;/h2&gt;
&lt;p&gt;Because the &lt;code&gt;CommandPaletteNav&lt;/code&gt; class uses the same &lt;code&gt;NAV_ITEMS&lt;/code&gt; list but with a different template, we can render the same nav data as JSON for a command palette. Here is an example template at &lt;code&gt;templates/nav/command_palette.html&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;{% load django_simple_nav %}

&lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"application/json"&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;"command-palette-data"&lt;/span&gt;&gt;
[{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;item&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;items&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;items&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;subitem&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;items&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}
  {&lt;span style="color:#e6db74"&gt;"title"&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;"{{ subitem.title }}"&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;"url"&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;"{{ subitem.url }}"&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;"group"&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;"{{ item.title }}"&lt;/span&gt;}{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;not&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;forloop&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;last&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;or&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;not&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;forloop&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;parentloop&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;last&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;},{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;endif&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;endfor&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}
  {&lt;span style="color:#e6db74"&gt;"title"&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;"{{ item.title }}"&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;"url"&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;"{{ item.url }}"&lt;/span&gt;}{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;not&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;forloop&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;last&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;},{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;endif&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;endif&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}{&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;endfor&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;}
]
&lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This also lent itself well when I was trying to do something quickly with Claude. I don’t know how to build a command palette, but I was able to just have Claude create one. I asked it to use HTMX to keep everything pretty lightweight.&lt;/p&gt;
&lt;h2&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;All in all, django-simple-nav is a nice library to have in your toolkit. I like using it for headers, menus, dashboard navigation links, and even footer text. If you need flexible, reusable navigation in Django, give it a look.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Written by Jeff. Edited with &lt;a href="https://grammarly.com"&gt;Grammarly&lt;/a&gt; and &lt;a href="https://claude.ai/code"&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2026/02/26/how-i-use-djangosimplenav-for/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>Jordan Baird's Ice beta fixed my macOS Tahoe menu bar issues</title><link href="https://jefftriplett.com/2026/jordan-baird-s-ice-beta-fixed-my-macos-tahoe-menu-bar-issues/" rel="alternate"/><published>2026-02-19T14:00:00+00:00</published><id>https://jefftriplett.com/2026/jordan-baird-s-ice-beta-fixed-my-macos-tahoe-menu-bar-issues/</id><summary type="html">&lt;p&gt;If you use a Mac, you’ve probably noticed that the menu bar fills up with icons pretty quickly. &lt;a href="https://www.macbartender.com"&gt;Bartender&lt;/a&gt; and &lt;a href="https://github.com/jordanbaird/Ice"&gt;Ice&lt;/a&gt; (sadly, now an unfortunate name) are apps that let you manage and hide unwanted icons from your macOS menu bar so it stays clean and uncluttered.&lt;/p&gt;
&lt;p&gt;About a year ago, I switched from Bartender to Ice, which just happens to be open source, because there was &lt;a href="https://micro.webology.dev/2024/06/04/bartender-mac-app.html"&gt;some drama&lt;/a&gt;. Since then, I’ve been very happy with Ice.&lt;/p&gt;
&lt;p&gt;A couple of months ago, I upgraded to macOS Tahoe, and my menu bar stopped working correctly. The icon colors were all this weird shade of blue, so I couldn’t customize anything. After months of trying to figure it out, I noticed that it had been a while since Ice released a new version. That’s how open source goes sometimes.&lt;/p&gt;
&lt;p&gt;I was getting to the point of deciding whether to go back to Bartender or stick with Ice. Today, I noticed that there’s a Homebrew package for &lt;code&gt;jordanbaird-ice@beta&lt;/code&gt;. I decided to give it a try, removed the old version, installed the beta, and to my surprise and delight, the problem was fixed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color:#75715e"&gt;# remove the stable version&lt;/span&gt;
brew remove jordanbaird-ice

&lt;span style="color:#75715e"&gt;# install the beta&lt;/span&gt;
brew install jordanbaird-ice@beta&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I’m hoping there’s a more official release soon. The new Bartender looks good too, so if Ice doesn’t keep getting updated, I might switch back. If you’ve run into this same issue, give the beta a try and let me know how it goes. And if you know of any alternatives to Bartender and Ice, I’d love to hear about those too.&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2026/02/19/jordan-bairds-ice-beta-fixed/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>My displays keep rearranging and displayplacer fixed it</title><link href="https://jefftriplett.com/2026/my-displays-keep-rearranging-and-displayplacer-fixed-it/" rel="alternate"/><published>2026-02-18T22:54:47+00:00</published><id>https://jefftriplett.com/2026/my-displays-keep-rearranging-and-displayplacer-fixed-it/</id><summary type="html">&lt;p&gt;Today I learned about &lt;a href="https://github.com/jakehilborn/displayplacer"&gt;displayplacer&lt;/a&gt; - “macOS command line utility to configure multi-display resolutions and arrangements.”&lt;/p&gt;
&lt;p&gt;In December, I upgraded to MacOS Tahoe and picked up the TS4 dock for my work machine.&lt;/p&gt;
&lt;p&gt;While my upgrade was painless, the biggest issue I’ve had is with my displays. Every time my displays go to sleep and then I come back from lunch or come back the next day to work, my orientation of my displays changes and it puts them in a random order.&lt;/p&gt;
&lt;p&gt;My displays should be arranged like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;2&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;span style="color:#f92672"&gt;[&lt;/span&gt;3&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;4&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But after waking from sleep, they end up like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;2&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;span style="color:#f92672"&gt;[&lt;/span&gt;3&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;4&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It’s really annoying. It takes a minute to fix and it’s just frustrating.&lt;/p&gt;
&lt;p&gt;I tried displayplacer today. I had Claude Code actually run the &lt;code&gt;displayplacer list&lt;/code&gt; command. It figured out which displays and which settings needed to be changed. I had it record that and then I tried it out a few times where I manually dragged my displays around, put them in the wrong order, then ran the command, and it just magically worked.&lt;/p&gt;
&lt;p&gt;I saved the working configuration to a shell script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;# Restore display layout: 4 monitors (2x 16" 1920x1080, 2x 73" 2048x1280)&lt;/span&gt;

displayplacer &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt;  &lt;span style="color:#e6db74"&gt;"id:F4AB0D6C-8E85-4E84-B5AB-C5B388536E3D res:1920x1080 hz:60 color_depth:8 enabled:true scaling:off origin:(0,0) degree:0"&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt;  &lt;span style="color:#e6db74"&gt;"id:C9240C8E-A9D2-418A-89AC-28D3B5DEE5FC res:1920x1080 hz:60 color_depth:8 enabled:true scaling:off origin:(-1920,0) degree:0"&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt;  &lt;span style="color:#e6db74"&gt;"id:B43E3352-ACB7-4163-A25B-2DDAE0174571 res:2048x1280 hz:60 color_depth:8 enabled:true scaling:off origin:(0,-1280) degree:0"&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;&lt;/span&gt;  &lt;span style="color:#e6db74"&gt;"id:B32F530C-62CF-4F0D-9997-80BF2B812AC8 res:2048x1280 hz:60 color_depth:8 enabled:true scaling:off origin:(-2048,-1280) degree:0"&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I also tried setting it up as a Stream Deck key and for some reason I couldn’t get that to work. But it’s fine. I can run a shell script and that takes a lot less time to get it in the right order.&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2026/02/18/my-displays-keep-rearranging-and/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>🤖 Trying Out GLM with Claude Code</title><link href="https://jefftriplett.com/2025/trying-out-glm-with-claude-code/" rel="alternate"/><published>2025-12-11T01:43:48+00:00</published><id>https://jefftriplett.com/2025/trying-out-glm-with-claude-code/</id><summary type="html">&lt;p&gt;My friend &lt;a href="https://treyhunner.com"&gt;Trey Hunner&lt;/a&gt; showed me the GLM set of models before Thanksgiving. While traveling to see family, I somehow messed up my Claude Code setup because of a wrapper I have with &lt;a href="https://mise.jdx.dev"&gt;mise-en-place&lt;/a&gt;. I couldn’t use it for a while, and that made me realize I really need a backup for Claude Code.&lt;/p&gt;
&lt;h2&gt;Why GLM?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://z.ai"&gt;Z.AI&lt;/a&gt;’s GLM model is better than Gemini but not quite as good as Claude Code. It’s really fast (about twice as fast as Claude Code), seems like 90+ percent as good, and it’s really cheap. You can get an annual subscription for around $26-28 for the first year, and I’ve read online that it’s very hard to hit the limit even on the lowest tier subscription.&lt;/p&gt;
&lt;p&gt;This is a great option for folks who can’t quite justify the $100/mo Claude plan but occasionally hit limits on the $20/mo Claude plan. I actually subscribe to the $100/mo plan, but I ended up getting the GLM Pro Plan because I like the amount of usage it gives me. The plan I’m on has five times as much token usage as the base tier.&lt;/p&gt;
&lt;h2&gt;Running Both Side by Side&lt;/h2&gt;
&lt;p&gt;There’s a &lt;a href="https://github.com/JoeInnsp23/claude-glm-wrapper"&gt;wrapper tool&lt;/a&gt; that lets you use Z.AI’s models as Claude Code’s backend, so you can run both Claude and Z.AI’s GLM in two different windows. Having a reasonable backup that I can switch between or run in parallel is nice.&lt;/p&gt;
&lt;p&gt;I never find speed to be an issue with Claude Code, but I’m definitely a fan of having options.&lt;/p&gt;
&lt;h2&gt;API Access&lt;/h2&gt;
&lt;p&gt;Claude doesn’t include API key access without paying extra. GLM solves this problem by giving you a raw API for a set price per month. Their API is OpenAI compatible, so I can work on agentic scripts using Open Coder or other applications without paying extra for Anthropic tokens.&lt;/p&gt;
&lt;h2&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;To get started, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;bunx claude-glm-installer&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will give you bash aliases that let you run various GLM models while still letting Claude default to the Anthropic backend:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ccg              &lt;span style="color:#75715e"&gt;# Claude Code with GLM-4.6 (latest)&lt;/span&gt;
ccg45            &lt;span style="color:#75715e"&gt;# Claude Code with GLM-4.5&lt;/span&gt;
ccf              &lt;span style="color:#75715e"&gt;# Claude Code with GLM-4.5-Air (faster)&lt;/span&gt;
cc               &lt;span style="color:#75715e"&gt;# Regular Claude Code&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Trey also told me about &lt;a href="https://github.com/musistudio/claude-code-router"&gt;claude-code-router&lt;/a&gt;, which lets you change models on the fly without restarting Claude Code. This might work well if you want to switch between models mid-session.&lt;/p&gt;
&lt;p&gt;If you find yourself running out of Claude Code tokens a couple of times a week or even a couple of times a day, it might be worth checking out GLM as a backup or alternative.&lt;/p&gt;
&lt;p&gt;If you want to try out Z.AI’s GLM models, please use &lt;a href="https://z.ai/subscribe?ic=GLMN4NLXLV"&gt;my invite link&lt;/a&gt; (affiliate) or feel free to use &lt;a href="https://z.ai/subscribe?utm_medium=edm&amp;amp;utm_content=blackfriday&amp;amp;_channel_track_key=PJg2GPj2"&gt;Trey Hunner’s invite link&lt;/a&gt; (affiliate) instead.&lt;/p&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/ClaudeCode/comments/1nv64g5/i_made_a_tool_to_use_zais_glm_models_with_claude/"&gt;Claude GLM Installer tool on Reddit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JoeInnsp23/claude-glm-wrapper"&gt;claude-glm-wrapper on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/musistudio/claude-code-router"&gt;claude-code-router on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Written by Jeff. Edited with &lt;a href="https://grammarly.com"&gt;Grammarly&lt;/a&gt; and &lt;a href="https://claude.ai/code"&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2025/12/10/trying-out-glm-with-claude/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>🤖 How I Accidentally Spent Over 62 Million OpenAI Tokens</title><link href="https://jefftriplett.com/2025/how-i-accidentally-spent-over-62-million-openai-tokens/" rel="alternate"/><published>2025-11-23T05:01:54+00:00</published><id>https://jefftriplett.com/2025/how-i-accidentally-spent-over-62-million-openai-tokens/</id><summary type="html">&lt;p&gt;I’ve been fighting a runaway &lt;a href="https://openai.com"&gt;OpenAI&lt;/a&gt; bill for the last few weeks. I was worried I was leaking one of my API keys in a non-obvious way, possibly in one of my public projects.&lt;/p&gt;
&lt;p&gt;Two weeks ago, I deleted all my keys and contacted OpenAI support. I created new keys for every project, making it easier to track usage and identify any leaks. I had already been doing this, but I was a bit lax on a few projects while migrating from &lt;a href="https://www.digitalocean.com"&gt;Digital Ocean&lt;/a&gt; to &lt;a href="https://www.hetzner.com"&gt;Hetzner&lt;/a&gt;. More on that migration soon.&lt;/p&gt;
&lt;p&gt;Fast forward two weeks, and OpenAI notified me again that I hit my very low recharge threshold. With granular keys in place, it only took a minute to narrow down the culprit: my &lt;a href="https://djangotv.com"&gt;DjangoTV.com&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;I use the &lt;a href="https://platform.openai.com/docs/api-reference/introduction"&gt;OpenAI API&lt;/a&gt; to help parse presenter names and clean up titles whenever we add new videos. I had recently added &lt;a href="https://djangotv.com/videos/djangocon-us/2025/"&gt;DjangoCon US&lt;/a&gt; videos and &lt;a href="https://djangotv.com/videos/wagtail-space/2025/"&gt;Wagtail Space&lt;/a&gt; videos during the last two weeks, both on the same day our LLM usage spiked.&lt;/p&gt;
&lt;p&gt;I checked my &lt;a href="https://github.com/django-q2/django-q2"&gt;Django-Q2&lt;/a&gt; logs and noticed several tasks failing because they were timing out after 90 seconds. The task accepts a list of video IDs and loops through them, parsing each one using &lt;a href="https://ai.pydantic.dev"&gt;Pydantic AI&lt;/a&gt; and the OpenAI API. When I ran it from the command line, I never hit a timeout. But when I created a Django Admin Action to bulk process videos, I was trying to process them all in one call instead of fanning them out into individual tasks.&lt;/p&gt;
&lt;h2&gt;What Went Wrong?&lt;/h2&gt;
&lt;p&gt;I didn’t have just one bug - I had two, possibly three bugs that weren’t obvious at the time:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Timeout issues&lt;/strong&gt;: Tasks were timing out after 90 seconds when processing large batches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bulk processing&lt;/strong&gt;: Processing all videos in one call instead of individual async tasks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infinite retries&lt;/strong&gt;: I failed to set a maximum number of retry attempts. I assumed that not having a default meant there was a fixed number of retries, not infinite&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That third bug was the killer. My job ran for over 24 hours, burning through over 32 million tokens in the process. In total, I spent over 62 million tokens in November before I found and fixed the issue. Thankfully, my out-of-pocket costs were more than reasonable.&lt;/p&gt;
&lt;h2&gt;What Changed?&lt;/h2&gt;
&lt;p&gt;I could blame this on vibecoding since DjangoTV is &amp;gt;99% vibe coded, but the project was built using sensible defaults and this wasn’t obvious at the time.&lt;/p&gt;
&lt;p&gt;Here’s what I changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;max_attempts&lt;/code&gt; to limit retries&lt;/li&gt;
&lt;li&gt;Kept my 90 second &lt;code&gt;timeout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Spaced out &lt;code&gt;retry&lt;/code&gt; attempts to a few minutes between tries&lt;/li&gt;
&lt;li&gt;Adjusted my &lt;code&gt;parse_presenters_with_ai&lt;/code&gt; and &lt;code&gt;parse_titles_with_ai&lt;/code&gt; Django Admin Actions to queue up one &lt;code&gt;async_task&lt;/code&gt; per Video instead of processing them all in one call&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sometimes the most expensive bugs are the ones that combine multiple small issues into one perfect storm. Granular API keys for tracking, sensible retry limits, and proper task queuing are now non-negotiable in my projects.&lt;/p&gt;
&lt;p&gt;Computers!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Written by Jeff. Edited with &lt;a href="https://grammarly.com"&gt;Grammarly&lt;/a&gt; and &lt;a href="https://claude.ai/code"&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2025/11/22/how-i-accidentally-spent-over/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>The "Vibe Coding Keyboard" How I Made My Walk-and-Talk Setup Even More Awesome</title><link href="https://jefftriplett.com/2025/the-vibe-coding-keyboard-how-i-made-my-walk-and-talk-setup-even-more-awesome/" rel="alternate"/><published>2025-11-20T00:37:48+00:00</published><id>https://jefftriplett.com/2025/the-vibe-coding-keyboard-how-i-made-my-walk-and-talk-setup-even-more-awesome/</id><summary type="html">&lt;p&gt;So, picture this: you’re working at a walking desk, you’ve got a cool voice-to-text tool like &lt;a href="https://goodsnooze.gumroad.com/l/macwhisper"&gt;MacWhisper&lt;/a&gt; running, and you want to control it all with just a couple of dedicated keys. That was the dream that led me to build what I now call my “Vibe Coding Keyboard.”&lt;/p&gt;
&lt;h3&gt;Why Voice Control in the First Place?&lt;/h3&gt;
&lt;p&gt;Before I get into the keyboard itself, let me explain why I’ve gotten so into voice control. A considerable part of my day involves Slack and Discord conversations, and voice mode is high-speed for firing off replies. I also use it to drive Claude Code sessions and other workflows, and it’s just become second nature.&lt;/p&gt;
&lt;p&gt;But the real game changer is the walking desk. When you’re walking and working, typing gets awkward fast. Your arms are in weird positions, and trying to maintain your stride while reaching for your keys just looks clumsy. With voice mode, I can quickly dictate a response to an email or message, clean it up if needed, and keep moving. It’s way more natural than contorting myself to type while walking.&lt;/p&gt;
&lt;h3&gt;Why a Dedicated Keyboard?&lt;/h3&gt;
&lt;p&gt;I already had an Apple Magic Keyboard that I loved. It’s sleek and all, but I kept running into a minor but annoying problem: I was running out of keys to assign to all my voice-control shortcuts. I tried using the function key as a makeshift “vibe” key, but it just wasn’t cutting it.&lt;/p&gt;
&lt;p&gt;So I went looking for the smallest possible external keyboard I could find. I wanted something that would just plug in like a regular HID keyboard, no extra drivers or fancy setup. I originally tried to find a two-key keyboard, but I couldn’t find any that were USB-C. So I went with the &lt;a href="https://www.amazon.com/dp/B0BW15CPTY"&gt;BTXETUEL 4-Key Mechanical Keyboard&lt;/a&gt; instead, and it turned out to be perfect. Its small enough that it doesn’t take up much space, and having four keys actually gives me a bit more flexibility than I originally thought I needed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The BTXETUEL 4-Key Mechanical Keyboard vibing" src="https://cdn.uploads.micro.blog/137490/2025/b388258f45.png" /&gt;### Setting Up the Vibe Keys&lt;/p&gt;
&lt;p&gt;Here’s how I configured it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Key 1:&lt;/strong&gt; My “vibe” key. This one toggles MacWhisper’s dictation mode on and off. I just tap it, and boom, I’m in voice mode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key 2:&lt;/strong&gt; Enter key. Super handy for confirming commands or just hitting “enter” without reaching for my main keyboard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key 3:&lt;/strong&gt; Backspace. Because voice-to-text sometimes needs a quick correction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key 4:&lt;/strong&gt; Escape key. Just a nice little “get me out of here” button if I need to exit a mode or cancel something.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And because I wanted a bit of flair, each key has an LED that can change color. I made the vibe key cycle through a rainbow pattern, so it stands out and literally “vibes.”&lt;/p&gt;
&lt;h3&gt;The Fun of Customization&lt;/h3&gt;
&lt;p&gt;The best part is how customizable this little gadget is. I even 3D-printed some LEGO keycaps just for fun. It’s become a hobby project, and it has made voice coding even more enjoyable for me.&lt;/p&gt;
&lt;h3&gt;A Boost to Productivity (and Fun)&lt;/h3&gt;
&lt;p&gt;In the end, it’s not something you absolutely need, but it’s been a surprisingly nice productivity boost. Plus, it’s just plain cool to have a dedicated vibe key that lights up in rainbow colors while you work. If you’re into voice mode coding or want a fun little side project, give something like this a try!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Written by Jeff. Dictated via &lt;a href="https://chatgpt.com"&gt;ChatGPT 5.1&lt;/a&gt;. Edited with &lt;a href="https://grammarly.com"&gt;Grammarly&lt;/a&gt; and &lt;a href="https://claude.ai/code"&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2025/11/19/the-vibe-coding-keyboard-how/&lt;/p&gt;</summary><category term="micro.blog"/></entry><entry><title>📅 Office Hours for November</title><link href="https://jefftriplett.com/2025/office-hours-for-november/" rel="alternate"/><published>2025-11-13T23:08:22+00:00</published><id>https://jefftriplett.com/2025/office-hours-for-november/</id><summary type="html">&lt;p&gt;I’m hosting office hours on the next two Fridays in November.&lt;/p&gt;
&lt;h2&gt;Office Hours Schedule&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://time.is/0230PM_14_November_2025_in_CT"&gt;Friday, November 14, 2025, 2:30 pm to 4:30 pm CT&lt;/a&gt;&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Starting at 2pm CT, I’ll be working on some community/open source projects if anyone wants to see Claude Code or Claude Code on the web in action&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://time.is/0230PM_21_November_2025_in_CT"&gt;Friday, November 21, 2025, 2:30 pm to 4:30 pm CT&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;🦃 &lt;strong&gt;Friday, November 28th - No office hours due to US Thanksgiving&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Join Us&lt;/h2&gt;
&lt;p&gt;These sessions are open to anyone, especially those working remotely who wants to connect with others. It’s a collaborative space for discussions, catch-ups, or just hanging out while you work.&lt;/p&gt;
&lt;p&gt;While we have a bunch of Python and Django developers who regularly attend, anyone is welcome to join even if you don’t use either of these things.&lt;/p&gt;
&lt;p&gt;Whether you’re a first-time attendee or a regular, you’re welcome to drop in anytime during the session. No need to stay for the full two hours, come and go as your schedule allows.&lt;/p&gt;
&lt;h2&gt;How to Join&lt;/h2&gt;
&lt;p&gt;The Zoom link is available in the gist from our previous sessions. Feel free to reach out if you need the details.&lt;/p&gt;
&lt;h2&gt;ℹ️ Meeting Guidelines&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🔕 Please mute when someone else is talking 👈&lt;/li&gt;
&lt;li&gt;👍 Be respectful to other people and mute when not talking&lt;/li&gt;
&lt;li&gt;👍 Be mindful of the spirit of the &lt;a href="https://policies.python.org/python.org/code-of-conduct/"&gt;Python Code of Conduct&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;👍 Be mindful and respectful of everyone’s time.&lt;/li&gt;
&lt;li&gt;👍 Join because you want to work on something with a small group&lt;/li&gt;
&lt;li&gt;⚠️ No marketing your product or service&lt;/li&gt;
&lt;li&gt;⚠️ No meeting/recording bots. Humans are welcome. Meeting bots are not.&lt;/li&gt;
&lt;li&gt;⚠️ Mute!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See you there!&lt;/p&gt;
&lt;p&gt;Originally posted on: https://micro.webology.dev/2025/11/13/office-hours-for-november/&lt;/p&gt;</summary><category term="micro.blog"/></entry></feed>