465 stories

Show HN: htmz – a low power tool for HTML

1 Comment
htmz - a low power tool for html a low power tool for html

htmz is a minimalist HTML microframework that gives you the power to create modular web user interfaces with the familiar simplicity of plain HTML. [GitHub]


Use straight up HTML. No supersets. No hz- ng- hx- v- w- x-; no special attributes. No DSLs. No <custom-elements>. Just vanilla HTML.


181 bytes in total. Zero dependencies. Zero JS bundles to load. Not even a backend is required. Just an inline HTML snippet.


No preventDefaults. No hidden layers. Real DOM, real interactions. No VDOM, no click listeners. No AJAX, no fetch. No reinventing browsers.

In a nutshell, htmz lets you swap page fragments with HTML from the server using vanilla HTML code.

Imagine clicking a link, but instead of reloading the whole page, it only updates the relevant portion of the page.

Inspired by htmx, Comet, ‘HTML As The Engine Of Application State’[1][2], and other similar web application architectures.


Check out these demos to get an idea of what htmz can do!

🐙 Select an example above!


Simply copy the following snippet into your page:

<iframe hidden name=htmz onload="setTimeout(()=>document.querySelector(this.contentWindow.location.hash||':not(*)')?.replaceWith(...this.contentDocument.body.childNodes))"></iframe>

For npm enjoyers, the following npm commands automate the process of copying the snippet into your page:

npm install --save-dev htmz
npx htmzify ./path/to/my/index.html

For hackers, you may start with the development version (deminified): htmz.dev.html

Basic usage

To invoke htmz, you need a hyperlink (or form) having these attributes:

  1. href (or action) pointing to the resource URL href="/flower.html
  2. Continuing within the href: destination ID selector #my-element"
  3. And a target attribute with this value target=htmz

<a href="/flower.html#my-element" target=htmz>Flower</a>

While this looks like an abuse of the URL fragment (it is), there is no other use for the URL fragment in this context, so it was repurposed as the destination ID selector. And it already looks like a CSS ID selector.

⚠ Important note: The loaded content replaces the selected destination. It may not be intuitive at first, but htmz does not insert the content into the destination. The rationale is that replacement is a more powerful operation. With replacement, you can replace, delete (replace with nothing), and insert-into (replace with the same container as original).

What does it do exactly?

htmz does one thing and one thing only.

Enable you to load HTML resources within any element in the page.

Think tabbed UIs, dual-pane list-detail layouts, dialogs, in-place editors, and the like.

This idea is not new. Dividing web pages into independently reloading parts has been a thing since mid-1990s. They were called frames, namely, <iframe>s, <frame>s, and <frameset>s.

htmz is a generalisation of HTML frames. — Load HTML resources within any frame any element in the page.

Read more on how it works in a section below.


More example applications, componentization approaches, and code in different languages can be found in the /examples directory. To start the example server:

cd examples

Then load http://localhost:3000/.

Advanced usage

Naturally, only <a> and <form> elements can target and invoke htmz (as of current HTML5). This is fine; it’s semantic, after all. However, HTML offers a couple more features that work well with htmz.

Per-button action & target

If you want to override the form’s action on a per-button basis, use the <button>’s formaction attribute.

<form action="/default#my-target" target=htmz>
  <button>Default form action</button>
  <button formaction="/button#my-target">
    Different button action
  <button formaction="/another-action#another-target">
    Another action

Base target value

Tired of adding target=htmz to every link and form?

Using the base element, set htmz as the default target for all relative links. Add this at the top of your page.

<base target=htmz>

Clean target values

Don’t like the look of target=htmz at all? Prefer using the real target as the value?

We can do a hack that enables you to write the target ID selector in the target attribute itself! Like this:

<a href="/flower.html" target="#my-element">Flower</a>

The key is to add an iframe with a matching name, and modify the htmz snippet accordingly.

