feat(post): .NET tools roll-forward article, dated 11 Aug 2026 - #23

Merged
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major
Aug 7, 2026
Merged

feat(post): .NET tools roll-forward article, dated 11 Aug 2026#23
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major

Conversation

@solrevdev

@solrevdevsolrevdev commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Adds the article on why a .NET global tool stops working when the runtime it targets is no longer installed, and moves the publishing script into this repo.

The post

A net8.0 tool will not start on a machine carrying only the .NET 10 runtime. Roll-forward does not cross major version boundaries by default. Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed with one MSBuild property, <RollForward>Major</RollForward>. Also covers why global.json is the wrong tool for this, and the --allow-roll-forward install flag users can fall back on.

Timely: .NET 8 and .NET 9 both reach end of support on 10 November 2026.

The matching one-line fix to the tool itself is solrevdev/seedfolder#23. Merge that one first, so anyone following the post to the repo finds the property already there.

Publishing

Dated 2026-08-11, so Jekyll excludes it from every build until that date. Merging this does not publish it.

On or after Tuesday 11 August:

script/publish-post 2026-08-11 dotnet-tools-roll-forward-major-version --yes

Tuesday was chosen from traffic research: the Dew Drop publishes weekdays around 10:30 UTC and never at weekends, and Monday editions run about 40% longer so a link competes with more of them.

The script move

script/publish-post used to live in ~/Dropbox/_shared/scripts/ as seedfolder-blog-publish-future-post.sh, and AGENTS.md pointed at a third path that no longer existed.

It only ever drives this blog: it names the repo, builds it, checks master, reads _config.yml. So it now sits alongside script/cibuild using the same bare-verb naming, and REPO_PATH is derived from the script's own location instead of a hardcoded /Users path, so it works in any clone on any machine.

The old "seedfolder" prefix was a misnomer. The script has nothing to do with that project.

script is already in the exclude: list in _config.yml, so none of it is served from the site.

Verified

  • Build without --future excludes the post, so it stays invisible until Tuesday
  • Build with --future renders it correctly
  • Canonical URL, meta description, og:image pointing at the PNG, twitter:card as summary_large_image
  • PNG is exactly 1200x630, SVG is 2.4KB
  • Appears on the home page and archive listings
  • script/ does not reach the built site
  • The script's date guard correctly refuses to run before 11 August, and its repo-root derivation resolves correctly when invoked from another directory

🤖 Generated with Claude Code

A net8.0 global tool will not start on a machine that has only the .NET 10
runtime, because roll-forward does not cross major version boundaries.
Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed
with <RollForward>Major</RollForward>.
The post is dated 2026-08-11, so Jekyll excludes it from every build until
that date. Publish it by triggering a Pages build on or after the date.
Also correct the publish script path in AGENTS.md. The script lives in
~/Dropbox/_shared/scripts/, not the weekly to-do folder.
The script only ever drives this blog. It names the repo, runs
`bundle exec jekyll build` against it, checks that the branch is master and
reads `_config.yml`. It has no other consumer, so keeping it in Dropbox meant
AGENTS.md pointed outside the repository and the script could drift from the
thing it operates on.
It now lives at script/publish-post, alongside the existing script/cibuild,
and follows the same bare-verb naming. The old name carried a "seedfolder"
prefix, which was a misnomer: the script has nothing to do with that project.
REPO_PATH is now derived from the script's own location rather than a
hardcoded /Users path, so it runs from any clone on any machine and from any
working directory.
`script` is already in the exclude list in _config.yml, so none of this is
served from the site. Verified with a build.
@solrevdev
solrevdev merged commit f0c3e09 into masterAug 7, 2026
1 check passed
@solrevdev
solrevdev deleted the post/dotnet-rollforward-major branch August 7, 2026 07:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@solrevdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(post): .NET tools roll-forward article, dated 11 Aug 2026 - #23

Merged
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major
Aug 7, 2026
Merged

feat(post): .NET tools roll-forward article, dated 11 Aug 2026#23
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major

Conversation

@solrevdev

@solrevdevsolrevdev commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Adds the article on why a .NET global tool stops working when the runtime it targets is no longer installed, and moves the publishing script into this repo.

The post

A net8.0 tool will not start on a machine carrying only the .NET 10 runtime. Roll-forward does not cross major version boundaries by default. Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed with one MSBuild property, <RollForward>Major</RollForward>. Also covers why global.json is the wrong tool for this, and the --allow-roll-forward install flag users can fall back on.

