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

A Quick Start Guide To Writing First & Last Lines

1 Share

In this post, we explore how to write first and last lines – with examples. We’ve created a quick start guide to writing first and last lines.

Read the other posts in our Quick Start series:

  1. A Quick Start Guide To Creating Characters
  2. A Quick Start Guide To Writing Fantasy
  3. A Quick Start Guide For Beating Writer’s Block
  4. A Quick Start Guide To Writing For Children
  5. A Quick Start Guide To Writing YA Fiction
  6. A Quick Start Guide To Writing A Memoir
  7. A Quick Start Guide To Writing Descriptions
  8. A Quick Start Guide To Writing Romance
  9. A Quick Start Guide To Writing Science Fiction
  10. A Quick Start Guide To Foreshadowing
  11. A Quick Start Guide To Writing An Inciting Incident
  12. A Quick Start Guide To Writing Dialogue
  13. A Quick Start Guide To Writing Crime Fiction
  14. A Quick Start Guide To Writing Emotions
  15. A Quick Start Guide To Writing Revenge
  16. A Quick Start Guide To Writing First & Last Lines

This post is about writing first and last lines.

Before we start – BIG SPOILER ALERT!

Right, now that’s out the way, let’s begin. Your first line, or lines, are the key that unlocks the door to the world of your book. Your last line, or lines, are the ones that keep readers hooked on you as an author. You want readers to remember those lines forever, not just as head knowledge, but with a shiver of emotion, one of delight or unease, or even sorrow. The lines need to be more than good. They need to be legendary. They set the tone of your whole book.

A Quick Start Guide To Writing First & Last Lines

Here are three ways to write legendary first and last lines.

Option 1- Write Emotional Contradiction And Cognitive Dissonance

Writing Tip: Your first line, whether it is a question, a statement, or a description should start by leading the reader in one comforting emotional direction. Add a phrase or a detail that seems to veer off into the opposite emotion. For the last line of the book write a statement of line of dialogue that reveals that the unease the reader felt was justified.
Goal: Your reader needs to feel that shiver of uncertainty at first, and then have it confirmed in the last line, or deepen the doubt the reader has been carrying about the main character or situation.
Example: Peter And Wendy by JM Barrie
First line: ‘All children, except one, grow up.’
Last line: ‘When Margaret grows up she will have a daughter, who is to be Peter’s mother in turn: and thus it will go on, so long as children are gay and innocent and heartless.’
Explanation: The phrase, ‘except one’, gives the reader a sense of unease. Does the author mean physically, emotionally, intellectually, or morally? The last word of the book answers that question. Peter Pan was heartless. Throughout the book – which despite what Disney would have us believe, is not a tale of children having fun and fighting pirates on a magical island – there is this sense of unease when it comes to Peter Pan himself. The real story is about kidnapping, abuse, Stockholm syndrome, murder, misogyny, jealousy, unresolved personal or intergenerational trauma, and violence. And both the first and last lines bracket that story. Peter Pan wasn’t the hero. He was the villain.
Examples: The Hunger Games by Suzanne Collins and White Oleander by Janet Fitch have beginnings and endings that fit into option 1. Read more here: How To Write A Beginning And An Ending That Readers Will Never Forget

Option 2- Time Disruption Vertigo And Reflection

