Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
161443 stories
·
33 followers

Writing A Front End

1 Share

For the past six weeks I’ve been developing my demonstration program as a console application. Today I decided to give it a nice front end using Blazer (I don’t know Blazer). In the time it took to listen to Tommy (The Who, 1969) and half of The Wall (Pink Floyd, 1979) I had my first, second, and third drafts. That represents almost 30,000 lines of new code and documentation in well under 3 hours.

The bulk of the work was completed in the first round. In the second, I added the minimum and maximum boxes, and in the third, I added the requirement that the entire history of the reviewers’ comments appear in the Review box.

I opted to go through the entire Spec Kit process even for the smaller features, which I admit was a bit slower than I would have liked. But all in all I got a starter front end that, again, would have taken much longer, especially since I don’t know Blazer (though I know a good bit more now, having read through the code and documentation).

I ended up with at least a dozen .razor files and twice as many bootstrap.js (and .min.js) files. Copilot told me how to fire it up and what port it would appear on. By starting the application in the terminal, I could watch all my logging and tracing go by, though I added the logging to the bottom of the page (right now it is in a scrolling box, but I think I’ll change it to display just one line at a time—not sure about that.)

My experience was excellent, but I did notice that it was eating a lot of tokens. From the time I started the work until I was done, it had consumed about 10,000 tokens! (ouch)

Read the whole story
alvinashcraft
11 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Spec Kit Phases

1 Share

I’ve been writing quite a bit about Spec Kit. Mostly because I can’t get over how effective it is when combined with Copilot. Spec Kit essentially “forces” you into Spec Driven Development best practices.

Spec‑Driven Development (SDD) flips the usual order of product work: start with a clear, testable spec that captures intent, evidence, and acceptance criteria, then drive planning and implementation from that spec. GitHub’s open-source Spec Kit is a practical toolkit for doing SDD consistently. It defines a small set of core phases you’ll use for most features and a fuller, production‑ready flow that adds project‑level setup and quality‑gate steps.

Core SDD phases (short path)
The minimal, “core” Spec Kit flow (good for small features and quick iterations) includes five phases:

  • Specify
  • Goal: Write the spec—a concise, evidence‑backed description of intent, user impact, acceptance criteria, risks, and open questions.
  • Artifact: spec.md (Markdown).
  • Who: feature owner, product manager, and any SMEs who clarify requirements.
  • Outcome: A single source of truth describing what success looks like and how to validate it.
  • Plan
  • Goal: Define a high‑level approach and milestones for delivering the spec.
  • Artifact: plan.md.
  • Who: engineering leads, tech PM, or the feature owner collaborating with implementers.
  • Outcome: A roadmap and sequencing that make the work estimable and schedulable.
  • Tasks
  • Goal: Break the plan into actionable work items, ideally small and testable.
  • Artifact: tasks.md (task list, tickets, or issues).
  • Who: engineers and project managers.
  • Outcome: A set of concrete tasks ready to be picked up, with owners and rough estimates.
  • Implement
  • Goal: Write the code, tests, and necessary infra changes that fulfill the spec and tasks.
  • Artifact: code, PRs, feature branches; the spec + tasks continue to serve as the reference.
  • Who: engineers, reviewers, and CI.
  • Outcome: Working changes submitted as pull requests.
  • Converge
  • Goal: Verify the work against the spec, iterate as needed, and finalize the implementation (merge, deploy, and close feedback loops).
  • Artifact: verification notes, post‑merge checklist, release notes.
  • Who: reviewers, QA, product, and observability owners.
  • Outcome: Feature is released (or scheduled) and the spec reflects any final decisions or learnings.