Timely: .NET 8 and .NET 9 both reach end of support on 10 November 2026.

The matching one-line fix to the tool itself is solrevdev/seedfolder#23. Merge that one first, so anyone following the post to the repo finds the property already there.

Publishing

Dated 2026-08-11, so Jekyll excludes it from every build until that date. Merging this does not publish it.

On or after Tuesday 11 August:

script/publish-post 2026-08-11 dotnet-tools-roll-forward-major-version --yes

Tuesday was chosen from traffic research: the Dew Drop publishes weekdays around 10:30 UTC and never at weekends, and Monday editions run about 40% longer so a link competes with more of them.

The script move

script/publish-post used to live in ~/Dropbox/_shared/scripts/ as seedfolder-blog-publish-future-post.sh, and AGENTS.md pointed at a third path that no longer existed.

It only ever drives this blog: it names the repo, builds it, checks master, reads _config.yml. So it now sits alongside script/cibuild using the same bare-verb naming, and REPO_PATH is derived from the script's own location instead of a hardcoded /Users path, so it works in any clone on any machine.

The old "seedfolder" prefix was a misnomer. The script has nothing to do with that project.

script is already in the exclude: list in _config.yml, so none of it is served from the site.

Verified

  • Build without --future excludes the post, so it stays invisible until Tuesday
  • Build with --future renders it correctly
  • Canonical URL, meta description, og:image pointing at the PNG, twitter:card as summary_large_image
  • PNG is exactly 1200x630, SVG is 2.4KB
  • Appears on the home page and archive listings
  • script/ does not reach the built site
  • The script's date guard correctly refuses to run before 11 August, and its repo-root derivation resolves correctly when invoked from another directory

🤖 Generated with Claude Code

A net8.0 global tool will not start on a machine that has only the .NET 10
runtime, because roll-forward does not cross major version boundaries.
Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed
with <RollForward>Major</RollForward>.
The post is dated 2026-08-11, so Jekyll excludes it from every build until
that date. Publish it by triggering a Pages build on or after the date.
Also correct the publish script path in AGENTS.md. The script lives in
~/Dropbox/_shared/scripts/, not the weekly to-do folder.
The script only ever drives this blog. It names the repo, runs
`bundle exec jekyll build` against it, checks that the branch is master and
reads `_config.yml`. It has no other consumer, so keeping it in Dropbox meant
AGENTS.md pointed outside the repository and the script could drift from the
thing it operates on.
It now lives at script/publish-post, alongside the existing script/cibuild,
and follows the same bare-verb naming. The old name carried a "seedfolder"
prefix, which was a misnomer: the script has nothing to do with that project.
REPO_PATH is now derived from the script's own location rather than a
hardcoded /Users path, so it runs from any clone on any machine and from any
working directory.
`script` is already in the exclude list in _config.yml, so none of this is
served from the site. Verified with a build.
@solrevdev
solrevdev merged commit f0c3e09 into masterAug 7, 2026
1 check passed
@solrevdev
solrevdev deleted the post/dotnet-rollforward-major branch August 7, 2026 07:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@solrevdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(post): .NET tools roll-forward article, dated 11 Aug 2026 - #23

Merged
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major
Aug 7, 2026
Merged

feat(post): .NET tools roll-forward article, dated 11 Aug 2026#23
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major

Conversation

@solrevdev

@solrevdevsolrevdev commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Adds the article on why a .NET global tool stops working when the runtime it targets is no longer installed, and moves the publishing script into this repo.

The post

A net8.0 tool will not start on a machine carrying only the .NET 10 runtime. Roll-forward does not cross major version boundaries by default. Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed with one MSBuild property, <RollForward>Major</RollForward>. Also covers why global.json is the wrong tool for this, and the --allow-roll-forward install flag users can fall back on.

Timely: .NET 8 and .NET 9 both reach end of support on 10 November 2026.

The matching one-line fix to the tool itself is solrevdev/seedfolder#23. Merge that one first, so anyone following the post to the repo finds the property already there.

Publishing

Dated 2026-08-11, so Jekyll excludes it from every build until that date. Merging this does not publish it.

On or after Tuesday 11 August:

script/publish-post 2026-08-11 dotnet-tools-roll-forward-major-version --yes