Writing Tip: Once you’ve written your book, go back and rewrite the opening and closing lines. Play with tenses, mix them up, write future events as if they are in the past. Echo your end at the beginning and your beginning at the end, as well as hinting at your plot in the end. Work on being subtle, rather than on-the-nose.
Goal: You want your reader to feel off-balance. Du Maurier does this by using the dream motif (but please, for the love of Shakespeare, don’t write a whole book that turns out to be one entire dream sequence!) and by moving the reader around in time before settling in the past to tell the story. Keeping your reader off-balance compels them to read more.
Example 1: Rebecca by Daphne Du Maurier
First Lines: ‘Last night I dreamt I went to Manderley again. It seemed to me I stood by the gate leading to the drive, and for a while I could not enter, for the way was barred to me…No smoke came from the chimney.’
Last lines: ‘The road to Manderley lay ahead. There was no moon. The sky above our heads was inky black. But the sky on the horizon was not dark at all. It was shot with crimson, like a splash of blood. And the ashes blew towards us with the salt wind from the sea.’
Explanation: The author drops the reader into three different time zones in the first line. We don’t really know where we are in the story to begin with. ‘Last night’ is the recent past, ‘dream’ is timeless, ‘again’ is the distant past, but the speaker is in the present. Chapter 1 continues in the timeless dream that occurred in the recent past. Chapter 2 is the present. Chapter 3 onwards is the past. This time disruption leaves the reader wanting to know more. What is Manderley? Why was the gate locked against her? Why was the place uninhabited. You want to read more. The first lines set up the sense of being off-balance, and of the narrator always being on the outside. Which is her experience throughout the book. She may be married to Maxim de Winter but she never seems to quite unlock his heart, his secrets, or Mrs Danvers’ approval etc.
The book begins in darkness and ends in darkness. In the start there is no smoke, in the end there is smoke, fire, and ash. At first, she is locked out and the place is abandoned, in the end it is destroyed and uninhabitable ever again. All her dreams for her future have turned to ash. The description of the sky is a reflection of one of the most important two scenes in the book; the shot, the crimson splash of blood, and the salt wind from the sea that reveals the boat in which Rebecca’s body is found. The plot hinges on these.
Example 2: Titus Groan by Meryn Peake
First line: ‘Gormenghast, that is the main massing of the original stone, taken by itself would have displayed a certain ponderous architectural quality were it possible to have ignored the circumfusion of those mean dwellings that swarmed like an epidemic around its outer walls.’
Last lines: ‘Through honeycombs of stone would now be wandering the passions in their clay. There would be tears and there would be strange laughter. Fierce births and deaths beneath umbrageous ceilings. And dreams, and violence, and disenchantment. And there shall be a flame-green daybreak soon. And love itself will cry for insurrection! For tomorrow is also a day – and Titus has entered his stronghold.’
Explanation: In this case, the messing with time, especially in terms of the plot that has already happened and will happen again, takes place in the last line. These two lines also reveal that inanimate objects have just as much power as people if you write it well.

Option 3 – A Universal Personal

Writing Tip: Find that one emotion or experience that your main character has that is a universal one and write it as if it’s a personal confession from your main character. Think of things such as an event like a birth, death, first date, first day on the job, first rejection, a habit, a failing, a dream unfulfilled, a character flaw. It could be something as simple as your character once again forgetting to take shopping bags with her to the store.
Goal: If you want your reader to immediately identify with your main character, writing a line like, ‘I met Karl Marx when I was sixteen in Paris’, isn’t going to do that.
Example 1: Back When We Were Grownups by Anne Tyler
First Line: ‘Once upon a time, there was a woman who discovered she had turned into the wrong person.’
Last Line: ‘There is no true life. Your true life is the one you end up with, whatever it may be. You just do the best you can with what you’ve got.’
Explanation: Don’t we all, at some point, feel as if we were meant to be someone else? Someone better, different, rich, famous? Or maybe we feel we ‘coulda been a contender’ if only someone, something etc., had or hadn’t happened. Don’t we all make plans and then fail at them?
Example 2: Bridget Jones’s Diary by Helen Fielding
First line: ‘1. Stop smoking. 2. Develop a mature relationship with an adult man. 3. Go to the gym. 4. Be kinder and help others more. Sunday 1 January Weight 9st 3, alcohol units 14, cigarettes 22, calories 5424.’
Last line: ‘An excellent year’s progress.’ (Whited out)
Explanation: This is what is known as a ‘universal personal’. It’s utterly relatable experience, or emotion to nearly everyone on the planet. Your reader will immediately feel as if they know your main character personally. In a sense they do.

The Last Word

Additional Reading:

  1. How To Write A Beginning And An Ending That Readers Will Never Forget
  2. How To Write Epic Beginnings
  3. 5 Incredible Story Beginnings & Endings

Writing first and last lines often need more thought and care than the rest of the book – if you want them to be legendary. If you’d like to learn how to write a great book, sign up for one of the rich and in-depth courses that Writers Write offers and get your writing career off to a great start.

Elaine Dodge
by Elaine Dodge. Author of The Harcourts of Canada series and The Device HunterElaine trained as a graphic designer, then worked in design, advertising, and broadcast television. She now creates content, mostly in written form, including ghost writing business books, for clients across the globe, but would much rather be drafting her books and short stories.

More Posts From Elaine

  1. What Is A Character Bible & Why Do I Need One?
  2. A Quick Start Guide To Writing Revenge
  3. A Quick Start Guide To Writing Emotions
  4. Why A Good Vocabulary Is Important For Writers
  5. What Is Cozy Fiction? & How To Write It
  6. What Is A Cozy Fantasy?
  7. What is Romantasy & Why Is It So Popular?
  8. How Much Personal Experience You Need To Write Fiction
  9. A Quick Start Guide To Writing Crime Fiction
  10. What Can Jane Austen Teach Writers Today?