Full (recommended) flow for production‑grade work
For larger efforts or production features, the Spec Kit recommends a fuller, gated flow that adds project setup, clarification, and quality checks. The typical “full” path is:

  • Constitution (project‑level, once)
  • Purpose: Establish project norms, success metrics, maintainers, review cadence, and cross‑team responsibilities. This is a lightweight project manifesto: who’s accountable and how decisions get made.
  • Artifact: constitution.md.
  • Specify (write the spec)
  • As above, but now aligned to the constitution and any project constraints.
  • Clarify
  • Purpose: Surface and resolve open questions, corner cases, or dependency uncertainties before work begins.
  • Artifact: clarify.md or a section in spec.md that records Q&A and owner decisions.
  • Outcome: Reduce surprises during implementation; document remaining risks.
  • Plan
  • As above, but informed by clarified decisions and project constraints.
  • Checklist (quality & acceptance gate)
  • Purpose: Create explicit acceptance criteria and a quality gate that must be satisfied before merging or releasing.
  • Artifact: checklist.md (test cases, performance targets, security/privacy checks).
  • Outcome: A clear pass/fail list for reviewers and automated checks.
  • Tasks
  • As above, often with task owners tied to checklist items and test expectations.
  • Analyze
  • Purpose: Cross‑artifact checks and risk analysis: are specs, plan, tasks, and checklist consistent? Run dependency analysis, design/architecture review, or automated linting of the spec/artifacts.
  • Artifact: analyze.md or automated reports that can be attached to the feature.
  • Outcome: Identify gaps, mitigate risks, and confirm readiness to implement.
  • Implement
  • As above, often with stricter review rules and CI that enforces checklist items.
  • Converge
  • As above, including a final retrospective to update the spec and constitution where necessary.

How the Spec Kit maps phases to artifacts and tooling

  • Each phase produces a Markdown artifact that becomes the input to the next phase (examples: constitution.md, spec.md, plan.md, tasks.md, checklist.md, analyze.md). These artifacts live in the feature directory or repo and become part of the project history and evidence.
  • Spec Kit exposes each phase as first‑class commands/agent skills. Common command/agent names include
  • /speckit-specify
  • /speckit-clarify
  • /speckit-plan
  • /speckit-tasks
  • /speckit-implement
  • /speckit-converge
  • The short path skips clarify/checklist/analyze for fast progress; the full path uses them as gates and quality controls.
  • Spec Kit also provides opt‑in flows for bug‑fixes and idea‑assessment. These are separate entry points that adapt the core SDD workflow to those contexts without forcing the full SDD path.

Why start with a spec?

  • Keeps intent explicit: A spec captures the “why” before the “how,” reducing rework and misalignment.
  • Enables evidence‑driven decisions: Specs can include data, user research, and acceptance criteria that make tradeoffs explicit.
  • Supports better reviews: PRs and code are judged against a known spec, so reviewers focus on deviations and implementation quality.
  • Improves knowledge transfer: Markdown artifacts are searchable and persist beyond PRs and tickets.

Tips for integrating Spec Kit into your workflow

  • Keep specs concise and testable. Prefer explicit acceptance criteria over vague goals.
  • Automate cross‑artifact checks. Use CI jobs to ensure spec.md exists, checklist items map to tests, or tasks correspond to ticketing IDs.
  • Use the Clarify phase to resolve dependencies; unresolved questions should block implementation if they affect correctness.
  • Treat the spec as living documentation: update it in Converge to reflect decisions made during implementation.
  • Embed links between artifacts and PRs so reviewers can quickly find the spec, plan, and checklist from a pull request.
Read the whole story
alvinashcraft
23 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

The two questions code coverage can't answer: property-based and mutation testing for .NET and Angular

1 Share
Code coverage tells you a line ran. It doesn't tell you whether you tried the inputs that matter, or whether anything would notice if the line were wrong. Those are two separate gaps, and there's an old technique for each: property-based testing generates the inputs you didn't think of, mutation testing breaks your code to see if a test complains. Both are decades older than my interest in them, and what changed isn't the techniques. It's that generating code got cheap while checking it didn't. Here's how they work on .NET and Angular, what they cost, and why each one is the check on the other.
Read the whole story
alvinashcraft
47 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Querying Roslyn syntax trees with XPath

1 Share
In , I showed that XPathNavigator is not tied to XML. Any tree can be exposed as a node-set, and the XPath engine of System.Xml.XPath does the rest. That post used a folder hierarchy as an example. Here is a much more interesting tree: the C# syntax tree produced by Roslyn. The occasion for it was an issue on Meziantou.Analyzer: Rule to forbid primary constructors? (Opposite of IDE0290). The request was…
Read the whole story
alvinashcraft
55 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

The Migration of a Row: Tagged, Followed, Found Again

1 Share

The migration of a row is short in distance and long in consequence. I tagged one on a Sunday evening and followed it to the grave. It is still out there.

Diagram titled One row, one DELETE, five places it still lives. The left panel lists the row alive: a 284 byte log record before the commit, an address at 1 colon 392 colon 0, a checkpoint writing the page, and a backup copying it out. The right panel lists what remains after the delete: the ghost record still 184 bytes, log records, the statistics histogram that names the row, deallocated pages, and every backup.