Tuesday was chosen from traffic research: the Dew Drop publishes weekdays around 10:30 UTC and never at weekends, and Monday editions run about 40% longer so a link competes with more of them.

The script move

script/publish-post used to live in ~/Dropbox/_shared/scripts/ as seedfolder-blog-publish-future-post.sh, and AGENTS.md pointed at a third path that no longer existed.

It only ever drives this blog: it names the repo, builds it, checks master, reads _config.yml. So it now sits alongside script/cibuild using the same bare-verb naming, and REPO_PATH is derived from the script's own location instead of a hardcoded /Users path, so it works in any clone on any machine.

The old "seedfolder" prefix was a misnomer. The script has nothing to do with that project.

script is already in the exclude: list in _config.yml, so none of it is served from the site.

Verified

  • Build without --future excludes the post, so it stays invisible until Tuesday
  • Build with --future renders it correctly
  • Canonical URL, meta description, og:image pointing at the PNG, twitter:card as summary_large_image
  • PNG is exactly 1200x630, SVG is 2.4KB
  • Appears on the home page and archive listings
  • script/ does not reach the built site
  • The script's date guard correctly refuses to run before 11 August, and its repo-root derivation resolves correctly when invoked from another directory

🤖 Generated with Claude Code

A net8.0 global tool will not start on a machine that has only the .NET 10
runtime, because roll-forward does not cross major version boundaries.
Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed
with <RollForward>Major</RollForward>.
The post is dated 2026-08-11, so Jekyll excludes it from every build until
that date. Publish it by triggering a Pages build on or after the date.
Also correct the publish script path in AGENTS.md. The script lives in
~/Dropbox/_shared/scripts/, not the weekly to-do folder.
The script only ever drives this blog. It names the repo, runs
`bundle exec jekyll build` against it, checks that the branch is master and
reads `_config.yml`. It has no other consumer, so keeping it in Dropbox meant
AGENTS.md pointed outside the repository and the script could drift from the
thing it operates on.
It now lives at script/publish-post, alongside the existing script/cibuild,
and follows the same bare-verb naming. The old name carried a "seedfolder"
prefix, which was a misnomer: the script has nothing to do with that project.
REPO_PATH is now derived from the script's own location rather than a
hardcoded /Users path, so it runs from any clone on any machine and from any
working directory.
`script` is already in the exclude list in _config.yml, so none of this is
served from the site. Verified with a build.
@solrevdev
solrevdev merged commit f0c3e09 into masterAug 7, 2026
1 check passed
@solrevdev
solrevdev deleted the post/dotnet-rollforward-major branch August 7, 2026 07:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@solrevdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(post): .NET tools roll-forward article, dated 11 Aug 2026 - #23

Merged
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major
Aug 7, 2026
Merged

feat(post): .NET tools roll-forward article, dated 11 Aug 2026#23
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major

Conversation

@solrevdev

@solrevdevsolrevdev commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Adds the article on why a .NET global tool stops working when the runtime it targets is no longer installed, and moves the publishing script into this repo.

The post

A net8.0 tool will not start on a machine carrying only the .NET 10 runtime. Roll-forward does not cross major version boundaries by default. Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed with one MSBuild property, <RollForward>Major</RollForward>. Also covers why global.json is the wrong tool for this, and the --allow-roll-forward install flag users can fall back on.

Timely: .NET 8 and .NET 9 both reach end of support on 10 November 2026.

The matching one-line fix to the tool itself is solrevdev/seedfolder#23. Merge that one first, so anyone following the post to the repo finds the property already there.

Publishing

Dated 2026-08-11, so Jekyll excludes it from every build until that date. Merging this does not publish it.

On or after Tuesday 11 August:

script/publish-post 2026-08-11 dotnet-tools-roll-forward-major-version --yes

Tuesday was chosen from traffic research: the Dew Drop publishes weekdays around 10:30 UTC and never at weekends, and Monday editions run about 40% longer so a link competes with more of them.

The script move

script/publish-post used to live in ~/Dropbox/_shared/scripts/ as seedfolder-blog-publish-future-post.sh, and AGENTS.md pointed at a third path that no longer existed.

It only ever drives this blog: it names the repo, builds it, checks master, reads _config.yml. So it now sits alongside script/cibuild using the same bare-verb naming, and REPO_PATH is derived from the script's own location instead of a hardcoded /Users path, so it works in any clone on any machine.