The post A Quick Start Guide To Writing First & Last Lines appeared first on Writers Write.

Read the whole story
alvinashcraft
just a second ago
reply
Pennsylvania, USA
Share this story
Delete

openclaw 2026.4.12

1 Share

Changes

  • QA/lab: add Convex-backed pooled Telegram credential leasing plus openclaw qa credentials admin commands and broker setup docs. (#65596) Thanks @joshavant.
  • Memory/Active Memory: add a new optional Active Memory plugin that gives OpenClaw a dedicated memory sub-agent right before the main reply, so ongoing chats can automatically pull in relevant preferences, context, and past details without making users remember to manually say "remember this" or "search memory" first. Includes configurable message/recent/full context modes, live /verbose inspection, advanced prompt/thinking overrides for tuning, and opt-in transcript persistence for debugging. Docs: https://docs.openclaw.ai/concepts/active-memory. (#63286) Thanks @Takhoffman.
  • macOS/Talk: add an experimental local MLX speech provider for Talk Mode, with explicit provider selection, local utterance playback, interruption handling, and system-voice fallback. (#63539) Thanks @ImLukeF.
  • CLI/exec policy: add a local openclaw exec-policy command with show, preset, and set subcommands for synchronizing requested tools.exec.* config with the local exec approvals file, plus follow-up hardening for node-host rejection, rollback safety, and sync conflict detection. (#64050)
  • Gateway: add a commands.list RPC so remote gateway clients can discover runtime-native, text, skill, and plugin commands with surface-aware naming and serialized argument metadata. (#62656) Thanks @samzong.
  • Models/providers: add per-provider models.providers.*.request.allowPrivateNetwork for trusted self-hosted OpenAI-compatible endpoints, keep the opt-in scoped to model request surfaces, and refresh cached WebSocket managers when request transport overrides change. (#63671) Thanks @qas.
  • QA/testing: add a --runner multipass lane for openclaw qa suite so repo-backed QA scenarios can run inside a disposable Linux VM and write back the usual report, summary, and VM logs. (#63426) Thanks @shakkernerd.
  • Docs i18n: chunk raw doc translation, reject truncated tagged outputs, avoid ambiguous body-only wrapper unwrapping, and recover from terminated Pi translation sessions without changing the default openai/gpt-5.4 path. (#62969, #63808) Thanks @hxy91819.
  • Control UI/dreaming: simplify the Scene and Diary surfaces, preserve unknown phase state for partial status payloads, and stabilize waiting-entry recency ordering so Dreaming status and review lists stay clear and deterministic. (#64035) Thanks @davemorin.
  • Gateway: split startup and runtime seams so gateway lifecycle sequencing, reload state, and shutdown behavior stay easier to maintain without changing observed behavior. (#63975) Thanks @gumadeiras.
  • Matrix/partial streaming: add MSC4357 live markers to draft preview sends and edits so supporting Matrix clients can render a live/typewriter animation and stop it when the final edit lands. (#63513) Thanks @TigerInYourDream.
  • QA/Telegram: add a live openclaw qa telegram lane for private-group bot-to-bot checks, harden its artifact handling, and preserve native Telegram command reply threading for QA verification. (#64303) Thanks @obviyus.
  • Models/Codex: add the bundled Codex provider and plugin-owned app-server harness so codex/gpt-* models use Codex-managed auth, native threads, model discovery, and compaction while openai/gpt-* stays on the normal OpenAI provider path. (#64298) Thanks @steipete.
  • Models/providers: add a bundled LM Studio provider with onboarding, runtime model discovery, stream preload support, and memory-search embeddings for local/self-hosted OpenAI-compatible models. (#53248) Thanks @rugvedS07.
  • Plugins/loading: narrow CLI, provider, and channel activation to manifest-declared needs, preserve explicit scope and trust boundaries, and centralize manifest-owner policy so startup, command discovery, and runtime activation avoid loading unrelated plugin runtime. (#65120, #65259, #65298, #65429, #65459) Thanks @vincentkoc.
  • Memory/active-memory: default QMD recall to search and surface better search-path telemetry so memory-backed recall works more predictably out of the box. (#65068) Thanks @Takhoffman.
  • Docs/providers: expand bundled provider docs with richer capability, env-var, and setup guidance across provider pages.
  • Docs/memory-wiki: add the recommended QMD + bridge-mode hybrid recipe plus zero-artifact troubleshooting guidance for memory-wiki bridge setups. (#63165) Thanks @sercada and @vincentkoc.

Fixes

  • fix(security): remove busybox/toybox from interpreter-like safe bins [AI-assisted]. (#65713) Thanks @pgondhi987.
  • fix(approval-auth): prevent empty approver list from granting explicit approval authorization [AI]. (#65714) Thanks @pgondhi987.
  • fix(security): broaden shell-wrapper detection and block env-argv assignment injection [AI-assisted]. (#65717) Thanks @pgondhi987.
  • Gateway/startup: defer scheduled services until sidecars finish, gate chat history and model listing during sidecar resume, and let Control UI retry startup-gated history loads so Sandbox wake resumes channels first. (#65365) Thanks @lml2468.
  • Control UI/chat: load the live gateway slash-command catalog into the composer and command palette so dock commands, plugin commands, and direct skill aliases appear in chat, while keeping trusted local commands authoritative and bounding remote command metadata. (#65620) Thanks @BunsDev.
  • CLI/update: respawn tracked plugin refresh from the updated entrypoint after package self-updates so openclaw update stops failing on stale hashed dist/install.runtime-*.js chunk imports. (#65471)
  • Memory/active-memory: keep recall runs on the resolved channel when wrappers like mx-claw are enabled, improve lexical fallback ranking, and keep lexical boosts out of hybrid search so recall finds the right memories more consistently. (#65049, #65395) Thanks @Takhoffman.
  • Dreaming: consume managed heartbeat events exactly once, stage light-sleep confidence from all recorded short-term signals, wake scheduled jobs immediately, raise dreaming-only promotion enough to cross the durable-memory gate, and stop dreaming from re-ingesting its own narrative transcripts.
  • Dreaming/narrative: harden transient narrative cleanup by retrying timed-out deletes, scrubbing stale dreaming session artifacts through the lock-aware session-store path, and isolating transient narrative session keys per workspace. (#65320, #61674)
  • Memory/wiki: preserve Unicode letters, digits, and combining marks in wiki slugs and contradiction clustering, and cap Unicode filename segments to safe byte lengths so non-ASCII titles stop collapsing or overflowing path limits. (#64742) Thanks @zhouhe-xydt.
  • Memory/short-term recall: allow nested daily notes under memory/**/YYYY-MM-DD.md to feed short-term recall, while still excluding generated dream reports under memory/dreaming/** so dreaming does not promote its own output. (#64682) Thanks @SARAMALI15792.
  • UI/WebChat: hide synthetic transcript-repair tool results from chat history reloads so internal recovery markers do not leak into visible chat after reconnects. (#65247) Thanks @wangwllu.
  • WhatsApp/outbound: fall back to the first mediaUrls entry when mediaUrl is empty so gateway media sends stop silently dropping attachments that already have a resolved media list. (#64394) Thanks @eric-fr4 and @vincentkoc.
  • Doctor/Discord: stop openclaw doctor --fix from rewriting legacy Discord preview-streaming config into the nested modern shape, so downgrades can still recover without hand-editing channels.discord.streaming. (#65035) Thanks @vincentkoc.
  • Gateway/auth: blank the shipped example gateway credential in .env.example and fail startup when a copied placeholder token or password is still configured, so operators cannot accidentally launch with a publicly known secret. (#64586) Thanks @navarrotech and @vincentkoc.
  • Memory/active-memory+dreaming: keep active-memory recall runs on the strongest resolved channel, consume managed dreaming heartbeat events exactly once, stop dreaming from re-ingesting its own narrative transcripts, and add explicit repair/dedupe recovery flows in CLI, doctor, and the Dreams UI.
  • Agents/queueing: carry orphaned active-turn user text into the next prompt before repairing transcript ordering, so follow-up messages that arrive mid-run are no longer silently dropped. (#65388) Thanks @adminfedres and @vincentkoc.
  • Gateway/keepalive: stop marking WebSocket tick broadcasts as droppable so slow or backpressured clients do not self-disconnect with tick timeout while long-running work is still alive. (#65256) Thanks @100yenadmin and @vincentkoc.
  • Matrix/mentions: keep room mention gating strict while accepting visible @displayName Matrix URI labels, so requireMention works for non-OpenClaw Matrix clients again. (#64796) Thanks @hclsys.
  • Doctor: warn when on-disk agent directories still exist under ~/.openclaw/agents/<id>/agent but the matching agents.list[] entries are missing from config. (#65113) Thanks @neeravmakwana.
  • Telegram: route approval button callback queries onto a separate sequentializer lane so plugin approval clicks can resolve immediately instead of deadlocking behind the blocked agent turn. (#64979) Thanks @nk3750.
  • Telegram/direct sessions: keep commentary-only assistant fallback payloads out of visible direct delivery, so Codex planning chatter cannot leak into Telegram DMs when a run has no final_answer text.
  • Gateway/keepalive: stop marking WebSocket tick broadcasts as droppable so slow or backpressured clients do not self-disconnect with tick timeout while long-running work is still alive. (#65436)
  • Gateway/plugins: always send a non-empty idempotencyKey for plugin subagent runs, so dreaming narrative jobs stop failing gateway schema validation. (#65354) Thanks @CodeForgeNet.
  • Gateway/auth: blank the shipped example gateway credential in .env.example and fail startup when a copied placeholder token or password is still configured, so operators cannot accidentally launch with a publicly known secret. (#64586) Thanks @navarrotech.
  • Plugins/memory-core dreaming: keep bundled memory-core loaded alongside an explicit external memory slot owner only when that owner enables dreaming, while preserving plugins.slots.memory = "none" disable semantics. (#65411) Thanks @pradeep7127.
  • Doctor/Discord: stop openclaw doctor --fix from rewriting legacy Discord preview-streaming config into the nested modern shape, so downgrades can still recover without hand-editing channels.discord.streaming.
  • Doctor: warn when on-disk agent directories still exist under ~/.openclaw/agents/<id>/agent but the matching agents.list[] entries are missing from config. (#65113) Thanks @neeravmakwana.
  • CLI/plugins: honor memory-wiki when plugins.allow is set for openclaw wiki, and pass the active app config into the metadata registrar so plugin-owned wiki commands resolve the live plugin config instead of falling back to defaults. (#64779, #65012)
  • QA/packaging: stop packaged QA helpers from crashing when optional scenario execution config is unavailable, so npm distributions can skip the repo-only scenario pack without breaking completion-cache and startup paths. (#65118) Thanks @EdderTalmor.
  • Media/audio transcription: surface the real provider failure when every audio transcription attempt fails, so status output and the CLI stop collapsing those errors into generic skips. (#65096) Thanks @l0cka.
  • Infra/net: fix multipart FormData fields (including model) being silently dropped when a guarded runtime fetch body crosses a FormData implementation boundary, restoring OpenAI audio transcription requests that failed with HTTP 400. (#64349) Thanks @petr-sloup.
  • Dreaming/diary: use the host local timezone for diary timestamps when dreaming.timezone is unset, and include the timezone abbreviation so DREAMS.md and the UI make local or UTC time explicit. (#65034, #65057)
  • Dreaming/promotion: raise phase reinforcement enough for repeated dreaming-only revisits to clear the default durable-memory gate after multiple days, instead of stalling just below the score threshold. (#64068) Thanks @vincentkoc.
  • Dreaming/light-sleep: compute staged candidate confidence from all recorded short-term signals instead of recall-only counts, so dreaming-only entries stop rendering as confidence: 0.00. (#64599) Thanks @vincentkoc.
  • Plugins/memory: restore cached memory capability public artifacts on plugin-registry cache hits so memory-backed artifact surfaces stay visible after warm loads.
  • Gateway/cron: preserve requested isolated-agent config across runtime reloads so subagent jobs and heartbeat overrides keep the right workspace and heartbeat settings when the hot-loaded snapshot is stale.
  • Cron/isolated sessions: persist the right transcript path for each isolated run, including fresh session rollovers, so cron runs stop appending to stale session files.
  • Discord/gateway: clear stale heartbeat timers before reconnecting so zombie gateway callbacks cannot crash the process and drop in-flight replies. (#65009) Thanks @SARAMALI15792.
  • Matrix/mentions: keep room mention gating strict while accepting visible @displayName Matrix URI labels, so requireMention works for non-OpenClaw Matrix clients again. (#64796) Thanks @hclsys.
  • Agents/Anthropic replay: preserve immutable signed-thinking replay safety across stored and live reruns, keep non-thinking embedded tool_result user blocks intact, and drop conflicting preserved tool IDs before validation so retries stop degrading into omitted tool calls. (#65126) Thanks @shakkernerd.
  • Memory/QMD: allow channel sessions in the shipped default QMD scope, while still denying groups.
  • Memory/QMD: stop registering the legacy lowercase root memory file as a separate default collection, so QMD now prefers MEMORY.md and the memory/ tree without duplicate collection-add warnings.
  • Memory/memory-core: watch the memory directory directly and ignore non-markdown churn so nested note changes still sync on macOS + Node 25 environments where recursive memory/**/*.md glob watching fails. (#64711) Thanks @jasonxargs-boop and @vincentkoc.
  • WhatsApp: centralize per-account connection ownership so reconnects, login recovery, and outbound readiness stay attached to the live socket instead of drifting across monitor and login paths. (#65290) Thanks @mcaxtr and @vincentkoc.
  • iMessage: retry transient watch.subscribe startup failures before tearing down the monitor, and sanitize startup error logging so brief local transport stalls do not immediately bounce the channel or leak raw imsg RPC payloads into logs. (#65393) Thanks @vincentkoc.
  • CLI/audio providers: report env-authenticated providers as configured in openclaw infer audio providers --json, while keeping trusted workspace provider env lookup defaults stable during auth setup. (#65491)
  • Plugins/install: reinstall bundled runtime packages when the matching platform native optional child is missing, so packaged Windows installs can recover dependencies that were packed on another host OS.
Read the whole story
alvinashcraft
13 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Tested: Windows 11 just fixed slow storage management and removed a 30-year FAT32 limit

1 Share

Microsoft has rolled out new storage improvements in the latest Windows 11 Insider builds, including Dev build 26300.8170 and Beta build 26220.8165. These changes focus on faster storage settings, a better user experience, and removing an artificial limitation that existed for decades.

The update improves performance when navigating Settings > System > Storage > Advanced Storage Settings > Disks & Volumes, which is where you check drive properties, partitions, and storage details. Microsoft has also changed how the Storage page handles permissions, so the UAC prompt no longer appears immediately and only shows up when accessing temporary files.

Alongside that, Windows now allows formatting FAT32 drives up to 2TB via the command line, replacing the long-standing 32GB limit that existed for decades despite the filesystem supporting much larger volumes internally.

Opening disk properties on large drives has been unusually slow for a long time, especially on systems with multiple or high-capacity volumes.

I tested this myself on multiple drives, and the difference is bigger than I thought.

Windows 11 finally fixes slow storage settings on large drives

Changing drive properties from the Settings app wasn’t something I used to do, because my muscle memory clicks the Windows key and X, opening the Disk Management tool.

Disk Management tool
Disk Management tool

Although it looks decades old, which it is by the way, it still gets the job done. But I understand that I’ll have to force myself to use the latest tools if I want to see Windows lose legacy code.

That said, slow performance when going to see storage on large volumes from the Disk & Volumes page is a major annoyance. If you have a system with larger drives, especially mechanical HDDs with multiple partitions, opening Disks & Volumes and clicking on a drive’s properties could take an unusually long time to load.

In my case, it consistently took around 15 seconds for the page to fully respond.

Here is my PC opening the Storage settings for a 130GB Drive:

Yes, it took almost 15 seconds. Here’s the same thing on a 292GB drive:

Checking a third time with a 409GB drive:

All this was done on a 1TB mechanical hard drive split into multiple partitions, with different types of files across them. My PC itself wasn’t under load, and there weren’t many background apps running.

The issue becomes worse when you have larger volumes or multiple drives connected, because the Settings app has to query more data before rendering the UI.

Fortunately, Microsoft has finally improved the performance of Storage settings.

Microsoft’s release notes for the Dev build 26300.8170 and Beta build 26220.8165 simply mention “improved performance when navigating storage on large volumes,” but the actual change is more significant. The delay when opening disk properties is almost gone in the new Insider build.

To confirm that this wasn’t just hardware differences, I tested the same scenario inside a virtual machine running the latest Insider build. This VM only has 4GB RAM and 2 CPU cores, far less capable than my main system. Yet, opening disk properties was almost instant.

Yes, it’s instant. And I wasn’t expecting a massive improvement like this.

So why was this slow before? The likely cause comes down to how the modern Settings app handles storage data. Unlike legacy tools, it uses newer UI layers and background queries to fetch disk information, partitions, file system details, and usage data.

On larger drives, especially HDDs, this can take longer due to slower read speeds and the amount of metadata involved. If those queries are handled inefficiently or synchronously, the UI ends up waiting instead of rendering immediately.

This seems to be what Microsoft has addressed here. The faster response may be due to better handling of data fetching and UI rendering, possibly by optimizing how disk information is loaded or by reducing blocking operations.

Alongside this performance improvement, Microsoft is also updating a long-standing limitation in Windows file systems.

FAT32 limit jump from 32GB to 2TB is an important change in Windows

Until now, Windows has only allowed formatting FAT32 drives up to 32GB using its built-in tools, which wasn’t because of the file system itself. FAT32 has always supported much larger volumes, theoretically up to 2TB with standard sector sizes. The restriction was something Microsoft imposed inside Windows.

With this update for Windows Insiders, that artificial limit is gone, at least through the command line. You can now format FAT32 volumes up to 2TB natively without relying on third-party tools.

The original 32GB cap goes back to a time when large drives were rare and FAT32 wasn’t considered efficient at scale. It suffers from fragmentation and lacks features like journaling, which makes it less reliable compared to NTFS. Microsoft’s approach back then was to push users toward NTFS for internal drives and later exFAT for removable storage.

Their strategy worked, but it also meant that anyone who needed FAT32 for compatibility had to jump through unnecessary hoops.

Even today, FAT32 is still required in a surprising number of scenarios. Firmware updates for motherboards usually need a FAT32-formatted USB drive. Some gaming consoles and media devices also expect FAT32 for detection. Embedded systems and older hardware still depend on it as well.

That said, FAT32 comes with its own constraints. The most obvious one is the 4GB file size limit, which makes it impractical for modern workloads like large video files or backups. It’s not a replacement for NTFS or exFAT, and it’s not meant to be.

Storage settings now avoid unnecessary UAC prompts

Earlier, opening Settings > System > Storage could immediately trigger a UAC prompt, even if you were just trying to view basic storage information, which didn’t make much sense for a read-only action.

User Access Control prompt shows up while opening Storage in Settings app
User Access Control prompt shows up while opening Storage in Settings app

Now, the UAC prompt only appears when you access areas that require elevated permissions, such as viewing or managing temporary files.

Bigger improvements are coming soon to Windows 11

These storage improvements are currently available in Windows 11 Insider builds (Dev 26300.8170 and Beta 26220.8165). Microsoft hasn’t shared a timeline for stable rollout, but changes like these usually make it to regular users in the next few months or maybe even weeks.

With all the hatred from social media, I was, weirdly enough, not expecting Microsoft to be skilled enough to fix a part of Windows 11 that made it feel slow. Now that they have proved me wrong, it gives me hope that the development team can pull off everything that Microsoft is planning to fix in Windows 11.

The post Tested: Windows 11 just fixed slow storage management and removed a 30-year FAT32 limit appeared first on Windows Latest

Read the whole story
alvinashcraft
8 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Has the Rust Programming Language's Popularity Reached Its Plateau?

1 Share
"Rust's rise shows signs of slowing," argues the CEO of TIOBE. Back in 2020 Rust first entered the top 20 of his "TIOBE Index," which ranks programming language popularity using search engine results. Rust "was widely expected to break into the top 10," he remembers today. But it never happened, and "That was nearly six years ago...." Since then, Rust has steadily improved its ranking, even reaching its highest position ever (#13) at the beginning of this year. However, just three months later, it has dropped back to position #16. This suggests that Rust's adoption rate may be plateauing. One possible explanation is that, despite its ability to produce highly efficient and safe code, Rust remains difficult to learn for non-expert programmers. While specialists in performance-critical domains are willing to invest in mastering the language, broader mainstream adoption appears more challenging. As a result, Rust's growth in popularity seems to be leveling off, and a top 10 position now appears more distant than before. Or, could Rust's sudden drop in the rankings just reflect flaws in TIOBE's ranking system? In January GitHub's senior director for developer advocacy argued AI was pushing developers toward typed languages, since types "catch the exact class of surprises that AI-generated code can sometimes introduce... A 2025 academic study found that a whopping 94% of LLM-generated compilation errors were type-check failures." And last month Forbes even described Rust as "the the safety harness for vibe coding.." A year ago Rust was ranked #18 on TIOBE's index — so it still rose by two positions over the last 12 months, hitting that all-time high in January. Could the rankings just be fluctuating due to anomalous variations in each month's search engine results? Since January Java has fallen to the #4 spot, overtaken by C++ (which moved up one rank to take Java's place in the #3 position). Here's TIOBE's current estimate for the 10 most popularity programming languages: Python C C++ Java C# JavaScript Visual Basic SQL R Delphi/Object Pascal TIOBE estimates that tthe next five most popular programming languages are Scratch, Perl, Fortran, PHP, and Go.

Read more of this story at Slashdot.

Read the whole story
alvinashcraft
8 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Microsoft hasn’t had a coherent GUI strategy since Petzold

1 Share

Microsoft hasn’t had a coherent GUI strategy since Petzold
8 minutes by Jeffrey Snover

Over decades, shifting frameworks like Win32, WPF, UWP, and WinUI—often disrupted by internal conflicts and changing priorities—have confused developers. Jeffrey says that the problem is not weak technology, but poor coordination and frequent strategic pivots that leave no single, reliable path forward.

Share your thoughts on .NET dev tooling and get a chance to win a reward
sponsored by Jetbrains

JetBrains is conducting a survey to better understand how .NET dev tools impact developer productivity, and your perspective could really help the company make its tooling even better. It takes about 10 minutes to complete and focuses on your real-world experience with the tools. As a thank-you for your time, you’ll have the chance to win a small prize. Take the survey and make your voice count!

C# 14: Introducing interceptors
5 minutes by Anthony Giretti

C# 14 introduces interceptors, a way to silently replace a specific method call with a different one at compile time, with no runtime cost. The compiler swaps the call before producing any binary, making it fully compatible with Native AOT and leaving the developer's source untouched. Interceptors are always generated by Source Generators, never written by hand, since they rely on encoded file positions that change with every edit.

How to delete and update millions of rows in EF Core efficiently
7 minutes by Chris Woodruff

Loading rows into memory before modifying them works fine in development but falls apart at production scale. EF Core 7 added ExecuteUpdate and ExecuteDelete, which run directly on the database without loading any objects, cutting memory use and round-trips dramatically.

Your logout button is lying: ASP.NET session security done right
7 minutes by Martin Stühmer

Martin explains how poor session setup in ASP.NET can create serious security risks. He contrasts common mistakes with secure configurations that meet audit standards. Key practices include setting idle and absolute timeouts, using secure cookie settings, properly invalidating sessions on logout, and rotating JWT tokens. Martin points out that the goal is to move from “it works” to truly secure session management that prevents breaches and passes audits.

Functional programming in C# 15: Union types and the ApiResult Monad
9 minutes by Tore Aurstad

C# has been steadily absorbing ideas from functional programming — pattern matching, records, immutability. With C# 15, we get the feature that ties it all together: union types. Tore walks you through why they matter, how they work, and how they enable a clean ApiResult result monad that eliminates try/catch boilerplate and makes error handling composable.

And the most popular article from the last issue was:

Read the whole story
alvinashcraft
8 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Getting started with PgVector in .NET for simple vector search

1 Share

Getting started with PgVector in .NET for simple vector search
8 minutes by Milan Jovanović

Not every AI feature needs a dedicated vector database. pgvector is a PostgreSQL extension that adds vector storage and similarity search directly to your existing database. You enable the extension, create a vector column, and start querying. In this post Milan shows you what vector search is and when you need it, he walks you through provisioning pgvector with .NET Aspire and Ollama, generating embeddings with MEAI and storing with Dapper and querying by semantic similarity using cosine distance.

There Are Monsters Inside This Low-Level Book About Processors
sponsored by Kevin Focke

Processors. You use them every day, but do you know how they work? Learn the principles of processors and discover the monsters causing havoc in your code!

TUnit now captures OpenTelemetry traces in test reports
5 minutes by Tom Longhurst

TUnit now captures OpenTelemetry traces directly inside its HTML test reports. When a test runs against an ASP.NET Core app, spans from database queries, HTTP calls, and middleware all appear as a timeline next to the test result. Setup takes one NuGet package and two base classes. Tom says this makes failures easier to diagnose since instead of guessing, you can see exactly what the app did during the failing test.

Generic EqualityComparer for classes in C#
12 minutes by Tore Aurstad

C# classes use reference equality by default, meaning two objects with the same data are not considered equal. GenericEqualityComparer fixes this by comparing class instances by their property and field values instead. It uses reflection at startup to build fast compiled delegates, and supports public and private members. Tore suggests to avoid it in performance critical loops, and he prefers built-in equality for records and structs.

How to seed data to EF Core
6 minutes by Ricardo Peres

There are four main ways to seed data in EF Core. You can insert data explicitly in code, write a data-only migration with raw SQL, declare seed data inside entity configuration using HasData, or register seeding callbacks with UseSeeding and UseAsyncSeeding. Ricardo points out that each approach suits different needs: HasData works best for small fixed datasets, migrations for one-time SQL inserts, and UseSeeding for flexible logic that runs with both migrations and EnsureCreated.

URL pattern matching in .NET
2 minutes by Gérald Barré

Working with URLs in .NET applications often involves pattern matching for routing, security policies, or content filtering. While you could write custom regex patterns or string comparisons, Gérald argues there's a better way: the Meziantou.Framework.Uri package brings standardized URL pattern matching to .NET. This package implements the WHATWG URL Pattern API specification, providing a consistent and powerful way to match URLs against patterns with parameters, wildcards, and modifiers.

And the most popular article from the last issue was:

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