The Short Version

If you read nothing else, read this. I tagged one row, followed it to the grave, and then went looking for the body.

The log gets there first. Before the commit, the insert already exists as a 284 byte log record. The data file hears about it later.

The row has a street address. (1:392:0) is file one, page 392, slot zero. It is 184 bytes on a page of 8,192.

Delete does not erase. The record stays exactly 184 bytes. One flag turns it into a ghost, and the table stops counting it.

Here is the part nobody expects. The table is empty and the ghost has been swept away. The database still knows the traveller’s name, because it is sitting in a statistics histogram.

Why your data is in a histogram at all. Every database guesses before it works. It keeps a cheat sheet of real values, so it can estimate how many rows a query will touch.

You can clear it, almost. One command rewrites that cheat sheet from what is there now, which is nothing. The old pages are marked unused rather than wiped, so the name still rides along in tonight’s backup.

The rest of this is the same story, with the screenshots and the measurements. The queries are all here, so you can run it on your own server.

Into the Field

A weathered bird band stamped TRAVELER-0001 rests on a wet rock above a vast mist-filled river gorge, with dawn sunlight illuminating the winding river below.

Field work on a database is easier than field work on a bird. Nothing bites, and the animal cannot leave the building. The trouble is that the animal is invisible. The instruments that see it are not the ones most of us use.

So here is one row, tracked from the first write to the last trace of it. Every number below came off a local SQL Server 2025 instance on a Sunday evening.

The Tagging

The whole study runs on one instance, in one database built for it.

SSMS result grid listing the databases on the instance: the four system databases, SQLAuthority, AdventureWorks2025, WideWorldImporters, and MigrationLab in FULL recovery.

The habitat is a small table. One clustered index, four columns, nothing exotic.

USE MigrationLab;

CREATE TABLE dbo.Travelers
(
    TravelerID  INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    TagCode     NVARCHAR(40) NOT NULL,
    TaggedAt    DATETIME2(3) NOT NULL,
    Notes       CHAR(120) NOT NULL
);

Before the write, the table has no pages in memory at all. The buffer pool has never heard of it.

Then, at 19:29:08.106, the tagging.

BEGIN TRANSACTION MarkTheTraveler;

INSERT dbo.Travelers (TagCode, TaggedAt, Notes)
VALUES (N'TRAVELER-0001-KESTREL', SYSDATETIME(), 'tagged on the first write and followed to the end');

The transaction is still open. Nothing has been committed. Watch what already exists.

The Log Gets There First

Before the commit, two things are already true. An insert record exists in the log. The row is already sitting on a dirty page in memory.

SELECT TOP 1 [Current LSN], Operation, Context, [Log Record Length]
FROM   sys.fn_dblog(NULL, NULL)
WHERE  Operation = 'LOP_INSERT_ROWS'
  AND  AllocUnitName LIKE '%Travelers%'
ORDER BY [Current LSN] DESC;

One record. LOP_INSERT_ROWS, context LCX_CLUSTERED, 284 bytes, at LSN 0000002C:00000130:001D.

SSMS showing the insert running inside an open transaction, and the log query returning one row: LOP_INSERT_ROWS, LCX_CLUSTERED, 284 bytes.

Engraved migration chart with a dotted route crossing a river, a plateau, a lake, hills and a walled enclosure, the stages marked LOG, PAGE, CHECKPOINT, BACKUP and ARCHIVE.

Be precise about what that means. At this instant the log record may still be in the log buffer, in memory.

With fully durable commits, SQL Server gets a transaction’s log records onto durable storage before it reports success.

The rule is the order, and the order never changes. The log record reaches disk before the data page does. Everything a database promises about surviving a power cut rests on that.

The page carries a dirty flag, which means it has changed since it was last written to disk. What the data file holds for that page is not what memory holds.

Its Address

COMMIT TRANSACTION MarkTheTraveler;

Now ask the row where it lives.

SELECT TravelerID,
       TagCode,
       TaggedAt,
       sys.fn_PhysLocFormatter(%%physloc%%) AS file_page_slot
FROM   dbo.Travelers;

It answers (1:392:0). File 1, page 392, slot 0. That is a real address, and it holds still until something moves it.

