<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>CincyGeek</title>
    <link>https://www.cincygeek.com/</link>
    <description>Local AI, self-hosting, and the maker bench. A logbook from just north of Cincinnati.</description>
    <language>en-us</language>
    <atom:link href="https://www.cincygeek.com/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>The new CincyGeek: a logbook, not a channel</title>
      <link>https://www.cincygeek.com/logs/welcome-to-the-logbook/</link>
      <guid isPermaLink="true">https://www.cincygeek.com/logs/welcome-to-the-logbook/</guid>
      <pubDate>Sun, 01 Nov 2026 12:00:00 +0000</pubDate>
      <category>Self-hosting</category>
      <description>&lt;p&gt;CincyGeek used to be a plan for motorcycle vlogs, gaming streams, and 3D printing videos. Honestly? Video is a lot of work, and that corner of the internet is crowded.&lt;/p&gt;
&lt;p&gt;So the site is changing. From now on it&#39;s a &lt;strong&gt;logbook&lt;/strong&gt; for the things I actually spend my evenings on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local AI on Windows&lt;/strong&gt; — running models in LM Studio and building tools around them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosting&lt;/strong&gt; — my own VPS, Docker, and a private hosting panel I built.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maker bench&lt;/strong&gt; — 3D printing, coming back after Black Friday.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-posts-work-here&quot;&gt;How posts work here&lt;/h2&gt;
&lt;p&gt;Every post is a build log. Each one tries to answer the same four questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What was I trying to do?&lt;/li&gt;
&lt;li&gt;What did I try?&lt;/li&gt;
&lt;li&gt;What broke?&lt;/li&gt;
&lt;li&gt;What finally worked — with the script or config you can copy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;how-this-site-is-built&quot;&gt;How this site is built&lt;/h2&gt;
&lt;p&gt;Fittingly, the site itself is a small self-hosted project. Posts are Markdown files in a folder. A PowerShell script turns them into plain HTML, and the result runs in a container on my own server.&lt;/p&gt;
&lt;p&gt;No database, no WordPress updates, nothing to log in to.&lt;/p&gt;
&lt;p&gt;If you want new logs as they land, grab the &lt;a href=&quot;/feed.xml&quot;&gt;RSS feed&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Counting every token: reading LM Studio&#39;s server logs</title>
      <link>https://www.cincygeek.com/logs/lm-studio-token-logs/</link>
      <guid isPermaLink="true">https://www.cincygeek.com/logs/lm-studio-token-logs/</guid>
      <pubDate>Sun, 01 Nov 2026 12:00:00 +0000</pubDate>
      <category>Local AI on Windows</category>
      <description>&lt;p&gt;When you pay for a cloud model, you get a usage dashboard whether you want one or not. When the model runs on your own PC, you get nothing. I wanted the same view for my local models: how many tokens they&#39;re chewing through, how fast, and which model is doing the work.&lt;/p&gt;
&lt;p&gt;LM Studio already has the numbers. They&#39;re just buried in its server logs.&lt;/p&gt;
&lt;h2 id=&quot;where-lm-studio-keeps-its-logs&quot;&gt;Where LM Studio keeps its logs&lt;/h2&gt;
&lt;p&gt;The usual place is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;%USERPROFILE%\.lmstudio\server-logs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But some setups write to a folder under &lt;code&gt;apps&lt;/code&gt; instead, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;%USERPROFILE%\.lmstudio\apps\bionic\server-logs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A single PC can have &lt;strong&gt;both&lt;/strong&gt;. If you only read one, your totals quietly come up short. So the first rule was: find every server-logs folder and read each one separately.&lt;/p&gt;
&lt;h2 id=&quot;whats-actually-in-a-log&quot;&gt;What&#39;s actually in a log&lt;/h2&gt;
&lt;p&gt;After every request, LM Studio&#39;s server writes a timing block. It looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;slot print_timing: id 0 | task 0 | prompt eval time = 1000.00 ms / 1000 tokens ( 1.00 ms per token, 1000.00 tokens per second)
slot print_timing: id 0 | task 0 |        eval time = 2000.00 ms /  100 tokens (20.00 ms per token,   50.00 tokens per second)
slot print_timing: id 0 | task 0 |       total time = 3000.00 ms / 1100 tokens
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s everything I need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;prompt eval&lt;/strong&gt; — how many prompt tokens were read, and how fast&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;eval&lt;/strong&gt; — how many tokens were generated, and how fast&lt;/li&gt;
&lt;li&gt;the speed lines while it runs (&lt;code&gt;tg = 50.00 t/s&lt;/code&gt;), for a live tokens-per-second number&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The core of it is one small pattern that pulls the milliseconds and the token count out of each line:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;=\s*([\d.]+)\s*ms\s*/\s*(\d+)\s*tokens
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;things-that-will-trip-you-up&quot;&gt;Things that will trip you up&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No timing lines at all?&lt;/strong&gt; Open a log file and search for &lt;code&gt;print_timing&lt;/code&gt;. If it isn&#39;t there, raise the server&#39;s log level in LM Studio&#39;s server/developer settings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Only API traffic is logged.&lt;/strong&gt; These logs cover requests to LM Studio&#39;s local server (&lt;code&gt;http://localhost:1234&lt;/code&gt;) from apps, agents and scripts. Chats in LM Studio&#39;s own chat window may not show up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompts can contain text that looks like log lines.&lt;/strong&gt; Logs include the request body, so a prompt can hold something that looks like a log entry. The parser has to tell real log lines from text inside a prompt. That case has its own test.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thinking tokens count.&lt;/strong&gt; Generated tokens include reasoning tokens, so &amp;quot;thinking&amp;quot; models look busier than their visible answers suggest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cancelled requests don&#39;t log a timing block&lt;/strong&gt;, so they aren&#39;t counted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-came-out-of-it-localtokens&quot;&gt;What came out of it: LocalTokens&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/img/projects/localtokens.png&quot; alt=&quot;The LocalTokens window showing 34.6k tokens this session, generation speed and context use&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I turned all of this into &lt;strong&gt;LocalTokens&lt;/strong&gt;, a small always-on window and tray icon for Windows. It shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tokens this session, today, this week and all time, per model&lt;/li&gt;
&lt;li&gt;live generation speed, and whether the model is reading a prompt or generating&lt;/li&gt;
&lt;li&gt;context use against the loaded context size&lt;/li&gt;
&lt;li&gt;how much of the prompt LM Studio served from its cache&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On first run it reads your old logs too, so your totals start from the oldest log you have, not from the day you installed it.&lt;/p&gt;
&lt;p&gt;It&#39;s plain PowerShell and WPF, both built into Windows. No Python, no Node, no installer. It only reads LM Studio&#39;s log files and asks the local server which models are loaded. Nothing leaves your PC.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get it here:&lt;/strong&gt; &lt;a href=&quot;https://github.com/cincygeek/localtokens-widget&quot;&gt;LocalTokens on GitHub&lt;/a&gt;. It&#39;s free and MIT-licensed. Grab the zip from Releases, unblock it, and double-click &lt;code&gt;LocalTokens.vbs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If the numbers look wrong on your setup, &lt;a href=&quot;https://github.com/cincygeek/localtokens-widget/issues&quot;&gt;open an issue&lt;/a&gt;. Odd log folders are exactly the kind of thing I want to hear about.&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>