The old "seedfolder" prefix was a misnomer. The script has nothing to do with that project.

script is already in the exclude: list in _config.yml, so none of it is served from the site.

Verified

  • Build without --future excludes the post, so it stays invisible until Tuesday
  • Build with --future renders it correctly
  • Canonical URL, meta description, og:image pointing at the PNG, twitter:card as summary_large_image
  • PNG is exactly 1200x630, SVG is 2.4KB
  • Appears on the home page and archive listings
  • script/ does not reach the built site
  • The script's date guard correctly refuses to run before 11 August, and its repo-root derivation resolves correctly when invoked from another directory

🤖 Generated with Claude Code

A net8.0 global tool will not start on a machine that has only the .NET 10
runtime, because roll-forward does not cross major version boundaries.
Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed
with <RollForward>Major</RollForward>.
The post is dated 2026-08-11, so Jekyll excludes it from every build until
that date. Publish it by triggering a Pages build on or after the date.
Also correct the publish script path in AGENTS.md. The script lives in
~/Dropbox/_shared/scripts/, not the weekly to-do folder.
The script only ever drives this blog. It names the repo, runs
`bundle exec jekyll build` against it, checks that the branch is master and
reads `_config.yml`. It has no other consumer, so keeping it in Dropbox meant
AGENTS.md pointed outside the repository and the script could drift from the
thing it operates on.
It now lives at script/publish-post, alongside the existing script/cibuild,
and follows the same bare-verb naming. The old name carried a "seedfolder"
prefix, which was a misnomer: the script has nothing to do with that project.
REPO_PATH is now derived from the script's own location rather than a
hardcoded /Users path, so it runs from any clone on any machine and from any
working directory.
`script` is already in the exclude list in _config.yml, so none of this is
served from the site. Verified with a build.
@solrevdev
solrevdev merged commit f0c3e09 into masterAug 7, 2026
1 check passed
@solrevdev
solrevdev deleted the post/dotnet-rollforward-major branch August 7, 2026 07:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@solrevdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(post): .NET tools roll-forward article, dated 11 Aug 2026 - #23

Merged
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major
Aug 7, 2026
Merged

feat(post): .NET tools roll-forward article, dated 11 Aug 2026#23
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major

Conversation

@solrevdev

@solrevdevsolrevdev commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Adds the article on why a .NET global tool stops working when the runtime it targets is no longer installed, and moves the publishing script into this repo.

The post

A net8.0 tool will not start on a machine carrying only the .NET 10 runtime. Roll-forward does not cross major version boundaries by default. Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed with one MSBuild property, <RollForward>Major</RollForward>. Also covers why global.json is the wrong tool for this, and the --allow-roll-forward install flag users can fall back on.

Timely: .NET 8 and .NET 9 both reach end of support on 10 November 2026.

The matching one-line fix to the tool itself is solrevdev/seedfolder#23. Merge that one first, so anyone following the post to the repo finds the property already there.

Publishing

Dated 2026-08-11, so Jekyll excludes it from every build until that date. Merging this does not publish it.

On or after Tuesday 11 August:

script/publish-post 2026-08-11 dotnet-tools-roll-forward-major-version --yes

Tuesday was chosen from traffic research: the Dew Drop publishes weekdays around 10:30 UTC and never at weekends, and Monday editions run about 40% longer so a link competes with more of them.

The script move

script/publish-post used to live in ~/Dropbox/_shared/scripts/ as seedfolder-blog-publish-future-post.sh, and AGENTS.md pointed at a third path that no longer existed.

It only ever drives this blog: it names the repo, builds it, checks master, reads _config.yml. So it now sits alongside script/cibuild using the same bare-verb naming, and REPO_PATH is derived from the script's own location instead of a hardcoded /Users path, so it works in any clone on any machine.

The old "seedfolder" prefix was a misnomer. The script has nothing to do with that project.

script is already in the exclude: list in _config.yml, so none of it is served from the site.

Verified

  • Build without --future excludes the post, so it stays invisible until Tuesday
  • Build with --future renders it correctly
  • Canonical URL, meta description, og:image pointing at the PNG, twitter:card as summary_large_image
  • PNG is exactly 1200x630, SVG is 2.4KB
  • Appears on the home page and archive listings
  • script/ does not reach the built site
  • The script's date guard correctly refuses to run before 11 August, and its repo-root derivation resolves correctly when invoked from another directory