SSMS result grid showing TravelerID 1, TRAVELER-0001-KESTREL, tagged at 19:29:08.106, at file page slot (1:392:0).

That page number belongs to this run. Yours will land somewhere else, and the query above will tell you where.

Now open the page itself and look at the record.

DBCC TRACEON (3604);
DBCC PAGE (MigrationLab, 1, 392, 1) WITH TABLERESULTS;

SSMS showing the page dump filtered to five fields: m_slotCnt 1, m_freeCnt 7910, m_ghostRecCnt 0, Record Type PRIMARY_RECORD, Record Size 184.

A PRIMARY_RECORD of 184 bytes, on a page of 8,192 bytes, with 7,910 bytes left free. The rest is the page header and the slot array.

The animal is small and its territory is enormous. That is the normal condition of a row.

The Long Rest

The page was still dirty when I checked after the commit. Nothing is wrong. This is the resting phase.

How long it would have rested is not something I measured. In the lab I ran CHECKPOINT myself rather than wait for the engine.

After the checkpoint, the page was clean and still in memory.

That last part matters. Writing a page to disk does not evict it. The row stays in the buffer pool, ready, until memory pressure or a restart sends it away. On a warm system, most of the rows you read never come from a disk at all.

The Herd

One traveler is a story. Ten thousand is a measurement.

I inserted ten thousand rows one at a time, each in its own transaction. It took 3,093 milliseconds and grew the log by 1,049 bytes per row.

That is odd, because the insert record is 284 bytes. Its begin and commit records add about 208 more. Something is charging for the rest.

So I ran the same ten thousand rows again inside one transaction. It took 215 milliseconds and grew the log by 283 bytes per row.

SSMS showing both measurements: one row per transaction at 3093 milliseconds and 1049.4 log bytes per row, and all ten thousand in one transaction at 215 milliseconds and 282.6 log bytes per row.

In this run, grouping them was about fourteen times faster and used a quarter of the log space. The row was never the expensive part. The ceremony around each one was.

Treat the milliseconds as this machine and this workload. Other runs of the same loop landed anywhere between 2,017 and 3,826 milliseconds.

Log space growth is also not an exact count of record bytes. Your own numbers will depend on your storage and what else is running.

Into the Archive

The backup is where the migration turns into something people forget to think about.

A full backup runs. A log backup runs and processes seven pages. Copies of the traveler now exist in places nobody is watching.

The schedules are old. The retention windows were set years ago by somebody who has left.

One animal, several territories. From here on, the row exists in more than one place, and only one of those places is the table.

The Death

Every field study ends the same way.

DELETE dbo.Travelers WHERE TagCode = N'TRAVELER-0001-KESTREL';

One row deleted. The log writes it down, LOP_DELETE_ROWS, 280 bytes, which is four bytes less than it cost to arrive.

The table now reports zero records. Anybody querying it will tell you the traveler is gone. In every way SQL cares about, they are right.

The Body

Go back to page 392 and look.

DBCC TRACEON (3604);
DBCC PAGE (MigrationLab, 1, 392, 1) WITH TABLERESULTS;

Record Type: GHOST_DATA_RECORD. Record Size: 184 bytes.

SSMS showing the same page after the delete: m_ghostRecCnt 1, Record Type GHOST_DATA_RECORD, Record Size still 184.

Photograph of a single feather lying on an old ledger page with a museum specimen tag tied to it, hand lettered GHOST and 184 BYTES.

Read that twice. The record is still the same size. The bytes were not wiped and the name was not overwritten.

What changed is the record’s type flag and a counter in the page header. The page is modified and logged, of course. Nothing is compacted, and nothing is erased.

The engine reports it honestly if you ask directly.

SELECT record_count, ghost_record_count, version_ghost_record_count, page_count
FROM   sys.dm_db_index_physical_stats
       (DB_ID('MigrationLab'), OBJECT_ID('dbo.Travelers'), NULL, NULL, 'DETAILED')
WHERE  index_level = 0;

SSMS result grid after the delete: record_count 0, ghost_record_count 1, version_ghost_record_count 0, page_count 1.

record_count 0. ghost_record_count 1. The body is on the page, waiting for a background task to come and sweep it up.

This is ordinary. It is how SQL Server keeps deletes cheap, and other engines strike their own version of the same bargain. It is not what anybody pictures when they say the word deleted.

The Museum

Now restore the backup taken while it was alive.