<iframe hidden name="#my-element" onload="htmz(this)"></iframe>
  function htmz(frame) {

You can even automate the generation of matching target iframes.

Scripting / interactivity

If you need something more interactive than the request-response model, you may try the htmz companion scripting language: javazcript. Sorry, I meant JavaScript, a scripting language designed to make HTML interactive.

htmz does not preclude you writing JS or using UI libraries to enhance interaction. You could, say, enhance a single form control with vanillaJS, but the form values could still be submitted as a regular HTTP form with htmz.

That said, htmz is extensible!


Need advanced selectors? Need error handling? Multiple targets? Fear not; the hero is here to save the day. The hero is you.

Here’s the development version of the snippet. Feel free to hack and extend according to your needs. You’re a programmer, right?

  function htmz(frame) {
    // Write your extensions here

    setTimeout(() =>
        .querySelector(frame.contentWindow.location.hash || ":not(*)")
<iframe hidden name=htmz onload="htmz(this)"></iframe>

A number of extensions will be available in the custom builder (coming soon!).


How does it work?

htmz is an iframe named "htmz". You invoke htmz by loading a URL into the iframe via target=htmz. By using an iframe, we lean on the browser’s native capability to fetch the URL and parse the HTML. After loading the HTML resource, we take the resulting DOM via an onload handler.

htmz is essentially a proxy target.

Like how a proxy server forwards requests to some specified server, proxy target htmz forwards responses into some specified target.

<a href="/flower.html" target="#my-element">Flower</a>

<a href="/flower.html#my-element" target=htmz>Flower</a>

When you load a URL into the htmz iframe, the onload handler kicks in. It extracts your destination ID selector from the URL hash fragment and transplants the iframe’s contents (now containing the loaded HTML resource) into your specified destination.

htmz only runs when you invoke it. It does not continually parse your DOM and scan it for special attributes or syntax, nor does it attach listeners in your DOM. It’s a proxy not a VPN.

So it’s just another JavaScript framework?

Oh my! Not the f-word!!!

On a more serious note, I would say that rather than a JS one, it’s more of an HTML micro-f*******k. It does use JS, but only the minimum necessary.

Is htmz a library or a framework?

htmz is a snippet. ✂️

What does htmz mean?

HTMZ stands for Html with Targeted Manipulation Zones.

Is this a joke?

This started as a “Do I really need htmx? Can’t I do the load-link-into-target thing with current web? Sounds a lot like frames.” and ended up with this.

So, it isn’t quite a joke, but a response to htmx. I wanted to try htmx. The premise sounded great (Why should you only be able to replace the entire screen?), then I saw that it was 16kB of JavaScript. Huh. Then there’s special syntax everywhere. Huh. I don’t want to learn a whole new set of instructions and Turing-complete DSLs specific to those instructions.

Regardless of joke status, htmz seems fine as a library. It feels kinda powerful for its tiny size. (But really it’s the browser that’s doing the heavy lifting!) Nonetheless, there are limitations.

What are the limitations?

The main direct limitation is having only one destination per response. However, this can be fixed by writing an extension. ;)

A more general but classic limitation is the request-response model. The Web 1.0 model. This might mean putting more UI logic in the web server. This can be a good thing or a bad thing, as it can mean either consolidation or fragmentation of UI logic, which respectively decreases or increases complexity. It really depends on your goal and style.

Adblock test (Why?)

Read the whole story
9 days ago
This is amazing!
Share this story

Saturday Morning Breakfast Cereal - Secrets

1 Comment and 4 Shares

Click here to go see the bonus panel!

Kids, you can literally find ways to annihilate all humans, but you have to start with algebra!

Today's News:
Read the whole story
11 days ago
Share this story

Is Something Bugging You?

1 Comment

Will Wilson


February 13, 2024

It’s pretty weird for a startup to remain in stealth for over five years. People ask me why we did that, and my answer is always the same: “We wanted to build something awesome before releasing it out into the wild, and we were lucky enough to be able to do that under the radar while also attracting great hires, finding early customers, and working with investors.” All the same, it’s an unnatural thing for a startup to do. A lot of muscles end up atrophying, including those you use to talk to the world. Fortunately, we’re going to get a lot of practice at it now, because in those five years we’ve built a lot of stuff – way more than I can tell you about right now. But I can tell you the first part of it.

Why We Built This

Some of you have heard of our last company, FoundationDB. At first glance, Antithesis couldn’t be more different from FoundationDB, but it’s also a continuation of that story in a funny sort of way. When we sat down in 2010 to build a scalable, fault-tolerant distributed database with ACID transactions, most people didn’t even think it was possible.[1] We were agnostic as to whether it was possible or impossible, but we were certain that even under the best circumstances, it would be very hard. And the part that seemed hardest was how on earth you could test or validate such a thing, and how you could gain confidence in its correctness.

The fundamental problem of software testing—you might say the fundamental problem of software development—is that software has to handle many situations that the developer has never thought of or will never anticipate. This limits the value of testing, because if you had the foresight to write a test for a particular case, then you probably had the foresight to make the code handle that case too. This makes conventional testing great for catching regressions, but really terrible at catching all the “unknown unknowns” that life, the universe, and your endlessly creative users will throw at you.

solving the wrong problem

This isn’t unique to distributed databases: every kind of software has this problem, but a distributed storage system really turns it up to 11. Now you’ve got concurrency, both within each machine and between machines. You’ve got networks, which always seem to be delaying or reordering packets at the worst possible moments, and disks, which are just waiting for you to look away so they can start vomiting all over your data. And then you’ve got all the stuff that can really go wrong—machine failures and power outages and datacenters catching fire and, oh yeah, well-meaning human beings panicking and accidentally making things worse. What’s especially hard about these failure modes is that they’re non-deterministic—you can easily have a catastrophic bug that’s exquisitely dependent on the precise ordering of events across multiple machines in a cluster. Even if your tests find it once, they may never find it again (but don’t worry, your customers will find it for you). And here we were, trying to make a software system that would behave perfectly and maintain its ACID guarantees in the face of all of this. How were we going to do that?

So we did something crazy, which turned out to be the best decision we made in the whole history of the company. Before we even started writing the database, we first wrote a fully-deterministic event-based network simulation that our database could plug into. This system let us simulate an entire cluster of interacting database processes, all within a single-threaded, single-process application, and all driven by the same random number generator. We could run this virtual cluster, inject network faults, kill machines, simulate whatever crazy behavior we wanted, and see how it reacted. Best of all, if one particular simulation run found a bug in our application logic, we could run it over and over again with the same random seed, and the exact same series of events would happen in the exact same order. That meant that even for the weirdest and rarest bugs, we got infinity “tries” at figuring it out, and could add logging, or do whatever else we needed to do to track it down. I gave a talk about this at Strangeloop in 2014, which you can watch here.

Anyway, we did this for a while and found all of the bugs in the database. I know, I know, that’s an insane thing to say. It’s kind of true though. In the entire history of the company, I think we only ever had one or two bugs reported by a customer. Ever. Kyle Kingsbury aka “aphyr” didn’t even bother testing it with Jepsen, because he didn’t think he’d find anything.


It was a good database. But actually, this is not the cool part of the story.

Here is the cool part of the story. The cool part is what happened after we found all the bugs in the database. You see, once you’ve found all the bugs in something, and you have very powerful tests which can find any new ones, programming feels completely different. I’ve only gotten to do this a few times in my career, and it’s hard to convey the feeling in words, but I have to try. It’s like being half of a cyborg, or having a jetpack, or something. You write code, and then you ask the computer if the code is correct, and if not then you try again. Can you imagine having a genie, or an oracle, which just tells you whether you did something wrong? The closest comparison I have is the way some people talk about programming in Haskell or in Rust, where after half an hour of siege warfare against the compiler, it agrees to build something, and you can be confident that it won’t have certain kinds of bugs. But there’s a limit to what a compiler can tell you. I love me a powerful type system, but it’s not the same as actually running your software in thousands and thousands of crazy situations you’d never dreamed of.

At FoundationDB, once we hit the point of having ~zero bugs and confidence that any new ones would be found immediately, we entered into this blessed condition and we flew. Programming in this state is like living life surrounded by a force field that protects you from all harm. Suddenly, you feel like you can take risks. We did crazy stuff. We deleted all of our dependencies (including Zookeeper) because they had bugs, and wrote our own Paxos implementation in very little time and it had no bugs. We rewrote the entire transaction processing subsystem of our database to make it faster and more scalable – a bonkers thing to do btw – and the project was shockingly not a debacle, and oh yeah it had no bugs. We had built this sophisticated testing system to make our database more solid, but to our shock that wasn’t the biggest effect it had. The biggest effect was that it gave our tiny engineering team the productivity of a team 50x its size.

In 2015, Apple acquired FoundationDB and began using it as the “underpinning of their cloud infrastructure” (that’s a direct quotation from Apple, so they can’t sue me), and then open sourced it a few years later. As our team began to disperse throughout other big tech companies, we were shocked to find that even in these sophisticated organizations, nothing like FoundationDB's deterministic simulation testing existed. The near-impossibility of anticipating unintended system impacts meant that changes to their backend systems happened at a snail's pace, and diagnosing and fixing production bugs consumed months of extremely valuable time from some of their most senior engineers.

So I called up my friend and former boss Dave Scherer (FoundationDB’s chief architect), and told him: “There’s a $100 bill lying on the sidewalk here man.” Of course, economic theory will tell you that those don’t exist. There’s always a catch, always some horrible reason that the pot of gold is surrounded by corpses. But starting a company is about banishing that thought and telling yourself that when you reach the pit full of poisonous spikes, you’ll figure something out. So in 2018, we started Antithesis with the goal of bringing the superpower of FoundationDB-style deterministic autonomous testing to everybody else.


What We've Built

Sure enough, the $100 bill is surrounded by an entire field of poisonous spike-pits, nay, a continent of them. Here’s an obvious one: how do you take an arbitrary piece of software, which is probably doing stuff like spawning threads, checking the time, asking the kernel for random numbers, and talking to other software over a network, and make it deterministic? At FoundationDB we had the benefit of a green-field project that we knew we wanted to test this way, and we had no dependencies (or at least, we didn’t once we’d deleted them all). But any new software development methodology that requires everybody to rewrite everything from scratch isn’t going to get very far. We thought about this and decided to just go all out and write a hypervisor which emulates a deterministic computer. Consequently, we can force anything inside it to be deterministic. That meant learning lots of fun new things about how Intel CPUs handle extended page tables and other related horrors. It’s a story for another time, but it’s a good example of the kind of poisonous spike-pit we’ve gotten to explore (and it’s far from the worst one!).[2]

Anyway, we’ve built a platform that takes your software and hunts for bugs in it. When it finds one, that bug is always perfectly reproducible, no matter what crazy thing your software was doing–even if it involves multiple services communicating across a network. Also, once we’ve found a bug, we can bring some relatively space-age and insane debugging capabilities to bear on it. The platform is designed to be able to someday find many kinds of bugs in many kinds of software, but for now, we’re focused solely on distributed systems reliability / fault tolerance testing, because it’s an area where we already know what we’re doing.

Over the past several years we’ve partnered with engineering teams at a bunch of organizations with big and complicated systems whose reliability they consider critical. We’ve worked with MongoDB for several years, helping them test their core server software as well as their WiredTiger storage engine. We began working with the Ethereum Foundation about a year ahead of the Merge in order to help them test it, and continue working with them today. And we’re working with Palantir—but when I told them I was writing this blog post they just glared at me and said “no comment”, so that’s all I can say about that.

Initially, these customers thought of Antithesis as a “special forces” tool that primarily helped them find and replicate their most elusive and dangerous bugs. But as our platform has become more mature and interactive, we’ve shifted to being an “always on” service that continuously tests the most recent builds of their software, thus shortening the time from bug introduction to bug discovery. When building FoundationDB, we found that this made diagnosing and fixing bugs dramatically easier, increasing our efficiency and improving our software quality. Our customers are seeing this effect now, and we’re excited to help many more of you reach the ~zero bugs promised land in the years to come.

Get In Touch?

If your organization runs a distributed system and values reliability and engineering productivity, we’d love to talk.

Do you occasionally walk into a spike pit and say to yourself: “Not bad, but these spikes really aren’t poisonous enough”? If so, please take a look at our open positions.

If you’ve got questions or comments, feel free to reach out on TwitterX or contact@antithesis.com (we’ll actually reply).

If you’ve made it this long – thank you for reading. More to come soon.

1. Back then Spanner wasn’t public yet and a lot of people misinterpreted the CAP theorem to say that a strongly consistent database couldn’t also be highly available in the face of network faults.
2. As Dave never ceases to remind me, the problem of exploring the state space for an arbitrary program, looking for violations of a property that could involve multiple rounds of universal and existential quantification, is actually worse than the Turing Halting Problem. There are test properties that would still be uncomputable even if you had a halting oracle for every program.

Adblock test (Why?)

Read the whole story
15 days ago
Super interesting how they did this!
Share this story

Goodbye Non-Kiss Appliances

1 Comment


Yesterday, we gave away our ~6-year-old GE French-door refrigerator after a never-ending slog of repairs. At least the guy and his mother who came to pick it up have a side-hustle of repairing and reselling appliances. There's hope it won't end up in a landfill. He offered to sell me a 4-door Samsung. No Thanks! I'm done with over-complicated appliances. Refrigerator repair is not a skill I'm looking to hone any further.

I have a refrigerator in my garage that's a side-by-side style Kenmore (Model# 25354362402). The sticker on the inside indicates a manufacture date of 06-04. It was bought as a scratch-and-dent model from Sears Outlet. At some point, over a decade ago, the relay on the compressor went out. The fix was cheap and easy. Later, we started having problems with the ice maker / dispenser. Instead of fixing it, we decided to get a new one and use the side-by-side as a second refrigerator in the garage. Since then, it's out-lived two French-door refrigerators we have had in the intervening time.

For the replacement, we went with a French-door style Kenmore (Model# 79572053110) because, you know, all that space in the fridge, and again scratch / dent sale.

I don't even remember all the problems we had with it, and this was before I started keeping better records. I have the notes from the last repair receipt:

cked unit ice build up around ice fan motor fines removed heater good no problem found.

After about the second repair of the same issue, I was surprised they let me buy an extended warranty on it. Fast-forward past 6-10 (I forget) repairs / replacements of the same part and much hassle, they gave me store credit as though I bought it new without dents. The amount, I forget, but ended up being a curse because we felt compelled to use it all on an even fancier French-door refrigerator this time brand new.

I wish I could go back in time and slap myself in the face for deciding to buy another French-door refrigerator. I even remember thinking about the KISS principle at the time, but somehow thought switching brands and spending 3x the amount would save us from the complexity.

This refrigerator (model# CFE28TSHESS) sports all these wonderful features:

  • touch screen LCD
  • ice, water, and hot water dispenser
  • RFID chipped water filters to lock-in customers to buy their $50 filters

I keep notes and TODO tasks using org-mode, and I was just gathering my notes on this refrigerator and found I have written ~1300 words on it, not counting this blog post. The following is a summary.

The first annoyance was having to employ a hack to get around GE water filter lock-in.

I've had the evaporator fan fail on me twice. Once in 2020 and its replacement failed in 2022. When that happens, the fridge compartment doesn't cool well. A video on how to replace it for context.

Ice builds up in the bottom of the freezer if the drain to the evaporation pan gets clogged. Cleaning the rubber hose and dust off the condenser is a yearly chore at least. It becomes the reason to take all the food out and fully clean everything. Otherwise, get ready to spend hours defrosting. One hack we found to speed it up was to pour nearly boiling water down the drain to defrost the ice build up.

Once the freezer stopped cooling, and we noticed the case was hot to the touch on the side between the freezer and fridge compartments. This ended up being due to a failed condenser fan. A real PITA to replace, by-the-way.

Around that time I found the technical service manual online and realized one can view error codes and run all sorts of tests via the LCD touch screen. Then I found out that the touch screen wasn't working. Since a new touch screen LCD assembly is over $300, so I ordered one off ebay instead.

We had a problem with the "new" LCD assembly intermittently pressing the hot water button on its own. Basically, the person I got the part from on ebay lied saying that it was brand new. It was refurbished. We could tell because there had been some soldering work done to the board. Instead of uninstalling it and returning it, we realized that button pressing over and over wasn't affecting any functionality (we don't use its hot water dispenser anyway). We just turned the sound off to stop the annoying repeated chiming noise.

From running fan tests in service mode, I could tell the odor remover fan also died, but I never cared to replace it. Fans are expensive!

Recently, it stopped working again. With the power of YouTube and a multi-meter I was able to test the capacitor on the relay was good, but the relay was bad. Replaced the relay, but the compressor still is not starting. Tested that it is getting 120VAC.

Here's my notes from my before replacing the relay:

- Note taken on [2023-12-05 Tue 20:09] \\
  WR07X10131 it was the relay that plugs into the compressor. It rattles when
  shaken, and it doesn't have continuity between the two main pins.

  | Fault Code Definition                              | code | count | days ago |
  | Cold Water Cup Switch input missing                |  709 |    14 |        2 |
  | Condenser Fan cannot reach target RPM              |  105 |     2 |        0 |
  | FF Temp Exceeded 75°F                              |  303 |     1 |        0 |
  | FZ Temp Exceeded 72.5°                             |  304 |     1 |        1 |
  | Condenser Fan cannot reach target RPM              |  105 |     2 |        0 |
  | N/A ????                                           |  800 |    63 |        0 |
  | 5 consecutive FF abnormal defrosts.                |  203 |   244 |        1 |
  | N/A ????                                           |  803 |   204 |        0 |
  | N/A ????                                           |  600 |     2 |       13 |
  | Deli Pan Fan Feedback Missing when fan is running. |  112 |   120 |        0 |
  | FF Defrost Heater on for max time.                 |  201 |   217 |        0 |

Note the Condenser Fan cannot reach target RPM despite it being recently cleaned out with an air compressor and replaced on 2021-06-05, the $74 fan can't reach RPM? It was working and has nothing to do with the compressor not running, but it's hard to justify spending more money to fix this thing with the non-stop fan issues.

At the limit of my refrigerator repair skills and wits' end, we decided to give away the GE refrigerator.

Based on this video, We are upgrading to simplicity. Top freezer refrigerator. I'll get an ice maker add-on (no dispenser) and a water pitcher for filtered water. After using ice trays for a few weeks, we decided it's actually not that bad and returned the ice maker.

We haven't decided on brand / model yet. I understand that the long-lasting refrigerator in my garage is probably a coincidence.

I'll admit engineering effort can tame complexity. For example, the combustion engine and hybrid cars are surprisingly reliable. And perhaps, for the right price, there are brands that have pulled it off with complex refrigerators. There's just not enough value added by any of the fancy features to warrant the potential headache.

We're at the end of a long year of remodeling. There are lot of stories I could tell, but I feel like it's worth a mention to how painless it is to live without a garbage disposal. Another thing in my life I don't have to worry about.

Old-school top load washing machine has been serving us well for the most part (Maytag MVWP575GW). The shift actuator assembly did go bad once. It was about $60, but wasn't too hard to replace.

We have a Whirlpool dryer since about 2004 too. I replaced the heating element once a few years ago. Obviously, no extraneous features to worry about there.

Adblock test (Why?)

Read the whole story
25 days ago
So true. Our next fridge will be simple if one is still available.
Share this story

Milwaukee reporter investigates cousin's 1978 car bombing death

1 Comment

Florence Grady and Augie Palmisano reached the elevator doors at the same time.

Both were tenants at Juneau Village Garden Apartments in downtown Milwaukee. And shortly before 9 a.m. that Friday — June 30, 1978 — both were heading to the basement of the apartment complex.

Grady was carrying a basket of clothes to the laundry. Augie was going to the underground parking garage. They chatted about the weather and Summerfest.


When they reached the basement, she went to the laundry room. He walked to his car, a 1977 Mercury Marquis.

Less than a minute later, there was a massive explosion. Grady thought the boiler had exploded. But when she looked into the garage, she saw Augie’s car in flames.

The blast shook the city. Paintings fell from walls and books tumbled off shelves. One woman said her recliner lifted off the ground. Tenants ran from the building as firefighters and police rushed to the scene.

Augie Palmisano was my cousin.

His murder has never been solved.

We don't talk about Augie

I was told very little about Augie’s life when I was a child. I heard even less about his death — except when my father was trying to scare me straight.

“Don’t fall in with the wrong crowd. Look what happened to Cousin Augie.”

“Don’t gamble. You don’t want to end up like Cousin Augie.”

“Don’t talk back to the wrong person. You know what happened to Cousin Augie.”

I actually knew almost nothing about what happened to Augie. I was four years old when he was killed, and have no memory of ever meeting him. 

The most I heard about Augie probably came from TV news in the early 1980s when reputed Milwaukee crime boss Frank Balistrieri was facing gambling and extortion charges. I remember a TV reporter talking about how Balistrieri was suspected of being involved in Augie’s murder. I hurried from the living room to the kitchen, where my mom was making dinner, and told her they were talking about Cousin Augie on the news. She looked mortified.

Through the years my siblings and I have heard various stories, typically passed on in hushed conspiratorial tones, about why Augie was murdered. In one version, he was killed over gambling debts. In another, he became some sort of Mafia kingpin. In yet another widely believed — and still often repeated — theory, he was an informant.

I had no idea which of those stories was true.

I was raised hearing stories about my grandparents and their families coming from Sicily to the United States, and how they rose to success through hard work and sacrifice. They were more than family stories to me. They were lessons in how to live.

But my father didn’t ever want to talk about Augie. He was the youngest of 13 in a Sicilian immigrant family, and I think he wanted to keep his own children out of trouble and far away from even the mention of organized crime. 

After my dad died 11 years ago, I thought my Aunt Marjorie — the last survivor of the 13 Spicuzza siblings — might tell me why Augie was killed.

“Why do you want to talk about that?” she snapped, ending the discussion before it started.

Now an investigative reporter at the Milwaukee Journal Sentinel, I mustered the courage to try to find out what happened to Augie, and why. 

I turned to police files, FBI reports and newspaper articles — and tracked down former detectives, FBI agents, prosecutors and others who knew Augie, many of whom agreed to speak with me about the case for the first time.

What I found was a story about loyalty, jealousy, and power — and what some people are willing to do for it.

'The King of Commission Row'

Augie in historical photos. Bottom left: Augie’s father’s produce truck. Top right: Augie’s bar on North Broadway, circa 1980s.

Agostino (August) Palmisano was born in 1928. He was the son of my great-uncle Giovanni (John) Palmisano and his wife, Angeline, making him my father's first cousin.

Like many Sicilian Americans in Milwaukee, Augie’s story is rooted in the Third Ward.

The Third Ward – which lies on the southern edge of downtown – was an Irish enclave for much of the 19th century. It came to be known as the “Bloody Third” due to its rough reputation, thanks in part to the high number of saloons and brawls. 

After a massive fire in 1892 destroyed more than 400 buildings and left some 2,000 people homeless, Italian immigrants moved into the neighborhood. 

Most, including my father’s family, came from Sicily. And many of them made a living in the produce business, selling fruits and vegetables – first from push carts, then horse-drawn wagons and eventually trucks. The Palmisano and Spicuzza families were among them.

Augie grew up helping at his father’s produce business in the heart of what was then known as Commission Row — a gritty stretch of Broadway that was packed with fruit and vegetable merchants. One fading black and white photograph shows a John Palmisano & Sons Wholesale Produce truck with “AUGIE” painted on the driver’s side door.

Augie graduated from Lincoln High School on Milwaukee’s east side, where he ran cross country, acted in plays, and was a manager for the football team. I’ve been told so many Sicilian Americans attended Lincoln High that at one point plays were called from the sideline in Italian. It was the same school that Frank Balistrieri graduated from a decade earlier. 

In 1952, Augie married Jean Rose Lassa. They had four children together and bought a home for the family in Whitefish Bay. He worked second shift at American Motors while helping run the family produce company. After his father died in 1964, Augie took over the company, which by then was named Palmisano Produce. 

In the years that followed, Augie started running the tavern adjacent to Palmisano Produce. It was called Richie’s on Broadway, but he eventually renamed it Palmy’s.

Augie’s side-by-side businesses – perched on the corner of North Broadway and East St. Paul Avenue – became a gateway of sorts to Commission Row. 

A painting behind Augie’s bar portrayed him as the “King of Commission Row.” Palmisano standing next to a fruit display.

The tavern was especially popular with Commission Row’s produce workers. It had a long bar, a pool table, a couple of pinball machines, and a jukebox that frequently played Frank Sinatra songs. A typical Friday night included a fish fry featuring the catch of the day from Lake Michigan.

By many accounts, it was a wild place where illegal craps games were sometimes played on the pool table, people would stop for dice or card games, and a lot of money changed hands.

Most nights, Augie held court while tending bar, ready with a witty remark or practical joke, or just to loan a friend some cash or a sympathetic ear. 

Behind the bar hung a painting that showed Augie and a bottle of Early Times whisky, both hovering larger than life over his two businesses. The artist who painted it said it was meant to portray him as “the King of Commission Row.”

As his legitimate businesses grew, so did his gambling operation. 

'A Harvard education in the hustle game'

Milwaukee Journal Sentinel investigative reporter Mary Spicuzza sorts through the news organization’s archives on her cousin Augie.

One afternoon, I went to the now-shuttered Journal Sentinel printing plant in West Milwaukee to search for more information in our archives, known by people in the industry as “the morgue.” I found several small, musty-smelling manila envelopes and file cards with Augie’s name on them – all stamped “DEAD” in green ink – and many more devoted to Frank Balistrieri. I borrowed them all. 

The envelopes were filled with newspaper clippings and microfiche that offered more glimpses into Augie’s life. 

He first became front page news in the early 1960s.

“Gambling Crackdown! 3 Arrested,” was splashed across the top of the Milwaukee Sentinel – above the name of the newspaper – on March 23, 1962. 

The front page of The Milwaukee Journal that same day featured a photograph of Augie with his hand covering his face. It was the first picture I can remember seeing of my cousin.

Augie was nearly 6 feet tall and had a slender build, which made him appear even taller. He had dark brown eyes and black hair parted on the side. But in the photograph, it looked like he was trying to disappear beneath his left hand and hat. Only his nose and ear were visible.

The articles detailed how Augie was accused of accepting bets on college basketball games. He was eventually convicted and fined $1,000. 

Through the clips — and hundreds of pages of FBI records — I learned that Augie grew his small gambling activities into a fairly large bookmaking operation, one that reportedly spanned several taverns across the city. Although profitable, it also drew unwanted attention from law enforcement, who seemingly had his tavern under constant surveillance for months at a time.

Newspaper clippings from Augie’s early gambling charges in the 1960s.

Augie’s tavern was one of nine locations raided on Super Bowl Sunday in 1974, when 60 FBI agents searched locations in and around Milwaukee. In the raids, agents confiscated piles of gambling records, guns and about $20,000 in cash.

Agents also found something else in the basement of Augie’s tavern – 93 sticks of dynamite stashed in a crawlspace. It was unclear how long the dynamite had been there, and Augie said he had no idea where it came from. The charges linked to the dynamite were dropped, and he eventually pleaded guilty to conducting a gambling business. 

A Milwaukee Sentinel article about the case said Augie’s attorney argued he “comes from a good family, is the father of four children, gets up daily at 4 a.m. to start operations at Palmisano Produce, works eight hours operating a truck and then helps run his tavern.” The article said Augie “had been working 12 to 14 hours a day, six days a week since he was a young man.”

One of Augie's former employees, who asked not to be identified because of safety concerns, told me he was “a good dude” who “had his hands in everything.”

“I got a Harvard education working at Palmy’s,” the man said. “I really got a Harvard education in the hustle game.”

The way he tells it, Augie was “bigger than God,” and at the center of it all.

He, like others, described Augie as well-liked and funny, somebody who played by his own rules but would also lend people money or give them food when they needed it.

I asked the former employee – who said he fled town after Augie’s murder – why my cousin was killed. His eyes filled with tears.

“He was too big. He got too big,” he said. “And Frank Balistrieri couldn’t put up with it.”

Fancy pants

Left: Frank Balistrieri entering federal court in 1984. Center: Balistrieri leaving the Federal Building in 1983 after being convicted of gambling and tax charges. Right: Balistrieri in 1966.

Most Sicilian Americans in Milwaukee had nothing to do with organized crime.

The same could not be said about Frank Balistrieri.

Born in 1918, Balistrieri graduated from Marquette University and briefly attended law school there. But by the 1950s, the FBI had placed him on its nationwide list of "top hoodlums."

Balistrieri reportedly took over as Milwaukee’s organized crime boss by the early 1960s, and had a wide range of legal and illegal business interests: nightclubs, restaurants, strip clubs, vending machines and gambling.

FBI documents show that starting around that time, Balistrieri decided bookmakers in Milwaukee should be required to give him a cut of their profits, and sent his enforcers to collect. 

And Balistrieri – who frequently conducted business from a table at Snug’s restaurant on the ground floor of the Shorecrest Hotel, which was owned by his family – became a key figure in skimming money from Las Vegas casinos, a story made famous in the 1995 movie “Casino.”

Balistrieri was a short man, but had an ominous presence. Franklyn Gimbel, a former federal prosecutor who won a tax evasion case against Balistrieri in 1967, said his eyes were like “spotlights… from his skull that penetrated everything he looked at.”

Some called him “Frankie Bal,” “Mr. Big,” or “Mr. B.” He was also known as "Fancy Pants" due to his hand-tailored, custom-made suits. That nickname was especially popular among people who didn't like him.

Balistrieri demanded respect, and was notoriously ruthless when it came to getting it.

Longtime Milwaukee Sentinel investigative reporter Mary Zahn and columnist Bill Janz once reported that Balistrieri’s willingness to resort to violence even drew criticism from his father-in-law, John Alioto, who preceded him as Milwaukee’s crime boss. Alioto pleaded for more merciful solutions after Balistrieri threatened to kill two men during an argument secretly recorded by the FBI.

“L’amazzari,” Balistrieri said in Sicilian. I’ve got to kill them.

He was suspected by law enforcement of ordering a string of murders in and around Milwaukee, none of which were ever solved.

August J. Maniaci pictured in 1961. Maniaci was shot and killed in an alley behind his house in 1975.

In 1960, nightclub owner Isadore “Izzy” Pogrob was shot to death and left in a ditch in Mequon. The murder reportedly happened soon after Balistrieri got a phone call at one of his taverns, glanced over at several of his associates, and slid his index finger across his throat.

In 1963, the body of Anthony Biernat, a jukebox distributor, was found in the basement of a vacant farmhouse near Kenosha. He’d been tied up and beaten to death, and his body was covered in lime in an apparent effort to speed decay.

In 1972, Louis Fazio was shot several times with a .38-caliber gun outside his home. Balistrieri was later heard gloating about Fazio’s death.

In 1975, August Maniaci was murdered outside his East Side home by someone with a .22-caliber pistol equipped with a silencer. Maniaci had openly feuded with Balistrieri.

Soon after, an informant told the FBI that Balistrieri thought Maniaci’s brother Vince might try to get revenge. Balistrieri reportedly put out the word that Vince “should be killed like his brother.”

Balistrieri was never charged in any of the murders.

Vincent Maniaci

Vincent Maniaci, Augie’s best friend, pictured in 1975. Top right: Vince’s bar on North Water Street in 1976. Bottom right: Police disarming a bomb found in Vince’s car in 1977.

Vincent Maniaci was my cousin’s best friend. They were so close, they were like brothers, a former FBI agent told me. 

Vince ran a bar on Water Street named Little Caesar’s Cocktail Lounge, later known as Under the Bridge. He was also a regular at Augie’s tavern, often seen laughing and joking with my cousin as he tended bar. 

Like Augie, Vince had some run-ins with the law. The same year his brother was murdered, Vince was sent to prison for fencing four stolen mink coats and threatening someone who owed him money.

When he was released from prison, the FBI was so convinced somebody wanted Vince dead that agents started following him everywhere he went. 

The morning of Aug. 17, 1977, Vince tried to start his car but could tell something was wrong. The accelerator was so stiff he couldn’t push it down to the floor. He drove 15 to 20 mph – as fast as it would go – from the north side halfway house where he was staying to the East Side. 

After a brief stop he went to his mechanic, who opened the hood and immediately spotted a package with wires coming out of it. “I’m going to call police,” he told a shaken Vince. “It looks like a bomb.”

Vince ran for cover and was picked up by the FBI agents who’d been following him. They took him to an agent’s house, where he had a stiff drink and told investigators he had no idea who would want him dead. Soon afterward, federal officials sent Vince back to prison for his own protection.

Members of the Milwaukee Police Department bomb squad found a taped-up gray package placed near the engine on the driver's side of Vince’s car, jammed near the accelerator and wired to the ignition with alligator clips. The bomb had 20 sticks of dynamite and a booster but luckily failed to detonate, possibly due to faulty wiring.

A police report described the device as an “overkill bomb” designed to “destroy all traces of possible evidence that could connect anyone” with the crime.  

Donnie Brasco

Not long after someone planted a bomb in Vince’s car, the FBI brought in an agent named Joseph Pistone to help infiltrate the Balistrieri crime family.

Today, Pistone is better known by his undercover name: Donnie Brasco.

He wrote about his experience in a book, which inspired the 1997 movie starring Johnny Depp as Pistone and Al Pacino as New York crime family member Benjamin “Lefty” Ruggiero

One scene from Pistone’s book in particular stuck with me – the strong reaction Ruggiero had when Pistone mentioned Milwaukee. Ruggiero didn’t know it at the time, but “Donnie” was trying to help another undercover FBI agent who was posing as a new vending machine company owner in Milwaukee.

An undated surveillance photo of FBI Agent Joe Pistone while undercover as “Donnie Brasco.”

“He’s crazy, Donnie. Doesn’t the f------ guy know you can’t operate a vending business anywhere without connections? Especially Milwaukee. They’re crazy out there. It ain’t like in New York, Donnie, where they may just throw you a beating to chase you out. Out there they’re vicious. They answer to Chicago, you know. They blow people up. Donnie, if this guy’s a friend of yours, you better tell him to get the hell out of that town.” 

When I reached Pistone, he was gracious with his time, patient, and had an impressive memory.

At the time, organized crime in Milwaukee wasn’t as well-known as the Outfit in Chicago or the Mafia in New York. But Pistone said Balistrieri was a “very well-known” Mafia boss throughout the U.S. who was closely aligned with the Chicago Outfit — and notorious for his brutality. 

Pistone recalled one night when Balistrieri took him and others to a charity banquet on a whim. Pistone said people scrambled to clear a table in a prime spot for Balistrieri and his entourage. 

“It had to be a couple hundred people. Everything just stopped when they saw him. The maitre d’ came over and said, ‘Oh, Mr. Balistrieri, I didn't know you were coming,'" Pistone remembered. "It was like, you know, if you were in a foreign country, a president walking in. Or the queen walked in, I mean, you could see that that everybody knew who he was. And either they were terribly afraid of him or respected him."

“But he was the man," Pistone said. "He was the man in Milwaukee.”

Despite Pistone’s encyclopedic knowledge of the Mafia, he didn’t have a lot of answers when it came to Augie.

Pistone told me he doesn’t believe he ever met my cousin, but clearly remembers his murder – which he also wrote about in his book. 

“He wasn’t a boss,” Pistone said. “I think he probably was involved in bookmaking operations.”

He did recall Balistrieri claiming that Augie was “a snitch.” 

“Whether he was, I don't know,” Pistone said, adding that he made it a point not to know.

“It's human nature,” he said. “You’re going to act differently if you know that somebody, you know, is on your side.”

Pistone’s work in Milwaukee in 1978 would eventually help dismantle organized crime here. But not before it claimed another life -- Augie's.

Closing time

Augie spent his final hours like he did much of his life. He was working.

He closed his tavern at 2 a.m., then spent 20 minutes cleaning up with his 24-year-old son, John, before they left together. 

"I'll see you tomorrow," Augie told his son as he walked toward his car.

Augie stopped at Pitch’s Lounge and Restaurant on the East Side, where he joined an old friend known as “Teach” for breakfast. “Teach” would later tell police Augie came and left alone, but that he was too drunk to remember the exact time.

Pitch's Restaurant at 1801 N. Humboldt Ave. in Milwaukee in 1987. Augie visited for breakfast the morning of his murder.

Augie’s routine was to stay awake after closing his tavern long enough to go back to the Third Ward and check on the day’s produce delivery, which typically arrived at 4 a.m. It was Friday, an especially busy day at work, so he would often sleep for only a few hours at his apartment before heading back to work on Commission Row.

That’s where he was going when he stepped into the elevator with his neighbor, Florence Grady.

She was the last person to see him alive.

The seat of the blast

The bomb that killed Augie destroyed the front half of his car and burned his face so badly that police had to identify him through fingerprints.

Augie’s car was still engulfed in flames when firefighters arrived.

The explosion mangled the overhead door to the parking garage so badly that firefighters had to pry it open and prop it up with wooden beams. The blast also shattered the lights, leaving it almost pitch-black inside. The air was heavy with smoke, and the garage was flooded from the sprinkler system and water streaming from burst pipes in the ceiling. 

The front of Augie’s Marquis was essentially gone, and parts of his car lay scattered across the garage. The damage spread to 28 nearby cars, but miraculously no one else was injured because Augie was alone in the garage that morning.

It wasn’t until firefighters extinguished the flames that they found Augie’s body. His right foot was missing — investigators determined it had been incinerated by the blast. His face was so badly burned that police identified him through fingerprints.

He was 49 years old.

Those who responded to the crime scene that morning included about 25 firefighters, members of the Milwaukee Police Department bomb squad, the state fire marshal, and Milwaukee County District Attorney E. Michael McCann, as well as numerous police officers and FBI agents.

Notably absent, according to police reports: longtime Milwaukee Police Chief Harold Breier, who famously said there was “no prosecutable evidence of organized crime” in the city. 

“We demand honest government in Milwaukee,” Breier said in that 1975 TV interview. “Our city wouldn’t stand for it. We’re different. We’re quite a community."

A diagram drawn by Milwaukee Police Department investigators shows the location of Augie’s car in the parking garage and the extent of the blast.

Ted Engelbart, then a new member of the bomb squad, was at the crime scene that morning. He told me that they quickly realized it wasn’t an accidental fire.

Engelbart said they determined the “seat of the blast” was in the front of the car, and the bomb was placed near the engine. The explosion followed the path of least resistance – right toward Augie.

The bomb even moved the foundation of the apartment building. Had it exploded outside, the damage would have extended several city blocks, said Engelbart, who’s now retired.

“That is sending a message,” Engelbart said. “Something like this tells other people, ‘Oh, watch your ass.’”

The bomb likely had numerous sticks of dynamite and a booster, much like the one found in Vince’s car. Among the debris, investigators found a key component: an alligator clip just like the one in the bomb that nearly killed Augie’s best friend.

McCann, the former DA, told me that the incident was “clearly no act of passing violence.” 

John Palmisano

Augie Palmisano's watch was found near his car after the bombing.

The explosion woke up Augie’s son, John, who like his dad had an apartment at Juneau Village. 

After the building manager knocked on John’s door and told him Augie’s car was on fire, John called Palmy’s, then drove to Commission Row to look for his dad. Somebody said they thought they’d seen Augie early that morning, but nobody knew where he was.

After John returned to the apartment building, an officer showed him a silver watch with a broken band found near the mangled car. John recognized it as his father’s watch. 

Police who stopped at Palmy’s later that day found a locked door with a note that read: “Sorry, the tavern is closed. My father died today.”

'Augie got put on a troublemaker list'

In the aftermath of Augie’s murder, Milwaukee police detectives interviewed nearly every resident of Juneau Village Garden Apartments, talked to business owners and workers along Commission Row, and spoke to Augie’s friends throughout the city, according to police reports from the time.

Just hours after the bombing, an anonymous caller reported seeing a late model white Cadillac with Ohio license plates occupied by people “who appeared to be gangster types.” The FBI traced the license plate number to a car dealership, whose manager said the sedan had been leased to a “self employed contractor” named Larry John. The reports don’t say whether investigators found him or determined if that was the getaway car.

Juneau Village Garden Apartments on North Jackson Street in 1971. Augie had an apartment here at the time of his murder in 1978.

Several days after the murder, a detective stopped at a halfway house to question Anthony Francis Pipito, a Balistrieri employee who’d been convicted of armed burglary and other crimes. Asked whether he had any information about Augie’s murder, Pipito told the detective he wouldn’t give him “any information regarding Frank Balistrieri.” 

Asked why he brought up Balistrieri, Pipito refused to answer.

Others dropped similar hints. When detectives went to the Iron Horse Diner in Glendale to interview its owner, Anthony Fazio, he told them that only four or five people in Milwaukee “would be able to hire a bomber.” He added that police “should probably start looking on Prospect Avenue.”

The detective wrote, “Probably meant Snug’s bar – Frank Balistrieri.”

Balistrieri frequently conducted business from Snug's bar on the ground floor of the Shorecrest Hotel at 1962 N. Prospect Ave.

Fazio, whose brother Louis was murdered six years earlier, told detectives he and others believed “that some people in the Milwaukee Police Department are on the take and therefore we are not conducting a proper investigation into this homicide,” the report said.

He also warned them people “who might have information regarding this murder are afraid to come forward because they fear for their lives.”

A newspaper article about the murder quoted a Palmisano Produce truck driver who said Augie was “good to bums, paupers, rich men and poor men” and would feed people off the street. The owner of the building described Augie as a “nice fellow” who always paid his rent on time and slept very little, often starting work before 5 a.m.

But the narrative that Augie was a Mafia leader or suspected informant seemed to stick.

One front-page article, quoting police sources, described Augie as a “substantial figure in organized crime in Milwaukee,” and said that “somebody thought he was going to talk.” 

Another said his killing was “part of a long standing feud between criminal factions in the city.”

Yet another said Augie “had been branded as a troublemaker by organized crime leaders” for protesting too publicly about the attempted bombing of his close friend, Vince Maniaci. 

“Augie got put on a troublemaker list,” a source told The Milwaukee Journal.

The Satin Doll

Minnette Wilson was a former dancer who was close friends with Augie. Bottom: Wilson in her bar, the Satin Doll Lounge, in 1996. Top right: Wilson is pictured in the bottom row with Duke Ellington’s hands on her shoulder.

One person didn’t hesitate to name Balistrieri as a suspect in Augie’s murder: lounge owner Minnette Wilson.

Today, a fading Schlitz sign still hangs over the lounge Wilson owned on West Fond du Lac Avenue. The concrete walls of the now-shuttered tavern are covered in graffiti, and weeds grow through cracks in the parking lot.

But in 1978, Satin Doll’s Lounge was a hotspot for jazz, vice and wild characters. And few were wilder than its owner. Wilson was a stunning former dancer who performed with Duke Ellington and claimed to have inspired his hit song “Satin Doll.” 

She often went by the Satin Doll, or just the Doll.

When a pair of detectives first went to the lounge to interview Wilson about Augie’s murder, she was visibly distraught. The lounge was packed, and she told them she was too busy and upset about her old friend’s death to talk – noting Augie’s funeral had just been held.

Detectives spotted two large portraits of Augie hanging on the back walls of the lounge and suggested a follow-up interview.

“It is apparent that she is more than just a close friend of the deceased,” they wrote in their report. “We were unable to determine at this time just how close the relationship was.”

But there’s nothing else that might indicate they were romantically involved. 

Wilson told another pair of detectives who returned the following night that she and Augie had dinner together a couple of times in the days leading up to his murder, and he didn’t show any signs of concern about his safety. But she added he was “the type of person that if something was bothering him, even though it would be quite serious, he would not tell anyone else about it,” the police report said.

“She several times stated that she feels that one Frank Balistrieri, otherwise known as Frankie Bal, was responsible for having August Palmisano killed,” detectives wrote.

As they were leaving, Wilson told detectives: “Frankie Bal has gone too far this time.”


'I'm in a lot of trouble'

Detectives kept getting hints Balistrieri was behind Augie’s murder, but they struggled to find details about a motive. 

A painting found in Augie’s apartment led them to his close friend, a stockbroker named Sante DiAntoni, who went by Sam Denton. Denton told police that when he and his wife found out Augie was murdered, they both sat on their bed and cried. 

After what detectives described as a “long conversation,” Denton revealed more. He said about six months before the murder, Augie confided in him that he’d been threatened over his friendship with Vince Maniaci, who by then had fled town for Hawaii. 

“I think I’m in a lot of trouble,” Denton recalled Augie saying. “I was told if I help Vince, I would be in more trouble – that I should stay away from Vince forever.” 

Three months later Vince decided to come back to Milwaukee, and Augie went to pick him up at the airport, Denton said. Augie waited for three hours but Vince never showed up. Augie later found out that Vince had arrived in Milwaukee but immediately took a flight back to Hawaii. Denton told police that Augie was very upset and frightened, and thought Vince may have been threatened when he arrived at the airport.

Then, a month before the murder, Vince again called Augie and told him that he was having trouble finding a job, and wanted to come home to Milwaukee.

“It’s better for you to stay where you are, and I’ll stay where I am. That will be best for both of us,” Denton overheard Augie tell Vince. 

Denton told detectives he hoped they would solve the case, but said he didn’t think it would be possible.

A meeting at FBI headquarters

Less than a week after Augie was killed, a group of federal agents met with Milwaukee police detectives at FBI headquarters in downtown Milwaukee. 

There had been tension simmering between the FBI and Milwaukee Police Department for years, with some officers accusing agents of not sharing enough information with them. Several former FBI agents told me they knew some officers were on Balistrieri’s payroll and were worried about corrupt cops leaking information — concerns also documented in FBI reports from the time. 

Nicholas Montos in an FBI wanted poster from 1956.

But that day, the agents had information to share. They told detectives the FBI was contemplating a grand jury investigation focused on the attempted car bombing of Vincent Maniaci as well as Augie’s murder, and said the agency might be willing to give out immunity in some cases with the idea of “shaking loose information not forthcoming at this time.”

The agents then told police they’d identified a possible hit man in the Maniaci car bombing case, and said he was also a suspect in Augie’s murder. His name was Nick George Montos, a career criminal who escaped from prison five times and was the first person to make the FBI’s Ten Most Wanted list twice. 

FBI agents conducting surveillance had spotted Montos following Vince Maniaci before someone tried to kill him. 

Gary Magnesen, one of the FBI agents at the meeting that day, told me they nicknamed Montos “The Mope” because he looked so unremarkable.

“A car pulled up almost right in front of us - a black sedan - and a short little guy dressed in gray work clothes got out of the car,” Magnesen said. “He was a Chicago guy. They had used him quite a bit. He was not Italian and he was not part of the mob, but he was a guy that was an expert in bomb making.”

Retired FBI Agent Bob Walsh told me he also saw Montos in Milwaukee when he noticed him trailing Vince into a McDonald’s shortly before the attempted bombing.

But neither police nor FBI knew whether Montos was in Milwaukee the day Augie was murdered. 

The FBI also asked about similarities in the explosives used in the two bombings. They suspected both bombs were closely linked, and likely built by the same person.

No answer

A few weeks later, Milwaukee police detectives tried to talk to Frank Balistrieri at his large Shepard Avenue home on Milwaukee’s East Side. Detectives stopped several times one day, noting the car in the driveway.

“No one would come to the door,” they wrote of the visit. “However, it seemed as if someone was present in the home.”

The home of reputed Milwaukee crime boss Frank Balistrieri on North Shepard Avenue in March 1980.

They also went to the home of Peter Balistrieri, Frank’s brother. Nobody answered there either.

“In addition, we checked at the Shorecrest Hotel,” the report said. “But found that neither one of the Balistrieri brothers were in.”

It appears the officers never returned.

Over time, tips coming into the Milwaukee police slowed to a trickle.

One anonymous caller told police that someone using the name “Michael Block” had moved into Juneau Village shortly before Augie was killed and hadn’t been seen since the murder. He reportedly left behind an expensive razor and nice clothing.  

Another tipster told police the killer was a Mafia hitman named Richard Montey, who’d since gone into hiding using the alias “Dick Montage” and was living in a cabin behind a tavern near Athens, in northern Wisconsin. 

Yet another called police and said their son’s friend, a man nicknamed “Dough Pop,” would get high on cocaine and brag that he had something to do with Augie’s murder.

Police hit one dead end after another. But the feds were just getting started.

'He called me a name to my face'

Frank Balistrieri had been on the FBI’s radar for years. Augie’s murder helped inspire an all-out crackdown, former agents told me.

“Now we had a crime, a very serious crime – a homicide – to tie him to,” Magnesen said. “Once those murders began, we knew he was behind it. The problem was to prove it. So that’s when we started pushing really hard.”

Just weeks after the meeting at FBI headquarters, undercover FBI agent Gail Cobb, who was posing as a new vending machine company owner named Tony Conte, was summoned by Balistrieri to a meeting at Snug’s restaurant in the Shorecrest Hotel. 

He went with New York Mafia member “Lefty” Ruggiero, who was helping him work out an arrangement between the New York and Milwaukee crime families over vending machine profits with the help of undercover agent Joe Pistone posing as "Donnie Brasco."

It was July 29, 1978 — nearly a month after Augie's murder.

Balistrieri, sitting across the table from Cobb, had reached out to shake his hand when Ruggiero introduced him as Conte. Balistrieri recoiled in shock.

“We’ve been looking for you all week. We were going to hit you," Cobb remembered him saying. "We figured you were the G.” (The G, or G-man, is short for a government agent.)

Balistrieri reportedly laughed as he explained that he’d had three guys following Cobb. The would-be hit men had even trailed Cobb to the meeting and were still waiting until Balistrieri waved them away.

After Ruggiero reassured him Cobb wasn’t an informant, Balistrieri made it clear the vending machine business in Milwaukee belonged to him. 

Then the conversation turned to Augie. 

“He was arrogant. He called me a name to my face,” Balistrieri said, touching his fingers to his face. 

He added: “Now they can’t find his skin.”  

There was no recording of the exchange. It would have been too dangerous for Cobb to wear a wire to the Shorecrest that night.

Shortly afterward, a shaken Cobb told Pistone: “First thing I’m going to do is put a remote starter in my Cadillac.”

A few weeks later, Cobb and Pistone were at a bar with Balistrieri when they ran into Peter Picciurro, the owner of Pitch’s Lounge & Restaurant, where Augie had his last meal.

Balistrieri reportedly laughed as he told the two men that Picciurro hadn’t talked to him since “the guy had his accident” and “got blown up.”

“They were buddies — goombahs — real close,” Balistrieri added.

That same night, Balistrieri bragged to the undercover agents that nobody had ever lived to be a witness against him.

Only in this case, if Balistrieri was trying to gain power by making an example out of Augie, he may have instead set in motion his own downfall.

A full-court press

A booking mug shot of crime boss Frank Balistrieri. FBI agents raided Balistrieri’s home in 1980.

In October 1978, Cobb was frozen out by Balistrieri, who reportedly had discovered that he was an undercover agent. But by then he and Pistone had already gathered extensive information about Balistrieri’s gambling ring and extortion activities. 

The FBI’s investigations into Balistrieri and his associates would ultimately involve a federal grand jury, subpoenas, search warrants, wiretapping and other physical and electronic surveillance.

“We call it a full-court press,” said Magnesen, the longtime FBI agent who’s now retired.

The FBI targeted several locations for surveillance, including the Shorecrest Hotel. After obtaining blueprints to the Shorecrest and a search warrant, a group of FBI agents broke into the building one night. They were able to slip in through the front door after two agents pretended to make out in front of the entrance -- blocking the door from view as an FBI lock expert cut a key in real time. 

Magnesen, one of the agents who broke in that night, said he still remembers the concrete dust falling on them as they drilled a hole in the basement ceiling. They then placed a listening device under the carpet.

It turned out they had put the microphone in the wrong place, and had to enter the Shorecrest for a second time to move the microphone.

Magnesen said one of the conversations agents heard thanks to that microphone was a worried discussion about a subpoena served to Nick Montos, who Balistrieri warned had “real, real, real good information” on what he called “the boom.”

That quote was one of several glimmers of hope that prosecutors would be able to charge Balistrieri with the murders they believed he’d ordered. 

Despite Balistrieri gloating about the deaths, officials never felt like they had enough evidence to win a homicide conviction.

In 1980, after months of around-the-clock surveillance, the FBI broke down Balistrieri’s front door with a sledgehammer. He was later charged with gambling, tax evasion and extortion.

John Franke

One September afternoon, former federal prosecutor John Franke led me down the staircase to the basement of his suburban Milwaukee home, stopping at a stash of bankers boxes. 

“They sat in storage in different houses for the last, what is it, 40 years?” he said.

Franke peered inside one of the boxes, which was filled with court documents, FBI wiretap transcripts, notebooks and other files from the years he spent working to win convictions against Balistrieri and his associates.

As Franke flipped through a manila folder, an old black and white photograph caught my eye.  

“Is that Augie?” I asked.  

“That might be your cousin. Yeah, it probably is,” Franke said, turning it over and reading the name on the back. “Augie Palmisano.”  

Former federal prosecutor John Franke goes through material from the Balistrieri case in his basement in 2022.

The file also held pictures of Balistrieri, including a booking photo and another of him dressed in one of his custom suits.  

“Fancy Pants,” Franke said. "Well-dressed as always."

Frank Balistrieri had proven to be slippery in the past. About a decade before Franke joined what was known as the Organized Crime Strike Force, a federal tax evasion case against Balistrieri was nearly derailed when Balistrieri discovered the FBI had illegally planted microphones to conduct electronic surveillance without a warrant.

To prepare for the Balistrieri trials some 10 years later, Franke and others on the Organized Crime Strike Force spent weeks listening to hours of conversations between Balistrieri and his associates that had been secretly -- but this time, legally -- recorded by the FBI.

“I don't know how many hours I spent in that room with those big old reel-to-reel tapes running,” Franke told me.  

In 1983, Balistrieri was convicted of gambling and tax charges. The following year, he and his two sons were convicted of extortion. At the trials, former undercover agents Pistone and Cobb were among those who testified.

Franke said one thing that "caught everyone's attention" was the explosion that killed Augie. While he was prosecuting the case, people would tell him where they were when the bomb went off, he said, because it could be felt from blocks away.

“That was a pretty dramatic moment in terms of, creating the sense in the community that maybe there is organized crime here, and maybe it’s something that we should actually worry about,” Franke said. “Because it’s not just, you know, gangsters gunning down gangsters. It’s people doing things that could kill innocent people easily.”

When I asked if he thought Balistrieri got away with murder, Franke fell silent. 

“The most compelling statement from Frank was not recorded,” he said after a long pause. “That would be ‘they can't find his skin. He was arrogant to my face.’”

But it was clear he was reviewing the case in his mind.  

“Look, you're making me pause. Because I'm sure if we thought that was enough, we would have pursued it. But, proving beyond a reasonable doubt that he ordered it just because he was gloating about someone's death,” Franke said. “I don't know. Maybe we missed something. But it really probably wasn't enough to convince a jury.” 

Bad blood  

The convictions of Balistrieri and his associates dealt a massive blow to organized crime in Milwaukee, and the investigations that led to them are widely considered to be among the greatest success stories for the FBI here.

For his crimes in Milwaukee, Balistrieri was sentenced to 13 years in prison.

Two years later, in a separate federal case involving skimming money from Las Vegas casinos, Balistrieri pleaded guilty and was sentenced to a concurrent 10 years. 

He was released from prison early due to his failing health in 1991, and died two years later at age 74.

Nick Montos had a long criminal career and spent years as a fugitive. In 1995, he tried to rob a Massachusetts antique store, where he tied up the 73-year-old Jewish owner and called her an antisemitic slur. She was able to escape and fight off Montos, then 78, with a baseball bat. He was still a prisoner when he died at age 92.

Montos was never charged in Augie's murder or Vince's attempted car bombing. But to this day, retired FBI agents Magnesen and Walsh told me they believe that Montos built the bomb that killed my cousin on the orders of Balistrieri. 

A team of FBI agents investigating organized crime in Milwaukee in the 1970s. FBI Agent Bob Walsh is standing third from right. Right: Walsh photographed in 2023.

As for motive? Magnesen said it was well known Augie “had contempt" for Frank Balistrieri. And he wasn’t the only one.

“All of the soldiers and so on despised (Balistrieri) because he didn’t have cred. He was a nobody really. He had never really shown himself to be a good criminal or anything like that. So they didn’t like him,” Magnesen said. “And Augie Palmisano – although he was not a made member – he didn’t like (Balistrieri) at all either. And would talk about him on the street.”

Magnesen said Balistrieri, through his enforcer, put pressure on Augie to pay a percentage of his gambling winnings to him — “or else.” That enforcer was observed by another FBI agent in a big argument with Augie shortly before he was murdered, he added.

Magnesen stressed that my cousin was neither a made member of the Mafia nor was he a "rat," as Balistrieri had claimed.

“Palmisano was not an informant. But (Balistrieri) told the Chicago people he was, and therefore a threat to him and therefore a threat to them,” Magnesen said. “He just lied. He did everything he could to get them to do his dirty work.”

FBI documents corroborate that there was bad blood between the two, including a July 1978 report stating that Augie had “openly showed his disgust with Balistrieri for having a bomb placed in Vincent Maniaci’s vehicle.” 

The report also said that Balistrieri had previously accused Augie of operating a bookmaking business without paying off “the LCN,” or La Cosa Nostra.

Family history suggests the bad blood may have started years earlier, when Augie’s brother married Balistrieri’s sister, against the Palmisano family's wishes. The relationship reportedly got worse when Balistrieri and Augie began feuding over a shared relative they both wanted to hire who'd taken a job as a bartender at Augie's tavern. 

Former FBI Agent Bob Walsh said Augie and Vince refused to take orders from Balistrieri. 

“They were sort of outsiders,” Walsh said. “He couldn’t control them. They were kind of on their own.”

He believes Balistrieri used them as an example to scare others into doing as they were told.

“I think he wanted to show that he’s in charge here,” Walsh said. “And every once in a while, you’ve got to flex your muscles and put somebody down.”

Chasing ghosts

In the more than four decades since Augie’s murder, the Third Ward has undergone a seismic shift. What was once the working-class stretch known as Commission Row has been replaced by posh boutiques, restaurants, bars and other high-end businesses that now line Broadway.

The building that was home to Palmisano Produce and Richie’s on Broadway, or Palmy’s, is now Café Benelux. The boards that used to cover the windows are gone, as is the pool table. Now the bar serves Belgian beers and craft cocktails, and a staircase leads to a rooftop patio.

Top: Reporter Mary Spicuzza and her brother in 1978, the year of Augie's death. Bottom: Spicuzza researching documents related to Augie's death in 2023.

As for me, trying to report on the 45-year-old unsolved murder of a cousin I never knew has felt a bit like chasing ghosts – or trying to put together a puzzle with too many missing pieces. 

Many of the key figures involved have died. Some would only talk anonymously because they were still afraid of the reach of organized crime, or simply didn’t return my phone calls. Others declined to be interviewed, like Frank Balistrieri’s son, John. Augie’s children did not respond to interview requests.

It’s been a relief to learn that Augie was not some murderer or Mafia kingpin – nor was he a “made” member, according to the FBI agents I interviewed who knew him. Those same agents said that while Augie was no angel, he was funny, charismatic and well liked. And many of his gambling activities that were front-page news decades ago are now basically legal. 

Months spent poring over hundreds of pages of police reports, FBI files, court records and wiretap transcripts made me realize that in a sense I’d been blaming Augie for his own murder – or at least trying to figure out what he did that led to the car bombing.

Franke noticed I was still struggling to make sense of the murder when I called him months after our initial interview to ask about additional documents that may shed some light on the case.

“Mary, I know you’re trying to understand what your cousin did or didn’t do that led to his death,” Franke told me. “But this was about power.”

He was right. Augie may have been a gambler who refused to give Balistrieri a cut of his profits, and criticized the attempted murder of his best friend. And he probably even called Balistrieri a name to his face. But he didn't deserve to die the way he did. 

He was a businessman and a hustler. A convicted gambler and a devoted friend. A rebel who bucked authority. He was adored. And he had some powerful enemies.

His name was Augie Palmisano, and he was my cousin.

Contact Mary Spicuzza at (414) 224-2324 or mary.spicuzza@jrn.com. Follow her on Twitter at @MSpicuzzaMJS.

Adblock test (Why?)

Read the whole story
29 days ago
This is a good read.
Share this story

Modern CSS One-Line Upgrades

1 Comment

Sometimes, improving your application CSS just takes a one-line upgrade or enhancement! Learn about 12 properties to start incorporating into your projects, and enjoy reducing technical debt, removing JavaScript, and scoring easy wins for user experience.

Properties are explored for the following categories:

  • Stable Upgrades: fix a hack or issue by replacing older techniques
  • Stable Enhancements: provide an improved experience with well-supported modern properties
  • Progressive Enhancements: provide an upgraded experience when these properties are supported without causing harm in unsupporting browsers

Stable Upgrades

The following well-supported properties can help fix a hack or long-standing issue by replacing older techniques.


Have you ever used the “padding hack” to force an aspect ratio such as 16:9 for video embeds? As of September 2021, the aspect-ratio property is stable in evergreen browsers and is the only property needed to define an aspect ratio.

For an HD video, you can just use aspect-ratio: 16/9. For a perfect square, only aspect-ratio: 1 is required since the implied second value is also 1 .

CSS for "Basic use of aspect-ratio"
.aspect-ratio-hd {
  aspect-ratio: 16/9;

.aspect-ratio-square {
  aspect-ratio: 1;

HD 16:9

Square 1:1

Of note, an applied aspect-ratio is forgiving and will allow content to take precedence. This means that when content would cause the element to exceed the ratio in at least one dimension, the element will still grow or change shape to accommodate the content. To prevent or control this behavior, you can add additional dimension properties, like max-width, which may be necessary to avoid expanding out of a flex or grid container.

CSS for "Forgiving aspect-ratio"

.aspect-ratio-square {
  aspect-ratio: 1;

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Iste molestias maiores velit quaerat debitis incidunt delectus nulla, quibusdam fugit eos? Fugiat asperiores assumenda nulla corrupti, sit repellendus ducimus necessitatibus voluptates.

Lorem, ipsum dolor sit amet consectetur adipisicing elit.

Iste molestias maiores velit quaerat debitis incidunt delectus nulla, quibusdam fugit eos?

If you are hesitant to fully replace the padding hack and still want to provide some dimension guardrails, review the Smol Aspect Ratio Gallery for a progressively enhanced solution to aspect-ratio.


This is actually the oldest property in this list, but it solves an important issue and definitely fits the sentiment of a one-line upgrade.

The use of object-fit causes an img or other replaced element to act as the container for its contents and have the those contents adopt resizing behavior similar to background-size.

While there are a few values available for object-fit, the following are the ones you’re most likely to use:

  • cover - the image resizes to cover the element, and maintains its aspect-ratio so that the content is not distorted
  • scale-down - the image resizes (if needed) within the element so that it is fully visible without being clipped and maintains its aspect-ratio, which may lead to extra space (”letterboxing”) around the image if the element has a different rendered aspect-ratio

In either case, object-fit is an excellent property pairing with aspect-ratio to ensure images are not distorted when you apply a custom aspect ratio.

CSS for "Use of object-fit with aspect-ratio"
.image {
  object-fit: cover;
  aspect-ratio: 1;

  max-block-size: 250px;
A closeup of a siamese cat peeking over an object only their head visible from the eyes up to their ears.

Review my explanation of object-fit in this free egghead video lesson.


One of many logical properties, margin-inline functions as a shorthand for setting the inline (left and right in horizontal writing modes) margin.

The replacement here is simple:

margin-left: auto;
margin-right: auto;

margin-inline: auto;

Logical properties have been available for a couple of years and now have support upwards of 98% (with occasional prefixing). Review this article from Ahmad Shadeed to learn more about using logical properties and their importance for sites with international audiences.

Stable Enhancements

These well-supported modern CSS properties can provide an improved experience, and may also allow replacing older methods or even JavaScript-aided solutions. Fallback solutions are not likely to be needed, although this is dependent on your specific application considerations, and testing is always encouraged.


The use of text-underline-offset allows you to control the distance between the text baseline and the underline. This property has become a part of my standard reset, applied as follows:

a:not([class]) {
	text-underline-offset: 0.25em;

You can use this offset to clear descenders as well as (subjectively) improve legibility, particularly when links are grouped in close proximity, such as a bulleted list of links.

This upgrade may replace older hacks like a border or pseudo-element, or even a gradient background, especially when used with its friends:


Have you been using box-shadow or perhaps a pseudo-element to supply a custom outline when you wanted distance between the element and outline on focus?

Good news! The long-available outline-offset property (as early as 2006!) may be one you missed, and it enables pushing the outline away from the element with a positive value or pulling it into the element with a negative value.

In the demo, the gray solid line is the element border, and the blue dashed line is the outline being positioned via outline-offset.

CSS for "Positive and negative outline-offset"
.outline-offset {
  outline: 2px dashed blue;
  outline-offset: var(--outline-offset, .5em);

Positive offset Negative offset

Reminder: outlines are not computed as part of the element’s box size, so increasing the distance will not increase the amount of space an element occupies. This is similar to how box-shadow is rendered without impacting the element size as well.

Learn more about using outline-offset as an accessibility improvement for focus visibility.


The scroll-margin set of properties (and corresponding scroll-padding) allows adding an offset to an element in the context of the scroll position. In other words, adding scroll-padding-top can increase scroll offset above the element but doesn’t affect its layout position within the document.

Why is this useful? Well, it can alleviate issues caused by a sticky nav element covering content when an anchor link is activated. Using scroll-margin-top we can increase the space above the element when it is scrolled to via navigation to account for the space occupied by the sticky nav.

I like to include a generic starting rule in my reset for any element with an [id] attribute given it has the potential to become an anchor link.

[id] {
	scroll-margin-top: 2rem;

An alternative selector is explored in the Modern CSS article on component-based architecture and is also in use on this site, as can be tested by using the links from the article table of contents sidebar.

For a more robust solution when accounting for the overlap of sticky, fixed, or absolute positioned elements, you may want to use a custom property with a fallback value. Then, with the assistance of JavaScript, measure the real distance needed and update the custom property value.

[id] {
	scroll-margin-top: var(--scroll-margin, 2rem);

I encourage you to also update this solution further and use the logical property equivalents: scroll-padding-block-start and -block-end.


You may be familiar with the prefers-color-scheme media query to customize dark and light themes. The CSS property color-scheme is an opt-in to adapting browser UI elements including form controls, scrollbars, and CSS system colors. The adaptation asks the browser to render those items with either a light or dark scheme, and the property allows defining a preference order.

If you’re enabling adapting your entire application, set the following on the :root, which says to preference a dark theme (or flip the order to preference a light theme).

:root {
	color-scheme: dark light;

You can also define color-scheme on individual elements, such as adjusting form controls within an element with a dark background for improved contrast.

.dark-background {
	color-scheme: dark;

Learn from Sara Joy’s presentation about how to use color-scheme for easy dark mode, and more about incorporating this feature.


If you’ve ever wanted to change the color of checkboxes or radio buttons, you’ve been seeking accent-color. With this property, you can modify the :checked appearance of radio buttons and checkboxes and the filled-in state for both the progress element and range input. The browser’s default focus “halo” may also be adjusted if you do not have another override.

CSS for "Effect of using accent-color"
:root {
  accent-color: mediumvioletred;

Consider adding both accent-color and color-scheme to your baseline application styles for a quick win toward custom theme management.

If you need more comprehensive custom styling for form controls, review the Modern CSS series beginning with radio buttons.

width: fit-content

One of my favorite CSS hidden gems is the use of fit-content to “shrink wrap” an element to its contents.

Whereas you may have used an inline display value such as display: inline-block to reduce an element’s width to the content size, an upgrade to width: fit-content will achieve the same effect. The advantage of width: fit-content is that it leaves the display value available, thereby not changing the position of the element in the layout unless you adjust that as well. The computed box size will adjust to the dimensions created by fit-content.

CSS for "Basic usage of fit-content"
.fit-content {
  width: fit-content;

Using fit-content

Without the use of fit-content

The fit-content value is one of several keywords that enable intrinsic sizing.

Consider the secondary upgrade for this technique to the logical property equivalent of inline-size: fit-content.

Progressive Enhancements

This last set of properties provides an upgraded experience when they are supported and can be used without fear of causing harm in unsupporting browsers. This means they do not need a fallback method even though they are more recent additions to modern CSS.


The default behavior of contained scroll regions - areas with limited dimensions where overflow is allowed to be scrolled - is that when the scroll runs out in the element, the scroll interaction passes to the background page. This can be jarring at best, and frustrating at worst for your users.

Use of overscroll-behavior: contain will isolate the scrolling to the contained region, preventing continuing the scroll by moving it to the parent page once the scroll boundary is reached. This is useful in contexts such as a sidebar of navigation links, which may have an independent scroll from the main page content, which may be a long article or documentation page.

CSS for "Basic usage of overscroll-behavior"
.sidebar, .article {
  overscroll-behavior: contain;

Lorem ipsum dolor sit amet consectetur adipisicing elit. Maxime nobis consectetur earum!

Aliquid a praesentium quis in consequuntur mollitia laboriosam illum nemo commodi aut?

Doloremque sapiente quos dignissimos sequi cupiditate commodi nemo non perspiciatis placeat totam.

Reiciendis, at nulla! Hic nemo eius atque laborum consequuntur iusto exercitationem quasi.

Est, assumenda amet culpa veritatis maxime debitis? Suscipit error amet quas sed?

Magnam exercitationem neque error deleniti consequuntur, dolor repellat quo perferendis dicta sunt.

Ipsum id repellat velit laudantium vel autem eos non aperiam qui nobis?

Ratione maxime neque numquam minima, omnis dolorem temporibus laboriosam dolor atque suscipit?

Dolores assumenda dolore similique eaque, odio voluptatibus. Aliquid iusto nostrum iste? Exercitationem.

Quos adipisci ea ullam amet blanditiis voluptatibus, fuga laborum sed facere quasi!

Odio rerum labore veritatis esse eaque quae debitis possimus ea omnis vitae.

Quasi eum obcaecati laborum eaque nostrum numquam tempore reprehenderit qui beatae debitis?

Optio atque fugit quia reprehenderit dolor rem et delectus praesentium ratione provident.

Sed accusamus at architecto dolore minima error, assumenda amet nam perferendis odit?

Et eius enim est hic doloribus reiciendis qui cupiditate? Autem, iure cupiditate?


One of the newest properties (as of 2023) is text-wrap, which has two values that solve the type-setting problem of unbalanced lines. This includes preventing “orphans,” which describes a lonely word sitting by itself in the last text line.

The first available value is balance, which has a goal of evening out the number of characters per line of text.

There is a limitation of six lines of wrapped text, so the technique is best used on headlines or other shorter text passages. Limiting the scope of application also helps limit the impact on page rendering speed.

CSS for "Applying text-wrap: balance"
:is(h1, h2, h3, h4, .text-balance) {
  text-wrap: balance;

  max-inline-size: 25ch;

This text has been balanced by text-wrap

This text has not been balanced by text-wrap

The other value of pretty specifically addresses preventing orphans and can be more broadly applied. The algorithm behind pretty will evaluate the last four lines in a text block to work out adjustments as needed to ensure the last line has two or more words.

CSS for "Applying text-wrap: balance"
p {
  text-wrap: pretty;

  max-inline-size: 35ch;

With text-wrap: pretty

Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolore cupiditate aliquid, facere explicabo voluptatibus iure! Saepe nostrum quasi corporis totam accusamus beatae obcaecati rerum fugiat minima perferendis voluptatibus.


Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolore cupiditate aliquid, facere explicabo voluptatibus iure! Saepe nostrum quasi corporis totam accusamus beatae obcaecati rerum fugiat minima perferendis voluptatibus.

Use of text-wrap is a great progressive enhancement. However, any adjustments do not change an element's computed width, so a side-effect in some layouts may be an increase in unwanted space next to the text.


In some scenarios, the appearance or disappearance of scrollbars can cause an unwanted layout shift. For example, when a dialog overlay is displayed and the background page adds overflow: hidden to prevent scrolling, causing a shift from removing the no longer needed scrollbars.

The modern CSS property scrollbar-gutter enables a reservation of space for scrollbars in the layout, which prevents that undesirable shift. When there’s no need for a scrollbar, the browser will still paint a gutter as extra space created in addition to any padding on the scroll container.

Important: This property only has an effect when the user’s system settings are not for “overlay” scrollbars, as in the default for Mac OS, where the scrollbar only appears as an overlay on content that is actively being scrolled. Do not drop padding in favor of scrollbar-gutter since you will lose all intended space when overlay scrollbars are in use.

Since this is visually apparent extra space, you may choose to assign this property using two keywords: scrollbar-gutter: stable both-edges. The use of stable by itself only adds a gutter where the scrollbar would otherwise be, while the addition of both-edges preferences adding the space to the opposite side of the scroll container, too. This ensures visual balance when the layout doesn’t yet need scrollbars to be visible. See a visual of using scrollbar-gutter from Ahmad Shadeed.

Be sure to review more of the articles here to upgrade your CSS knowledge even more! A great place to start is the topics list.

Adblock test (Why?)

Read the whole story
29 days ago
Useful stuff here.
Share this story
Next Page of Stories