🤖 Generated with Claude Code

A net8.0 global tool will not start on a machine that has only the .NET 10
runtime, because roll-forward does not cross major version boundaries.
Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed
with <RollForward>Major</RollForward>.
The post is dated 2026-08-11, so Jekyll excludes it from every build until
that date. Publish it by triggering a Pages build on or after the date.
Also correct the publish script path in AGENTS.md. The script lives in
~/Dropbox/_shared/scripts/, not the weekly to-do folder.
The script only ever drives this blog. It names the repo, runs
`bundle exec jekyll build` against it, checks that the branch is master and
reads `_config.yml`. It has no other consumer, so keeping it in Dropbox meant
AGENTS.md pointed outside the repository and the script could drift from the
thing it operates on.
It now lives at script/publish-post, alongside the existing script/cibuild,
and follows the same bare-verb naming. The old name carried a "seedfolder"
prefix, which was a misnomer: the script has nothing to do with that project.
REPO_PATH is now derived from the script's own location rather than a
hardcoded /Users path, so it runs from any clone on any machine and from any
working directory.
`script` is already in the exclude list in _config.yml, so none of this is
served from the site. Verified with a build.
@solrevdev
solrevdev merged commit f0c3e09 into masterAug 7, 2026
1 check passed
@solrevdev
solrevdev deleted the post/dotnet-rollforward-major branch August 7, 2026 07:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@solrevdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(post): .NET tools roll-forward article, dated 11 Aug 2026 - #23

Merged
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major
Aug 7, 2026
Merged

feat(post): .NET tools roll-forward article, dated 11 Aug 2026#23
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major

Conversation

@solrevdev

@solrevdevsolrevdev commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Adds the article on why a .NET global tool stops working when the runtime it targets is no longer installed, and moves the publishing script into this repo.

The post

A net8.0 tool will not start on a machine carrying only the .NET 10 runtime. Roll-forward does not cross major version boundaries by default. Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed with one MSBuild property, <RollForward>Major</RollForward>. Also covers why global.json is the wrong tool for this, and the --allow-roll-forward install flag users can fall back on.

Timely: .NET 8 and .NET 9 both reach end of support on 10 November 2026.

The matching one-line fix to the tool itself is solrevdev/seedfolder#23. Merge that one first, so anyone following the post to the repo finds the property already there.

Publishing

Dated 2026-08-11, so Jekyll excludes it from every build until that date. Merging this does not publish it.

On or after Tuesday 11 August:

script/publish-post 2026-08-11 dotnet-tools-roll-forward-major-version --yes

Tuesday was chosen from traffic research: the Dew Drop publishes weekdays around 10:30 UTC and never at weekends, and Monday editions run about 40% longer so a link competes with more of them.

The script move

script/publish-post used to live in ~/Dropbox/_shared/scripts/ as seedfolder-blog-publish-future-post.sh, and AGENTS.md pointed at a third path that no longer existed.

It only ever drives this blog: it names the repo, builds it, checks master, reads _config.yml. So it now sits alongside script/cibuild using the same bare-verb naming, and REPO_PATH is derived from the script's own location instead of a hardcoded /Users path, so it works in any clone on any machine.

The old "seedfolder" prefix was a misnomer. The script has nothing to do with that project.

script is already in the exclude: list in _config.yml, so none of it is served from the site.

Verified

  • Build without --future excludes the post, so it stays invisible until Tuesday
  • Build with --future renders it correctly
  • Canonical URL, meta description, og:image pointing at the PNG, twitter:card as summary_large_image
  • PNG is exactly 1200x630, SVG is 2.4KB
  • Appears on the home page and archive listings
  • script/ does not reach the built site
  • The script's date guard correctly refuses to run before 11 August, and its repo-root derivation resolves correctly when invoked from another directory

🤖 Generated with Claude Code