TravelerID 1. TRAVELER-0001-KESTREL. Tagged at 19:29:08.106. Intact, queryable, as though nothing happened.

SSMS showing two result grids: the restored museum database returns the traveller, and the live table returns zero rows.

Overhead photograph of an open museum collection drawer holding rows of small numbered specimen tags, its brass card holder labelled ARCHIVE.

Then I went further, because the interesting question is not the old backup. It is the new one.

I took a fresh uncompressed full backup after the delete. Then I searched that file for the traveler’s name as raw bytes. It is in there.

The deleted tag’s bytes are in that file. That is a different thing from restoring a queryable row, and it is the finding that matters.

Not a copy from last month. The one you took tonight.

Which Copy Is Which

Finding a name in a backup is one thing. Knowing what is holding it is another.

So I built a second lab and took the copies away one at a time. A fresh database, one row, one unique name, and an uncompressed backup after every change.

While the row is alive, the name appears in the backup once. After the delete, it appears three times.

Then I rebuilt the index, which clears the ghost, and took another backup. One of the three copies was gone. That one was the body on the page.

Two copies survived. They survived a log backup. They survived eight rounds of twenty thousand inserts and deletes, with a log backup after every round.

Whatever was holding them was not the row, and it was not recyclable log space.

The Name in the Histogram

I restored that backup and walked all 331 of its allocated pages. Each one was asked which object owned it.

The name was on page 29, in sys.sysobjvalues. That is where SQL Server keeps statistics blobs.

So I went back to the first lab, where the table is empty, and asked its statistic the same question.

SELECT COUNT(*) AS rows_in_table FROM dbo.Travelers;

DBCC SHOW_STATISTICS ('dbo.Travelers', '_WA_Sys_00000002_48CFD27E') WITH HISTOGRAM;

SSMS showing rows_in_table 0, and directly below it a histogram whose RANGE_HI_KEY is TRAVELER-0001-KESTREL with EQ_ROWS 1.

Zero rows in the table. One row in the histogram, and it is the traveller, by name.

Something had filtered on that column once, so SQL Server created a statistic on it. A histogram holds real values, because that is how it estimates.

The table has zero rows. The ghost is gone. The log has been cycled eight times. The histogram still names the animal.

Your statistic will have a different name. Look for the ones beginning _WA_Sys_ on the column you deleted by.

Can You Make It Leave

Partly, and this is the part worth knowing.

UPDATE STATISTICS dbo.Travelers WITH FULLSCAN;

DBCC SHOW_STATISTICS ('dbo.Travelers', '_WA_Sys_00000002_48CFD27E') WITH HISTOGRAM;

SSMS showing the same histogram query after updating statistics: the column headers are there and not a single row under them.

Column headers, and nothing under them. The name is out of the statistic.

Then I took another backup and searched it. The name is still in the file, in three places.

Three, not two. A page that was deallocated along the way still held the old bytes, and it came with the backup.

Old statistics pages are deallocated, not scrubbed. The bytes wait there until something reuses the page.

What the Study Is Actually About

Somebody will ask you to delete a customer’s data, and they will mean it.

The DELETE is the easy part, and it is the part that gets reviewed. The traveler is in five other places.

A ghost record on the page until cleanup runs. Log records describing both the insert and the delete. A histogram that names the value until you update the statistic.

A log backup can make inactive log space reusable. It does not wipe the bytes.

Then the deallocated pages holding bytes nobody scrubbed. And every backup, before and after, that carried any of it.

None of that is a bug. All of it is design, and all of it is measurable.

The excerpts above are the main observations. The full lab also did the backups, the restore, the page walk and the byte search.

Run it on your own system before you promise anybody that something is gone.

Checking that promise against what the engine really does is the sort of work I get called in for. You can see how I work with teams on my consulting page.

If you like this sort of patient look at machines, my book of essays AI: Nobody’s in There. But we’re still in here. does the same thing with a different animal. All thirty are free to read online, and the paperback is on Amazon.

A deleted row is not erased, it is a body, a log record, and a name in a histogram.

Published by Pinal Dave on SQLAuthority. More of my work at pinaldave.com.

First appeared on The Migration of a Row: Tagged, Followed, Found Again

Read the whole story
alvinashcraft
1 minute ago
reply
Pennsylvania, USA
Share this story
Delete

Should you pay $370 to post your game on X?

1 Share

Hello and Welcome, I’m your Code Monkey!