A net8.0 global tool will not start on a machine that has only the .NET 10
runtime, because roll-forward does not cross major version boundaries.
Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed
with <RollForward>Major</RollForward>.
The post is dated 2026-08-11, so Jekyll excludes it from every build until
that date. Publish it by triggering a Pages build on or after the date.
Also correct the publish script path in AGENTS.md. The script lives in
~/Dropbox/_shared/scripts/, not the weekly to-do folder.
The script only ever drives this blog. It names the repo, runs
`bundle exec jekyll build` against it, checks that the branch is master and
reads `_config.yml`. It has no other consumer, so keeping it in Dropbox meant
AGENTS.md pointed outside the repository and the script could drift from the
thing it operates on.
It now lives at script/publish-post, alongside the existing script/cibuild,
and follows the same bare-verb naming. The old name carried a "seedfolder"
prefix, which was a misnomer: the script has nothing to do with that project.
REPO_PATH is now derived from the script's own location rather than a
hardcoded /Users path, so it runs from any clone on any machine and from any
working directory.
`script` is already in the exclude list in _config.yml, so none of this is
served from the site. Verified with a build.
@solrevdev
solrevdev merged commit f0c3e09 into masterAug 7, 2026
1 check passed
@solrevdev
solrevdev deleted the post/dotnet-rollforward-major branch August 7, 2026 07:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@solrevdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(post): .NET tools roll-forward article, dated 11 Aug 2026 - #23

Merged
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major
Aug 7, 2026
Merged

feat(post): .NET tools roll-forward article, dated 11 Aug 2026#23
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major

Conversation

@solrevdev

@solrevdevsolrevdev commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Adds the article on why a .NET global tool stops working when the runtime it targets is no longer installed, and moves the publishing script into this repo.

The post

A net8.0 tool will not start on a machine carrying only the .NET 10 runtime. Roll-forward does not cross major version boundaries by default. Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed with one MSBuild property, <RollForward>Major</RollForward>. Also covers why global.json is the wrong tool for this, and the --allow-roll-forward install flag users can fall back on.

Timely: .NET 8 and .NET 9 both reach end of support on 10 November 2026.

The matching one-line fix to the tool itself is solrevdev/seedfolder#23. Merge that one first, so anyone following the post to the repo finds the property already there.

Publishing

Dated 2026-08-11, so Jekyll excludes it from every build until that date. Merging this does not publish it.

On or after Tuesday 11 August:

script/publish-post 2026-08-11 dotnet-tools-roll-forward-major-version --yes

Tuesday was chosen from traffic research: the Dew Drop publishes weekdays around 10:30 UTC and never at weekends, and Monday editions run about 40% longer so a link competes with more of them.

The script move

script/publish-post used to live in ~/Dropbox/_shared/scripts/ as seedfolder-blog-publish-future-post.sh, and AGENTS.md pointed at a third path that no longer existed.

It only ever drives this blog: it names the repo, builds it, checks master, reads _config.yml. So it now sits alongside script/cibuild using the same bare-verb naming, and REPO_PATH is derived from the script's own location instead of a hardcoded /Users path, so it works in any clone on any machine.

The old "seedfolder" prefix was a misnomer. The script has nothing to do with that project.

script is already in the exclude: list in _config.yml, so none of it is served from the site.

Verified

  • Build without --future excludes the post, so it stays invisible until Tuesday
  • Build with --future renders it correctly
  • Canonical URL, meta description, og:image pointing at the PNG, twitter:card as summary_large_image
  • PNG is exactly 1200x630, SVG is 2.4KB
  • Appears on the home page and archive listings
  • script/ does not reach the built site
  • The script's date guard correctly refuses to run before 11 August, and its repo-root derivation resolves correctly when invoked from another directory

🤖 Generated with Claude Code

A net8.0 global tool will not start on a machine that has only the .NET 10
runtime, because roll-forward does not cross major version boundaries.
Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed
with <RollForward>Major</RollForward>.
The post is dated 2026-08-11, so Jekyll excludes it from every build until
that date. Publish it by triggering a Pages build on or after the date.
Also correct the publish script path in AGENTS.md. The script lives in
~/Dropbox/_shared/scripts/, not the weekly to-do folder.
The script only ever drives this blog. It names the repo, runs
`bundle exec jekyll build` against it, checks that the branch is master and
reads `_config.yml`. It has no other consumer, so keeping it in Dropbox meant
AGENTS.md pointed outside the repository and the script could drift from the
thing it operates on.
It now lives at script/publish-post, alongside the existing script/cibuild,
and follows the same bare-verb naming. The old name carried a "seedfolder"
prefix, which was a misnomer: the script has nothing to do with that project.
REPO_PATH is now derived from the script's own location rather than a
hardcoded /Users path, so it runs from any clone on any machine and from any
working directory.
`script` is already in the exclude list in _config.yml, so none of this is
served from the site. Verified with a build.
@solrevdev
solrevdev merged commit f0c3e09 into masterAug 7, 2026
1 check passed
@solrevdev
solrevdev deleted the post/dotnet-rollforward-major branch August 7, 2026 07:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@solrevdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(post): .NET tools roll-forward article, dated 11 Aug 2026 - #23

Merged
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major
Aug 7, 2026
Merged

feat(post): .NET tools roll-forward article, dated 11 Aug 2026#23
solrevdev merged 2 commits into
masterfrom
post/dotnet-rollforward-major

Conversation

@solrevdev

@solrevdevsolrevdev commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Adds the article on why a .NET global tool stops working when the runtime it targets is no longer installed, and moves the publishing script into this repo.

The post

A net8.0 tool will not start on a machine carrying only the .NET 10 runtime. Roll-forward does not cross major version boundaries by default. Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed with one MSBuild property, <RollForward>Major</RollForward>. Also covers why global.json is the wrong tool for this, and the --allow-roll-forward install flag users can fall back on.

Timely: .NET 8 and .NET 9 both reach end of support on 10 November 2026.

The matching one-line fix to the tool itself is solrevdev/seedfolder#23. Merge that one first, so anyone following the post to the repo finds the property already there.

Publishing

Dated 2026-08-11, so Jekyll excludes it from every build until that date. Merging this does not publish it.

On or after Tuesday 11 August:

script/publish-post 2026-08-11 dotnet-tools-roll-forward-major-version --yes

Tuesday was chosen from traffic research: the Dew Drop publishes weekdays around 10:30 UTC and never at weekends, and Monday editions run about 40% longer so a link competes with more of them.

The script move

script/publish-post used to live in ~/Dropbox/_shared/scripts/ as seedfolder-blog-publish-future-post.sh, and AGENTS.md pointed at a third path that no longer existed.

It only ever drives this blog: it names the repo, builds it, checks master, reads _config.yml. So it now sits alongside script/cibuild using the same bare-verb naming, and REPO_PATH is derived from the script's own location instead of a hardcoded /Users path, so it works in any clone on any machine.

The old "seedfolder" prefix was a misnomer. The script has nothing to do with that project.

script is already in the exclude: list in _config.yml, so none of it is served from the site.

Verified

  • Build without --future excludes the post, so it stays invisible until Tuesday
  • Build with --future renders it correctly
  • Canonical URL, meta description, og:image pointing at the PNG, twitter:card as summary_large_image
  • PNG is exactly 1200x630, SVG is 2.4KB
  • Appears on the home page and archive listings
  • script/ does not reach the built site
  • The script's date guard correctly refuses to run before 11 August, and its repo-root derivation resolves correctly when invoked from another directory

🤖 Generated with Claude Code

A net8.0 global tool will not start on a machine that has only the .NET 10
runtime, because roll-forward does not cross major version boundaries.
Reproduced in Docker against mcr.microsoft.com/dotnet/sdk:10.0 and fixed
with <RollForward>Major</RollForward>.
The post is dated 2026-08-11, so Jekyll excludes it from every build until
that date. Publish it by triggering a Pages build on or after the date.
Also correct the publish script path in AGENTS.md. The script lives in
~/Dropbox/_shared/scripts/, not the weekly to-do folder.
The script only ever drives this blog. It names the repo, runs
`bundle exec jekyll build` against it, checks that the branch is master and
reads `_config.yml`. It has no other consumer, so keeping it in Dropbox meant
AGENTS.md pointed outside the repository and the script could drift from the
thing it operates on.
It now lives at script/publish-post, alongside the existing script/cibuild,
and follows the same bare-verb naming. The old name carried a "seedfolder"
prefix, which was a misnomer: the script has nothing to do with that project.
REPO_PATH is now derived from the script's own location rather than a
hardcoded /Users path, so it runs from any clone on any machine and from any
working directory.
`script` is already in the exclude list in _config.yml, so none of this is
served from the site. Verified with a build.
@solrevdev
solrevdev merged commit f0c3e09 into masterAug 7, 2026
1 check passed
@solrevdev
solrevdev deleted the post/dotnet-rollforward-major branch August 7, 2026 07:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@solrevdev