This week I finally gave Codex a try and I was extremely surprised at how good it was! Not necessarily for Game Dev but rather for all my other business/content creation tasks. It helped me create a bunch of Chrome Extensions that I can use for various things like setting up video metadata, searching my video library, helping me set up this newsletter (I write in a .txt file then I have to copy paste into the newsletter website), also made a simple one to store some notes, one to help me set up invoices, and more.

My next goal is seeing how it can maybe help me set up starting scenes for various tutorials that I'd love to make. I can easily teach you how to make a Save System off the top of my head, but setting up a demo scene with a moving character, some coins, doors, an environment and so on, takes hours. So if I can speed up that process then I'll be able to cover lots more topics in tutorials!

I will be making a video tutorial this week covering how to use Unity from Codex/Claude as well as how to use the Unity CLI + MCP. I think with the right guidance these tools can genuinely help you.

  • Game Dev: Should you pay $370 for a post of your game on X?

  • Tech: Steam Frame is finally here!

  • Gaming: StarCraft is BACK!

  • Fun: Treat your kids like AI?



Game Dev

Should you pay $370 for a post of your game on X?

One of my favorite accounts on X is Indie Game Joe, he posts about interesting indie games, I've certainly found quite a few through his posts. His account has grown quite a lot in recent months and he definitely understands Indie Game Marketing.

His posts are free, he doesn't charge devs, but other people that post about games do charge for coverage (which can be fine), and that's what this giant article he posted is all about. Is it worth it? Should you as an indie dev pay for coverage? How much is an X post worth? If you're curious about paying for coverage of your Indie game then this article is a must read.

I'm not personally too familiar with the account "Best Indie Games" so I can't comment on the specifics of that account but I can definitely agree with the fact that you should be paying based on what you actually get, views/impressions, and not a vanity subscribers or followers metric. Paying $370 for a post that gets 2500 impressions is absolutely not worth it.

For the most part, since indie games are very cheap ($3-$15) it is very very hard to get a positive ROI on any paid advertising, therefore in general I don't recommend you do it. If you really want to then I'd say try using something very targeted like Reddit ads pointing at hyper specific niche subreddits. Sometimes those can help getting wishlists at a cost of $1-$2 per wishlist which is pretty expensive but might be useful to test how much are people interested in your game.

Although in general I would say, if you have trouble getting organic coverage, it is likely because your game is not as appealing as you think and therefore paid coverage will likely not save you.

I think this is a very important topic to talk about because a lot of indie devs don't know how paid marketing works, and if they get a quote saying "I have an audience size of 300,000 and if you pay me $200 you can reach them!" then that sounds awesome! But then they pay their hard-earned $200 and in return get 3000 impressions and 10 visits to their page leading to 1 wishlist and 0 sales. That's not fun.


Affiliate

FREE Grid System, 50% OFF Toolkit!

The Autumn Sale on the Asset Store is on! This is a big one! All the top assets are discounted 50% OFF, including my own Code Monkey Toolkit Asset!

I’ve also just updated it with a bunch more Tools and Elements to help you make games BETTER and FASTER. I’ve added a Main Menu and Graphics Settings Window to quickly help you get your prototypes up and running. I’ve also added Day Night Cycle, Simple Destruction, Save System, along with the other 50 Tools and Elements that were already on the asset. Oh and an interesting new addition for those of you using AI agents, I’ve added Skills.md so that agents can learn how to use the Toolkit. I tested it myself with Unity AI and just asked it to build a scene with a player character interacting with some cubes and it did it perfectly!

Get my Toolkit HERE and browse everything on sale HERE!

The Publisher of the Week this time is Giant Grey, publisher with some interesting tools for roads and data analysis.

Get the FREE PathGrid which is a grid system to help you create roads and paths like in a city builder game.

Get it HERE and use coupon GIANTGREY2026 at checkout to get it for FREE!

Need a giant library of Sound Effects and Music? Check out the latest HumbleBundle!

It’s got every theme imaginable, Sci-Fi, Modern, Medieval, Fantasy, etc.

Great sound and music can really elevate your game, and having a giant pack like this with tons of variety really helps.

It’s 96% OFF, get it HERE!


Tech

Steam Frame is finally here!

Valve's new VR headset, Steam Frame, is finally launching! Although getting one currently involves a waitlist AND it's super expensive.

Sadly the price isn't really their fault, it starts at $1059 ($1300 1TB), and Valve says the RAM shortage pushed the price way above its original target. This was never intended to be a mass market device to compete with something like the Quest 3, it was always meant to be for the hardcore users, but still over a thousand bucks is definitely pricey even for that audience.

The good news is that the hardware sounds excellent! Reviews so far are all extremely positive, everyone praises the comfort, convenience, and especially the wireless PC streaming. It seems like the Foviated Streaming and the Wireless Adapter does work genuinely extremely well.

It can work either in standalone, or receiving footage from a game running on your desktop, all wireless. The one negative appears to be the battery, when working in standalone on a heavy game you can expect under 1 hour of battery time! That's tiny! On streaming it's more close to 2 hours which for VR I think is fine. Technically you can just hook a power bank to it and store it in your pants to get more time.

One insanely impressive thing is how they got Half Life: Alyx working on-device! That's crazy! Such a high end impressive game running standalone on a mobile chip! Optimizing that must have been one tough challenge.

Right now you can't just straight up buy it since they didn't build many, you have to join a waitlist and hope to be chosen. I did join the waitlist as soon as I could but apparently I wasn't selected for the first batch, so no headset for me just yet. I'd love to get it to finally play Half-Life: Alyx, which looks like it could be the best VR game ever, and I'd also like to experiment with some VR development myself.

I really really want to play Half Life: Alyx. I held off on buying an Index because everyone was constantly saying "Valve's new headset is coming soon!" and now it's finally here but sadly can't quite get it just yet. I wonder how long it will take for them to add more stock, will be it quick like a bunch of new batches every month? Or will there still be shortages one year from now?



Gaming

StarCraft is BACK!

There have been lots of game announcements recently, here are some of the biggest highlights from BlizzCon and Tokyo Game Show so far:

  • StarCraft is returning, but NOT as an RTS! Blizzard revealed an open-world shooter set in the StarCraft universe. There's a GORGEOUS cinematic trailer, I definitely recommend you watch it you enjoy sci-fi, regardless of whether you like the game or not, Blizzard is still top tier when it comes to making trailers. There's no gameplay because the game is coming out in 2030! That feels like a lifetime from now. The fact that it's not an RTS is interesting, maybe they also have an RTS in the pipeline? Maybe this game is meant to just flesh out the world of StarCraft some more? Interesting strategy.

  • Diablo V is coming in Spring 2029! I remember playing Diablo IV when it came out, really enjoyed it although haven't played it since. This is another one that is super far in the future.

  • Warcraft III got a new expansion! Forsaken Kingdom launched during BlizzCon, over 23 years after The Frozen Throne.

Also happening this week is Tokyo Game Show which brought more trailers of lots of games. Crazy Taxi: World Tour looks like great nostalgia-bait, Bloodstained: The Scarlet Engagement looks like some great sidescrolling action, and Persona 4 Revival is coming in February.

Capcom showed more Monster Hunter and Mega Man. Monster Hunter Wilds: Ascendance is coming in 2027, while Mega Man: Dual Override targets Spring 2027.

I was shocked at the StarCraft announcement. It's been decades since StarCraft 2, it feels like a dormant franchise so it's awesome to see it returning! Technically it's not returning like most people would want, but if they're making games in the same universe I have to assume they also have an RTS in the pipeline.



Fun

Treat your kids like AI?

If you're a regular on X or more AI-focused discussions you probably understand the joke in this post. There's tons of posts talking about how you should talk to your AI in a certain way to get the best results. As well as the classic "make no mistakes!"

What about applying it to your kids? Heh very silly!

I found this funny, it's obviously ridiculous to apply this way of talking to other humans, but for AI it works great! For me my best prompt tip has been "ask me any clarifying questions before you get started," I write that whenever I ask AI to build something or help brainstorm ideas and it works extremely well. The more context it has the better the output will be.



  • Marketing Your Game in 2026 - Trailers or TikTok?

    LINK

    Excellent explainer on the difference between these two very different video formats

  • The Software Behind Almost Every Video

    LINK

    Have you used FFmpeg? It's probably the most widely used software in the world, without people knowing it!


Get Rewards by Sending the Game Dev Report to a friend!

(please don’t try to cheat the system with temp emails, it won’t work, just makes it annoying for me to validate)

Thanks for reading!

Code Monkey

Read the whole story
alvinashcraft
1 minute ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories