STOP pushing tables to PROD without testing.
Use this one SQL command instead 👇
𝗠𝗜𝗡𝗨𝗦
It takes one dataset and 𝗠𝗜𝗡𝗨𝗦es the other.
It gives you what's in the first one...
but not in the second!
It's the easiest way to spot differences.
(𝘛𝘳𝘶𝘴𝘵 𝘮𝘦, 𝘮𝘰𝘴𝘵 𝘱𝘦𝘰𝘱𝘭𝘦 𝘴𝘬𝘪𝘱 𝘵𝘩𝘪𝘴 𝘵𝘦𝘴𝘵)
If your Database doesn't allow it, don't worry!
You can do the same with: 𝗘𝗫𝗖𝗘𝗣𝗧 in:
- PostgreSQL
- SQL Server
- BigQuery
Or you can replicate it with: 𝗟𝗘𝗙𝗧 𝗝𝗢𝗜𝗡 + 𝗜𝗦 𝗡𝗨𝗟𝗟
Check the infographic to see all 3 ways 👇🏼
---
♻️ Repost if this was helpful, please!
Follow 👉🏻 José for more about Data and AI
I used to think data migration was just moving things from point A to point B. I was wrong. 😅
I'm currently working on migrating a full BI environment to Power BI, and honestly? It's been one of the most humbling experiences of my career so far.
Nobody warns you that you'll spend more time questioning the old system than actually building the new one. You start pulling at one thread, and suddenly you're three hours deep into a report that nobody owns, built on logic that nobody documented, producing numbers that everyone trusts, but nobody can fully explain. 🤷🏻♂️
And that's kind of the point this work is regressive by nature. You're not innovating. You're excavating. Trying to understand decisions made years ago, in a different business context, by people who may not even be at the company anymore.
I've also had people ask me, "Can't AI just do this for you?" And look, AI helps. It genuinely does. But there's a layer of this work that's purely human, sitting with stakeholders, asking the uncomfortable questions, and making judgment calls when the data just doesn't add up. No prompt is going to replace that conversation. 🤷
The biggest thing I've learned so far is simple: slow down at the start. The discovery phase feels unglamorous, but it saves you from a world of pain later on.
If you've been through something similar, I'd genuinely love to hear how you handled it. Drop it in the comments 👇
#PowerBI#DataMigration#BusinessIntelligence#DataEngineering#BI#data
My inbox is a mess. While I manage to maintain a somewhat close to “Inbox Zero” at work, my personal GMail's inbox currently sits at 2,215 emails . A large amount of those mails are notifications of some kind, like from Github for example.
GMail has some mechanisms to automatically sort mails and I do make use of that, but those filters are applied when the mail arrives only.
For notifications I want to see the mail. So it should land in my inbox. But when I have ignored it for a certain time, it's pretty sure I don't need it anymore. So I wanted a way to automatically delete certain mail threads that are older than a specified number of days.
/**
* Main script to schedule
*
* Add one cleanEmails line per type of threads to clean
*/function main(){
cleanEmails(true,'<notifications@github.com>',7);}/**
* Find old thread based on given conditions
*
* @param {bool} clean Set to false to not actually delete the mails
* @param {string} searchString The string to search for
* @param {int} minAgeDays The minimum age a thread (newest message) has to have
* @param
*/function cleanEmails(clean, searchString, minAgeDays, headerField ='from'){const threads = findRecentEmails(searchString, minAgeDays, headerField);
console.log(`Found ${threads.length} threads`);
threads.forEach((thread, i)=>{
logThread(thread);if(clean){
thread.moveToTrash();
console.log('moved to Trash');}});}/**
* Log a thread to console
*
* @param {Thread} The gmail thread to log
*/function logThread(thread){const firstMsg = thread.getMessages()[0];// newest message in threadconst lastMsgDate = thread.getLastMessageDate();const dateStr = Utilities.formatDate(
lastMsgDate,
Session.getScriptTimeZone(),'yyyy-MM-dd HH:mm');
console.log(`Date: ${dateStr}, From: ${firstMsg.getFrom()}, Subject: ${thread.getFirstMessageSubject()}`);}/**
* Find old thread based on given conditions
*
* @param {string} searchString The string to search for
* @param {int} minAgeDays The minimum age a thread (newest message) has to have
* @param
*/function findRecentEmails(searchString, minAgeDays, headerField ='from'){// Compute the cutoff date (messages must be older than this)const cutoffDate =newDate(Date.now()- minAgeDays *24*60*60*1000);const cutoffFormatted = Utilities.formatDate(
cutoffDate,
Session.getScriptTimeZone(),'yyyy/MM/dd');// Build Gmail search query:// - headerField:searchString → search in that header// - before:YYYY/MM/DD → older than cutoff// - -is:starred → skip starredconst query = `${headerField}:${searchString} before:${cutoffFormatted}-is:starred`;
console.log(`Query: ${query}`);// get the 50 newest threads with their newest message older than the cut-off datereturn GmailApp.search(query,0,75)
.filter(thread => thread.getLastMessageDate()< cutoffDate)
.sort((a, b)=> b.getLastMessageDate()- a.getLastMessageDate())
.slice(0,50);}
The script is scheduled to run main() every hour. For now it only handles my Github notification mails, but more will follow. The cleanEmails() function takes four parameters:
clean: set it to false if you the method to run but not delete anything. The found threads will be printed to the console.
searchString: this is what identifies the threads to delete, for example the sender's email address
minAgeDays: defines how old the youngest message in the thread has to be to be considered for deletion
headerField: defaults to from but you sometimes might want to search the subject instead.
Each call to cleanEmails() will delete the newest 50 threads matching your criteria. And by delete I mean move them to the “Trash” folder – GMail will delete them automatically after 30 days. This adds a bit of safety if something goes wrong.
With the script running every hour it will take a while until all my old Github notifications are gone, but that's fine. I heard that GMail can become sluggish when deleting too many mails at once.
I am still working adding services to my NAS and one thing that was on my todo list for a while was a proper GMail backup.
You never know when the powers that be deny you access to your mails for some obscure reasons. One guard is using my own domain. When I a can't use GMail anymore, I can just use my own mail server or a different provider. But it would suck losing all my old mail.
Backup
I don't necessarily need a running IMAP server to access the backup. But the backup should be in a format that allows my to point an IMAP server to the backup and be ready to go. That means I want the mails in a Maildir directory.
For the backup I am using GMail's IMAP server. To fetch your mails by IMAP you need to enable IMAP, have 2fa enabled (as you should in general) and create an app password. You also want to hide some of the default tags from IMAP. Basically only the INBOX, your sent mail and all your custom tags should be exposed. This avoids downloading a bunch of duplicates.
To do the actual syncing, I decided to use the mbsync command from the isync package. More specifically I am using the theohbrothers/docker-isync Docker image.
The image will run one sync, then exit. I added a sleep after execution and then let Docker's restart policy taking care of running the next sync.
### Remote Config ###
IMAPStore gmail-remote
Host imap.gmail.com
Port 993
UserCmd "echo $GMAIL_USER" # from environment
PassCmd "echo $GMAIL_PASS" # from environment
AuthMechs LOGIN
TLSType IMAPS
PipelineDepth 1 # Avoid quota errors
Timeout 60 # More graceful timeouts
### Local Config ###
MaildirStore gmail-local
Path /mail/
Inbox /mail/INBOX
SubFolders Verbatim
### Sync Settings ###
Channel gmail
Far :gmail-remote:
Near :gmail-local:
Patterns *
SyncState *
CopyArrivalDate yes # Don't mess up message timestamps when moving them between folders.
Sync Pull # Download changes only, don't sync local changes up to the server.
Create Near # Automatically create new folders in the local copy.
Remove Near # Automatically remove deleted folders from the local copy.
Expunge Near # Expunge deleted messages from the local copy.
With the appropriate user and app password in a .env file, this will create your backup (the first run can take a loooong time).
Introducing notmore.
Next I wanted a way to look at my backup. Of course I could set up an IMAP server and point a mail client to it, but that seems relatively involved. What I wanted was a quick way to search through the Maildir.
A quick web search revealed notmuch - a xapian based mail search engine (and more that I am not using). It is super fast and simple to use. But it's CLI only. I wanted something with a web interface.
The general recommendation is netviel. A python/JavaScript interface to notmuch. Unfortunately it seems to be mostly abandoned with the last release 3 years ago and I had a really hard time getting it to work on modern Python versions within a Docker container.
So instead I decided to roll my own. I vibe engineered a PHP based search interface that wraps around the notmuch command line interface. It let's you search using notmuch's comprehensive syntax, displays the result threads and allows you to drill down into the individual mails. Attachments can also be downloaded through the interface. Simple, not more.
The installer detects your OS and architecture, downloads the latest release from GitHub Releases, verifies the SHA-256 checksum, and installs the binary.
Windows releases include native AMD64 and ARM64 packages. On Windows ARM64,
the PowerShell installer selects the native package when the release provides
one and falls back to the AMD64 package under emulation for older releases.
Running on a headless server?
msgvault works on headless machines (SSH, VPS, NAS, Docker), but OAuth requires a browser for the initial authorization. You'll authorize on your local machine and copy the token file to the server. See Headless Server Setup for the copy-token workflow, or jump to the Remote Deployment guide for a full NAS/server setup with Docker Compose.
# Using pixi (recommended)pixiglobalinstallmsgvault
# Using condacondainstall-cconda-forgemsgvault
Build From Source
Requires Go 1.26+ and a C/C++ compiler (GCC or Clang). CGO is required because msgvault uses mattn/go-sqlite3 (SQLite with FTS5) and duckdb-go/v2 (Parquet analytics), both of which compile native extensions.
On macOS and Linux this installs to ~/.local/bin or $GOPATH/bin. For a
debug build use make build, or make build-release for an optimized binary
with stripped debug symbols.
It detects AMD64 or ARM64 automatically and writes msgvault.exe in the
repository root. See Development and Roadmap for the
one-time MSYS2 compiler prerequisites.
Verify the installation:
Configure OAuth
Create a Google Cloud project, enable the Gmail API, and download your client_secret.json. If you plan to archive Google Calendar, enable the Google Calendar API too. See the full OAuth Setup Guide.
Where to put config.toml
msgvault stores all data (config, database, tokens, attachments) in a single directory. The default location depends on your platform:
Platform
Data directory
Config file
macOS / Linux
~/.msgvault/
~/.msgvault/config.toml
Windows
C:\Users\<you>\.msgvault\
C:\Users\<you>\.msgvault\config.toml
Tip
The .msgvault directory is created automatically the first time you run any msgvault command. If you're unsure of the exact path, run msgvault add-account [email protected]; the error message may show you where to create the config file.
To store data on a different drive or location, use the --home flag or set the MSGVAULT_HOME environment variable. If MSGVAULT_HOME is set, paths in the table above are relative to that directory instead:
Per-command (any platform):
msgvaultsync--homeE:/msgvault
Windows (PowerShell, persistent):
$env:MSGVAULT_HOME="E:\msgvault"# Or set it permanently:[Environment]::SetEnvironmentVariable("MSGVAULT_HOME","E:\msgvault","User")
macOS / Linux (persistent):
exportMSGVAULT_HOME=/mnt/data/msgvault
The --home flag takes priority over MSGVAULT_HOME. See Configuration for all options.
This opens your browser for OAuth consent. For headless servers, see the copy-token workflow.
If you plan to deploy to a remote host (NAS, cloud VM, etc.), run msgvault setup after this step to generate a ready-to-run deployment bundle with Docker Compose and remote configuration. See the Remote Deployment guide.
Add an IMAP Account
To sync mail from a non-Gmail provider (Fastmail, Outlook, Yahoo, self-hosted, etc.), use add-imap:
You will be prompted for your password (or set MSGVAULT_IMAP_PASSWORD / pipe via stdin for scripting). The command tests the connection before saving credentials. Use an app-specific password if your provider supports them.
Common IMAP servers:
Provider
Host
Port
Notes
Fastmail
imap.fastmail.com
993
App password recommended
Outlook / Hotmail
outlook.office365.com
993
Use add-o365 for OAuth (recommended); or app password with 2FA
For STARTTLS connections (port 143), add --starttls:
After adding the account, sync it the same way as a Gmail account:
IMAP accounts are stored in the same database as Gmail accounts. All tools (TUI, search, MCP, web server) work with IMAP messages the same way.
Microsoft 365 / Outlook.com
For Outlook, Hotmail, Live.com, and Microsoft 365 accounts, add-o365 provides OAuth-based access without app passwords. It auto-detects the correct IMAP host and configures XOAUTH2 authentication. See the OAuth Setup guide for details.
Yahoo App Passwords
Yahoo requires an App Password for IMAP access. Your regular Yahoo password will not work. To generate one:
Under Generate and manage app passwords, click Generate app password
Enter msgvault as the app name and copy the generated password
Use this password when add-imap prompts for your credentials
Note
IMAP sync always performs a full scan of the mailbox. The sync (incremental) command falls back to a full sync for IMAP accounts because IMAP does not provide a change-tracking API like Gmail's History API. Messages already in the database are skipped efficiently.
Sync Email
What to Expect
The initial full sync downloads every message and attachment from Gmail, so it can take a while. In testing we have observed roughly 50 messages per second on fast internet, but the Gmail API has per-user quotas that may throttle throughput further. An account with hundreds of thousands of messages and large attachments may take several hours; an account with millions of messages could take significantly longer. We recommend starting with --limit or a date range to verify everything works before kicking off the full run.
The good news: syncs are resumable (see below), and once the initial sync is complete, incremental syncs only fetch new and changed messages, which is much faster.
Disk Usage
msgvault stores raw MIME data compressed with zlib (typically 3-5x compression). As a rough guide:
Gmail usage (Settings → Storage)
SQLite DB on disk
Parquet cache
Attachments
5 GB
~1-2 GB
< 10 MB
varies
25 GB
~5-10 GB
< 50 MB
varies
100 GB
~20-40 GB
< 100 MB
varies
Gmail's "storage used" number includes attachments at full size. Your on-disk footprint depends on the ratio of message text to attachments:
Message metadata + bodies go into the SQLite database, compressed ~3-5x.
Attachments are extracted and stored as-is (PDFs, images, etc. are already compressed). Identical attachments across messages are deduplicated by content hash.
Parquet analytics cache is a lightweight projection for the TUI — typically a few MB even for large archives.
Use --limit or a date range for your first sync to gauge the ratio for your mailbox before committing to a full sync. After syncing, msgvault stats shows the actual sizes. See Data Storage for details on compression and storage layers.
Full Sync Flags
Flag
Description
--limit N
Download at most N messages
--after YYYY-MM-DD
Only messages after this date
--before YYYY-MM-DD
Only messages before this date
--query
Gmail search query filter
--noresume
Start fresh instead of resuming
--verbose
Show detailed progress
Incremental Sync
After the initial full sync, use incremental sync for efficient updates. It uses the Gmail History API to fetch only new and changed messages:
Resumable Checkpoints
If a sync is interrupted (network error, Ctrl+C), run the same command again. It resumes from the last checkpoint:
# This resumes automaticallymsgvaultsync-full[email protected]--after2024-01-01--before2024-02-01
Checkpoint data is stored in the sync_checkpoints table. Use --noresume to discard checkpoints and start over.
Rate Limiting
msgvault uses token bucket rate limiting to respect Gmail API quotas. The default is 5 requests per second, configurable in config.toml:
[sync]rate_limit_qps=5
Reduce this value if you encounter rate limit errors during large syncs.
Safety
Sync operations are read-only. They use only messages.list and messages.get Gmail APIs. No write operations are performed. Your Gmail data remains untouched.
Explore
# Search your archivemsgvaultsearchfrom:[email protected]# Launch the interactive TUImsgvaulttui
# View statsmsgvaultstats
To archive Calendar events alongside email, authorize Calendar access and run a
calendar sync:
Calendar sync is read-only. Events become searchable with
--message-type calendar_event; see Google Calendar for the
full workflow, scheduled sync, and headless-server setup.
Optional: Sync Microsoft Teams
To archive Teams chats and channels, add Microsoft Graph permissions to your
Microsoft app registration, authorize Teams, then sync:
Teams messages become searchable with --message-type teams. See
Microsoft Teams for required Graph permissions, scheduling,
and inline media backfill.
Optional: Configure Backups
Create a backup repository before relying on the archive as your source of
truth:
JSON in your SQL tables?
Here’s how to handle it 👇
𝗟𝗔𝗧𝗘𝗥𝗔𝗟 𝗙𝗟𝗔𝗧𝗧𝗘𝗡
One of the most common Data Engineering tasks is turning nested JSON arrays into flat rows.
In the example below, we use LATERAL FLATTEN to explode one order into multiple rows. One row per item purchased.
This example is in Snowflake, but you can achieve the same result in other engines:
🔍 BigQuery: CROSS JOIN UNNEST(column)
🧱 Databricks: LATERAL VIEW EXPLODE(column)
🐘 PostgreSQL: CROSS JOIN LATERAL unnest(column)
Once you flatten it, the analysis is easier.
Now you can easily answer questions like:
➜ How many items did we sell?
➜ Which item was sold the most?
👉 Nested data hides insights. Flattening reveals them.
---
♻️ Repost if you found it useful, please!
🔔 Follow José for more about SQL, Data and AI
When you’re alone it’s too easy to freeze. While keyboard warriors and protest attenders are important — you’ll feel the greatest strength if you gather with others semi regularly to plan together, share together, and act together.
In Chile under a repressive regime, the “affinity group” model was developed as a way to help keep people safe as they took risky actions. The process is simple enough: gather some people together who share your concerns and are ready to act together. Aim to build trust with this group over time. There are good instructions on creating an affinity group here. Whether your actions are high-risk or low — you’ll all benefit from supporting one another!
Another way to organize? Food and friends! Set a date and invite folks to meet up with a dish to share. Consider having planned actions (like phone calls or letter writing) to take while you’re together.
We need more politicization in these times — to help people navigate what is going on around us and understand how it got this bad. A study group can support learning as you and your people take action together and help to keep you in motion over time. There are plenty of resources across the choosedemocracy.us site you can use for your study group.
Care Calls are often wide-ranging conversations that ensure we are in touch folks in our neighborhoods. It can be walking door-to-door or just calling on people — but this is a way of connecting with people in our neighborhoods to see how they are doing (another version of this is deep canvassing). While these conversations may start as just check-ins, it’s a good way to find some other people who might want to act against the coup in these times — and to show love to your community no matter who you are.
There are thousands of community groups across the country already taking action, waiting for people just like you to get involved. Go to mobilize.us to find local activist groups to join that align with your hopes and priorities. You can also get involved in your workplace union or find a chapter affiliated with an organization taking action in this moment.
#2.
Pressure a pillar of support to defect
Authoritarian regimes are only successful when society bows to the orders of the autocrat. We can effectively fight back by identifying and withdrawing our support from the “pillars of support” (military, media, corporations, etc.) that prop up these dangerous rulers.
Watch this video to better understand the ‘Pillars of Support’. Then, pick a pillar you want to pressure and each day do at least one small thing to get them to defect.
💼Corporations & Economic Power
Authoritarian regimes need business elites to provide legitimacy, fund operations, and maintain the economy. Corporate boycotts and divestment are not about punishment — they’re about withdrawing the economic infrastructure that makes the regime’s agenda possible. 🚨Most companies are trying to find a non-existent neutral middle ground. If we only cause them pain without reward, they might move away from democracy — so target wisely. Focus on companies actively doing the regime’s dirty work. How to take action on this pillar These campaigns target the corporate and financial infrastructure that enables authoritarian policies. Join a boycott or divestment effort, or apply these strategies to companies operating in your region. 💼 Tesla / Musk / DOGE Tesla Takedown Active boycott of Tesla + divestment campaign targeting Musk’s economic power base. Coordinated actions now happening in 250+ cities globally. Host or find a protest at a Tesla showroom near you. Divest Tesla includes a step-by-step guide to getting your city to pass a Divest Tesla resolution for public pension funds. Template resolution, how-to guide, and organizing kit on the site. Fill out the Divest Public Dollars From Elon Musk form to indicate how you want to be involved. Sign this petition to tell T-Mobile to stop funding Musk. T-Mobile is making billions through a Starlink/T-Satellite deal. If you’re a T-Mobile customer, contact them directly. 💼 Palantir (The surveillance infrastructure of ICE and DOGE) Purge Palantir Palantir holds a $30M+ contract with ICE to build “ImmigrationOS” — a near-real-time surveillance system tracking migrants. It also provides AI tools to the Israeli military and holds contracts with health insurers and police departments nationwide. Note: Palantir fled Denver and moved their headquarters to Miami in February 2026 — partly in direct response to this campaign. Take the campaign pledge. Send letters to corporations and hospitals using Palantir software demanding they divest. Students and tech workers, you can push your university or employer to divest. University of San Francisco did it in 2025 after student pressure. Track Palantir’s political donors and demand your elected Representative donate any Palantir money to immigrant rights groups (several Colorado Representatives did this under pressure) Join or organize a local protest: Bay Resistance organizes ongoing local actions. Days of action have been held in Seattle, Palo Alto, Denver, DC, and NYC. 💼 Avelo Airlines (Win! This is the model.) Avelo ended its ICE contract on January 27, 2026 as a direct result of sustained pressure. The model is the same framework we want to replicate: local organizing → national boycott → subsidy pressure → win. The same playbook now applies to GlobalX Airlines and CSI Aviation, the logistics backbone of ICE Air. Send 40 messages to Avelo’s executive team demanding they stay clean. Boycott GlobalX, a charter airline currently running deportation flights. Demand your local airport cut ties with ICE Air contractors by using your airport board’s public comment process (residents in Portsmouth, NH used this to halt flights there). Join DSA’s International Migrant Rights Working Group to get more actively engaged in airline accountability. 💼 Active Boycotts Find current, verified corporate campaigns at Boycott Central. Here are the campaigns that are active as of early 2026 (a full list of campaigns can be found here): Boycott Home Depot — major donor to Trump political infrastructure Target — rolled back DEI commitments after pressure from Trump administration Quit GPT / Boycott Microsoft — tech accountability, AI enabling authoritarian surveillance Corporate Greed Our Revolution: Defund Oligarchy Campaign Campaign pushing to defund oligarchs and redirect public resources toward working people. Targets the financial infrastructure of the MAGA oligarch class directly. Find local actions and sign on.
🧊 ICE & Immigration Enforcement
ICE is not an immovable institution — it depends on local cooperation, private contractors, airline logistics, and detention facilities run by private companies. Every one of those dependencies is a pressure point that we can organize against. How to take action on this pillar The campaigns below focus on disrupting the systems that make detention and deportation possible. You can join national efforts or organize locally to interrupt cooperation with ICE in your area. 🧊Interrupt Ice Operations Interrupting Criminalization A menu of tactics for interrupting ICE operations: know-your-rights trainings, rapid response networks, legal observer training, and direct action options. Find the right level for you. Ground ICE Targeting Signature Aviation, the largest fixed-base operator in the US and the logistics hub for ICE deportation flights. Private pilots can boycott Signature Aviation. Contact corporate AND your local Signature branch. Include your tail number. Popular Democracy: Defend the 14th Campaign The 14th Amendment guarantees equal protection and birthright citizenship — now under direct attack. Campaign fights to stop efforts to undermine who belongs in this country. Indivisible: Halt the ICE Terror Machine Specific Indivisible campaign with actions around immigration enforcement funding and policy. Find your local chapter or take national actions. Know Your Rights Cards Print and distribute in your neighborhood. Practical infrastructure for ICE and police raids. MoveOn: Immigrant Defense Hub Hub of resources and actions supporting immigrant rights, resisting detention and deportation policies. National Day Labor Organizing Network: Adopt a Day Labor Corner Go to the places immigrants gather to work or look for work—Home Depots, car washes, delis, day-labor centers, hiring sites—as allies, witnesses, neighbors and friends. Adopt a Corner is an immediate, urgent call to action, grounded in solidarity. We the people need to defend our communities and one another NOW against our government’s campaign of intimidation, assault, arrests and violence. Common Cause: Demand Accountability From DHS Campaign pushing back against violent immigration enforcement tactics and calling for accountability at DHS and federal leadership. 🧊Shut Down Detention Centers Detention Watch Network: #CommunitiesNotCages Email program@detentionwatchnetwork.org to get connected to local campaigns actively working to shut down facilities. Active local campaigns are taking place in: Alabama California Florida Georgia Indiana Kansas Louisiana Michigan New Jersey New Mexico Oregon Texas Vermont Virginia Washington
When workers refuse to cooperate — through strikes, slowdowns, or simply organizing — the economic machinery that props up authoritarian power grinds to a halt. Labor controls one of the most powerful tools to protect democracy: the ability to stop the economy. How to take action on this pillar Labor is a pillar with unique leverage over the economy. These campaigns show ways workers — union and non-union — can organize collectively or support actions that apply economic pressure. ✊General Strike May Day Strong Coalition organizing toward May 1, 2026 as a national demonstration of worker power — modeled on Minnesota’s January 23 statewide economic pause where an estimated 1 in 4 Minnesotans participated. Take this Personal Pledge to commit to participate in a work stoppage, sick-out, or community action on May 1. Partner your organization by bringing your union, community organization, or business into the coalition. Strike Ready If you’re not in a union and want to build capacity for direct economic action: Join a training to learn how strikes work, community support roles, safety planning, and how to coordinate sustainably. Build your workplace with tools and guidance for building solidarity before any action is called. ✊Union Organizing If you’re in AFT, NEA, AFSCME, SEIU, UAW, UNITE HERE, UFCW, the most powerful thing you can do is engage with your local union: show up for meetings, push your local to connect contract fights to the broader democratic moment, and ask about May Day Strong coordination. ✊Social Safety Net Campaigns MoveOn: SNAP Into Action Campaign opposing cuts to SNAP benefits and protecting food assistance programs. MoveOn: Stop the Cuts Defending Medicaid, Medicare, Social Security, and essential benefits from proposed federal cuts. Coordinated calls, visits, and pressure campaigns. People’s Action: Housing Justice Training tenant organizers, pushing for tenant protections, bringing tenants into federal advocacy. Find your local affiliate. People’s Action: Health Care for All Helping individuals fight insurance denials AND pushing systemic reform. Both immediate and structural.
🎖️ Military & Security Forces
The military is the regime’s most critical pillar — and the one most constrained by its own traditions of apolitical service, constitutional oath, and institutional norms. When veterans publicly contest the militarization of democracy, it degrades the regime’s moral authority to deploy force. How to take action on this pillar These efforts focus on veterans, military families, and national security professionals speaking out from inside the institution. If you’re connected to this pillar, these campaigns offer ways to act with credibility and care. 🎖️Veterans Common Defense The largest progressive veterans organization in the country. No War on Our Streets is a campaign for veterans publicly opposing Trump’s deployment of military and masked federal agents to American cities. Protect VA Healthcare to fight proposed VA cuts. State organizing through active chapters in Pennsylvania, Georgia, Texas, Arizona, North Carolina and more. About Face: Veterans Against the War Post-9/11 veterans organizing on domestic militarization. #DroptheMIC (Drop the Military Industrial Complex) campaign exposes relationships between war profiteers, elected officials, and the Pentagon. You can sign on and join chapter organizing. Join if you’re a post-9/11 veteran. Secure Families Initiative Nonpartisan military spouses and loved ones mobilizing on foreign policy, national security, and democracy. Provides issue explainers, calls-to-action, and advocacy training for the military family community. National Security Leaders for America For those with national security backgrounds who want to speak out against the politicization of the military. Find and add your name to their public statements; they organize sign-on letters and public appeals. MoveOn: Stop Forever Wars Campaign to end endless US military interventions abroad. Direct action toolkit and petition. 🎖️Members Of The Military Share this guide with active-duty service members you know on how they can refuse unconstitutional orders: “For Members of Security Forces: A Guide to Supporting Pro-Democracy Movements“ If you know someone in the military or National Guard, speak with them about their right — and duty — to refuse unconstitutional orders. If safe to do so, speak directly to members of the military or National Guard about their complicity in illegal acts.
🏛️ Federal Workers & The Administrative State
The civil service is the practical machinery of governance. DOGE’s attack on federal workers isn’t about cutting costs — it’s about removing the people who enforce laws, block illegal orders, and maintain institutional checks on executive power. How to take action on this pillar The campaigns below support civil servants resisting unlawful or authoritarian directives. If you work inside the government, these resources help you stay informed, protected, and connected. There are also resources for how the general public can support federal employees in this moment. 🏛️ Federal Employees Federal Workers Against DOGE Coordination hub for current and former federal employees. Civil Service Strong Coalition of unions, nonprofits, and legal organizations providing current civil servant rights, whistleblower protection guides, and fact sheets on what is and isn’t legal. A full resource guide can be found here. Key principle: Where possible, staying inside institutions can create leverage. Take account of what’s happening around you. If you see something illegal, say something. For those prepared for higher-risk direct action: Don’t quit. Don’t obey unconstitutional orders. Blockade to stay. Make them drag you out. Video it. Government Accountability Project Legal support for federal employee whistleblowers. GAP can connect you with attorneys and help you understand your protections. Partnership for Public Service Federal Employee Resource Hub Offers plain-language context on current laws, executive actions, and proposals. 🏛️ General Public Show support for workers by organizing deliveries of food to federal employees holding the line. Small, visible acts of appreciation matter for morale. Re-share posts from Alt Nat Park Service and AltGov — platforms created by federal workers to resist cuts and document what’s being erased.
How to take action on this pillar These campaigns connect legal skills to movement strategy. Whether you have ten minutes or can offer deeper support, they provide concrete ways to defend the rule of law. ⚖️ Lawyers The Rule of Lawyers Connects lawyers with specific, concrete actions to defend rule of law. Meets you where you are — 10 minutes or full pro bono litigation. Movement Law Lab Recruiting progressive lawyers into coordinated civic resistance strategy — connecting legal work to movement campaigns, not just individual cases. ⚖️ Legal Campaigns ACLU: Defeat, Delay, Dilute 208+ legal actions filed against the Trump administration. Join as a member, attend Know Your Rights trainings, or volunteer with your state ACLU affiliate. ACLU: Defend Your Right to Learn Stand against classroom censorship, book bans, and restrictions on what can be discussed in schools. Action toolkit included. ACLU: Systemic Equality Nationwide advocacy and litigation challenging discriminatory laws and expanding racial equity in voting, education, housing. Protect Democracy: Defend Free & Fair Elections: safeguard election systems and keep the vote strong Defending the Rule of Law: push back against abuses of power eroding checks and balances 29 concrete actions you can take right now — on their site 10 Steps Campaign: historical playbook of authoritarianism with counter-framework and resources Common Cause: Mid-Decade Redistricting Effort to respond to threats to fair representation through fair redistricting advocacy.
⚖️ Jury Nullification Not a campaign with a sign-up form, but an active form of structural noncooperation. In several cities, juries have declined to convict people in politically charged immigration cases, using jury service as a check on government overreach. What you can do: Show up for jury duty — don’t try to get out of it. In communities targeted by aggressive federal prosecution, a juror who understands the historical role of juries as a check on government overreach is doing democratic work. Freedom Trainers’ Jury Nullification Trainings— educate yourself with their training program.
🇺🇲 Politicians & Electoral Accountability
How to take action on this pillar These efforts apply direct pressure on elected officials and electoral systems. They are designed for sustained participation — from daily calls to long-term accountability work. 5 Calls Updated daily with specific, localized asks. 5 minutes a day. The most direct individual-to-elected-official action available. Indivisible Fight Trump’s MAGA Power Grab of the House — opposing efforts to reshape Congress Vote Suppression — advocacy against voter suppression legislation Louisiana v. Callais — acting around a key voting-rights court case Run for Something Learn what local offices you could actually run for and get support. This is how the pillar gets rebuilt from the inside. Protect Our Election Send letters to local election officials — who face constant harassment and death threats — expressing support and demanding they stand for democracy. MoveOn: Won’t Back Down Backing Democratic leaders and candidates pushing back against Trump and defending democratic norms. NAACP: Fight Against Project 2025 Pushing back against the far-right policy agenda, mobilizing people to organize, educate, and act. Find your local NAACP chapter. Public Citizen: Campaign Finance & Democracy Reform Push for reforms to reduce corporate money in politics, empower small donors, and expand ballot access. Public Citizen: Protect Voting Rights Defending ballot access and pushing back against voter suppression through advocacy, litigation support, and coordinated pressure.
📚 Schools, Media & Knowledge
Authoritarian regimes attack education and information because knowledge about what’s actually happening is a direct threat to their power. How to take action on this pillar These campaigns defend education, information, and free expression from political interference. You can plug in directly or organize within schools, libraries, or media spaces you’re connected. Firewall For Freedom If you’re a student, professor, or campus worker, this campaign will call on your school to defend students’ rights against attacks on free speech, academic freedom, and DEI. Includes resolution toolkit. PEN America: Book Bans Campaign Campaign against book bans in your state or town — even before they are proposed. Unite Against Book Bans For librarians and community members. Resources for resisting censorship pressure. Education For All Hub Push local schools and universities to uphold DEI policies. Template advocacy materials and organizing support. Every Day Actions to Correct Misinformation: Share Snopes.com articles Write opinion pieces in your local paper Put up political signs in your yard and window. Downloads and designs at justseeds.org; Stop the Coup designs on Etsy.
How to take action on this pillar These efforts draw on moral authority and community trust within faith institutions. If you’re part of a congregation, they offer ways to organize rooted in shared values and public witness. Sojourners: Faith-Rooted Advocates Network (FRAN) Weekly interfaith vigils at the Capitol every Wednesday, coordinated with 24+ faith-based groups. FRAN provides tools for congregations to engage in civic action, voter registration, and advocacy. Interfaith Alliance Specifically fighting Christian nationalism and erosion of church-state separation. Sign up for action alerts. Poor People’s Campaign Multi-faith, multiracial coalition doing direct action, voter registration, and advocacy. Find your state chapter. Ask your faith group Get your religious group to pass a resolution in support of targeted communities. Faith institutions could also connect with police departments or local officials to learn in advance when community members may be in danger of detention — so they can act to protect people.
Pick a path and then find an action that fits your degree of difficulty (we’ve categorized harder actions as those that require more time, people skills, and often a small group to launch with).
Autocrats don’t want us standing up for each other. An easy step to disobey that is sending signals into your community that you care — that you will publicly stand with targeted communities. Here are some examples:
EASIER TO DO Partner with a local pride group to ask local businesses to put up a sign acknowledging that all folks are welcome in their stores. The “Welcoming Project” provides free signs and FAQ resources to encourage businesses, health care/service providers, organizations, and congregations to display welcoming signs.
Make sure every location you go to has a sign that says all people are welcome here (such as this work from artist Favianna Rodriguez). Shop somewhere, ask them. Attend a workshop somewhere, ask them. Kids go to little league somewhere, ask them.
MEDIUM TO DO Partner with a hospital or clinic to start an abortion-support fund, for folks seeking out-of-state medical care. You can find a local abortion-support fund to support/create on the national map hosted by the National Network of Abortion Funds.
Get your school board, city council, hospital commission or any government agency to affirm that they are a welcoming community to all people. For example, you can get your community to explicitly welcome and celebrate immigrants in the community joining the 300+ communities welcoming immigrants with the “Welcoming Network”.
Get your religious group, school, or little league to make a resolution in support of targeted folks. For example: why vaccinations are good practice or why everyone deserves to play sports, regardless what gender was assigned at birth. Faith institutions could stretch the limits and see if police departments or local officials are willing to inform them in advance what community members might be in danger of being snatched for deportation, so they can move to protect them.
HARDER TO DO Train volunteers in your city and state on basic safety skills that could be used as white nationalist violence ramps up. Training support on action safety: Action Security and De-escalation with links at the end for further training.
Start recruiting a slate of pro-democracy candidates for City Council or School Board. Run, support, or get involved by connecting with Run for Something.
Autocrats love weak institutions — because they can twist them to their personal goals. Institutional ethics, values, and bureaucracy can all be used to resist those efforts. We may often think of federal institutions (like the military), but a lot of these institutions are very local: health commissioners, local scientists, schools, election officials. We can seek to defend local civic institutions, particularly when they are doing their job and refusing to engage in immoral or unsavory acts.
Send supportive letters to people who run our elections, who are facing increasing hatred, bile, and even death threats. Send a letter with Protect Our Elections.
MEDIUM TO DO Start a citizen campaign practicing random acts of support. For example, order food for over-staffed nurses, blanket yards with signs supporting county health commissioners, or actively give out thank you cards with tips to front-line workers who are protecting us.
HARDER TO DO Collect a list of lawyers who will pro bono support for first amendment protestors ahead of crackdowns. Communicate these lists to local activists.
Create or support a bail fund for local activists when political repression comes. Here is a link to existing bail funds.
Disrupting and Disobeying
Autocrats rely on people “obeying in advance,” meaning anticipating a more restrictive version of society and behaving accordingly. This shows those in power how far they can go, and it moves the needle of what’s “normal” that much more quickly. Disrupting and disobeying the status quo diverts the autocrat’s resources and puts them on the defense instead of allowing them to plow ahead unencumbered. It also signals to others with less courage that they’re not alone in opposing what’s happening and may inspire them to take action.
EASIER TO DO Build an affinity group. Simply put, get together with a group of people you trust, build some trust together, and start to talk and plan about what risks you are willing to take.
MEDIUM TO DO As an affinity group, pick a specific issue to work on. We will need you to support migrant rights groups around deportation defense, for example. We might also need you to stop further climate chaos being wrought by fossil fuel companies and their financiers Reach out at info@disruption-project.org to get some coaching on how to take action.
Join with migrant rights groups to join their need for rapid response deportation defense.
Test the boundaries of the law, just a little. Alternatively to a massive sit-in to shut down a plant, you can have each person just cut one chain in the fence — as practice of resistance.
Call the Resistance Hotline (844-NVDA-NOW) to get coached on how to do an action even more powerfully.
HARDER TO DO Engage in active noncompliance. Noncompliance is taking bold action against a system that you feel is immoral. Noncompliance can be about a larger way of life that says that the whole system is fundamentally broken and that we need mass numbers of people not participating in it. As documented, authoritarian regimes don’t fall because of protests — they fall because the people refuse to go along with the regime, through mass defections in military and government, strikes that paralyze parts of the normal functioning of society, etc. Read more on Strategic Escalation in the Trump Era.
Jail solidarity. There was not a team of lawyers attempting to bail out Gandhi or Martin Luther King, Jr. They were held until they were released. Think about your team the same way. If you are arrested taking action, why would you pay money into a broken system? Why not stay in jail? This is known as jail solidarity. This serves two purposes. First of all, if enough people engage in jail solidarity it becomes a real problem for those in charge. Where do they house everyone? Second, the story of who is in jail can be pretty compelling too. Folks who are in for multiple days have access (or their friends do) to the press and can tell their stories, why they are there and why they are taking huge risks to support immigrants, or fight for the climate.
Wildcat strikes. If you’re in a union, can you organize your union to walk out in a wildcat strike, at a particular key juncture, when some threshold is crossed around worker protections? Or for undocumented folks? Begin those conversations now.
Organize your workplace. If you’re not in a union, can you organize folks in your workplace? To fight back against workplace raids? To stop work if some threshold is breached?
Organize, organize, organize — especially in neglected places. In 2017, many organizers moved from progressive areas back to where they grew up to start organizing projects in their hometowns. We will need more of these. In the section on protecting institutions, we mentioned some civic organizing that needed to happen. But, there is also the need for people to attempt ambitious organizations, whether it is faith institutions in the Quad Cities, Iowa; tenant organizing in Erie, Pennsylvania; or fighting to raise the minimum wage in Waukesha, Wisconsin. We need a lot more of these local organizing projects. While starting a new organizing project is challenging, we’re not going to dispute that, we are also available to talk with people to assess whether they can start something. We think lots of dedicated people can do interesting and important work. And, you don’t have to start all at once, you can also start with some of the suggestions in the first section on protecting people and see if you can gather some people together or win some smaller victories.
Shut things down. We’re happy to discuss details, but so much of what needs to happen is the shutting down of business as usual. Whether this is a strike at the ports or whether we could shut down finance or logistics, or extraction, this is the kind of mass action we need to be thinking about — not just protests.
EASIER TO DO Bring community together. Organize a potluck or clothing swap. Get folks together to talk about what they fear or hope in the times ahead. You can see one such agenda at There are More Of Us: Community Gatherings.
MEDIUM TO DO Build a community garden. Make it a community project to grow food and community.
Start a monthly or weekly mutual aid group. Mutual aid is a way to offer a place for exchanging needs in the community. It’s not a charity model but about the community finding its own resources, like offering unsheltered people homes in a church or community center or setting up ways to exchange meals, naloxone, legal help, pet supplies, winter clothing, etc. etc. (Training on mutual aid here: Mutual Aid 101.)
HARDER TO DO Help build the future we need by developing community solar or renewable power owned by the people. 350 has one such resource at OurOwnPower.org.
Get your city or state to promote participatory budgeting. Participatory budgeting (PB) is a direct democratic process where community members decide how to spend the public budget. It gives people real power — direct ownership over the decisions with full transparency. Learn more from the Participatory Budgeting Project.
Promote policies to abolish the electoral college, support third parties, or otherwise make this country more democratic. This is a big project — but lots of groups are exploring ways to do this. Because there are so many and many of them are nascent, we don’t have recommendations here — but encourage you to research ones that align with your values and organizing instincts.
Liberated territory. The right-wing militia movement in this country has created some liberated territory, whether that lives in their ranches or in the election of “Constitutional Sheriffs” who do not recognize the federal government, they swear an oath to the constitution. Create similar territories of sanctuary and protection, where folks are able to live free lives.
There is a lot of information here, so take a deep breath. There is a Jewish teaching that says that you are not responsible for completing the work, nor are you allowed to desist from it. We will succeed because millions of people do a couple things well, not because one person does a million things.
While we wish we were not compelled to travel down this path of resistance. We are excited to realize the collective beauty we can and will create together.
You got this.
New rule. Everything you want someone to be doing is your job. Start talking to every Republican, independent, or disillusioned Democrat you know and let them know they must fight back now.
There is a very important distinction between what they’re trying to do and what they’ll succeed in doing, between what they’ve launched a war against and the outcome of that war.
Keep calling. Do more if you can, but keep calling at the very least. You already splintered some of their support away with…what, one week of focused calling and demonstration woven together? Imagine what you can do with two weeks of it, with a month, with months on end, imagine what we could do if we were relentless.
Make sure you are talking to people and doing something. The logic of “move fast and break things,” like the logic of all coups, is to gain quick dramatic successes that deter and demoralize and create the impression of inevitability. Nothing is inevitable. Do not be alone and do not be dismayed. Find someone who is doing something you admire and join them.
This fall, Chris Paul announced that he would spend his final season with the Los Angeles Clippers. So far, his second tenure with the team has been a disappointment, even if it was never supposed to be like the first. From 2011 to 2017, Paul helmed a Clippers team best known as Lob City, one of the most thrilling basketball teams in my lifetime. It was a squad that played at a breakneck pace, with the ball thrust into orbit by Paul, and hanging suspended in the arena for a moment, only for one of his hyper-athletic teammates (most likely from the duo of élite rim runners DeAndre Jordan and Blake Griffin) to snatch it out of the air and ram it through the rim. Lob City revived Clippers basketball, which had historically been an afterthought compared to the team they shared a city and arena with, the Los Angeles Lakers. The Lob City-era Clippers were not without controversy (last year, I wrote about the show “Clipped,” which narrativizes the fallout from the racism of the then owner Donald Sterling), but on the court, the Clippers were, for a time, the greatest show in California. Still, despite their dominance, they were never good enough to win a championship. This, too, will be a part of Paul’s legacy: throughout his career, he always made teams better. That was his M.O. He would go to a team that was either not very good, or good but not yet great, and he would instantly improve their odds, often while acting as a mentor to a younger star who needed his veteran wisdom. After his time on the Clippers, he defected to the conference rival Houston Rockets, then did stints in Oklahoma City, Phoenix, San Francisco, and San Antonio. At every stop, he improved the team’s win percentage, sometimes dramatically, and turned two of the teams into bona-fide contenders. But, for all of this success improving underperforming teams, Chris Paul has never actually won a championship. This isn’t uncommon. Countless Hall of Famers from the nineties either retired ringless, or spent the early two-thousands hanging on the coattails of contenders in an attempt to get a ring, because Michael Jordan and the Chicago Bulls so thoroughly dominated the decade. The Lob City Clippers couldn’t get past the dynastic Golden State Warriors. Neither could the Houston Rockets, though in 2018 they did come close, taking Kevin Durant and Steph Curry to seven games in the Western Conference Finals. Paul got closest to a ring in 2021, in Phoenix, when he won the first two games of the Finals before losing four straight to Giannis Antetokounmpo and the Milwaukee Bucks.
We live in an age of basketball in which rings are, increasingly, treated as the bottom line, despite them being a flawed heuristic for individual dominance. This means that Chris Paul’s legacy, to some, has an asterisk attached, a fact that is compounded by the his ability to make deep playoff runs so often. He just couldn’t drag a team past that point. He’ll make your team good, maybe even great, but never the greatest.
And so, this past off-season, he returned to the Clippers, not necessarily to chase a ring but to return to the franchise that raised him. “If I’m really honest, I wanted to get back and play here by any means necessary,” Paul said. “I didn’t even care what the team looked like. I just wanted to be home, be here with the Clippers.” It was clear that it would be his final season, and everyone assumed that he’d get a proper farewell tour featuring standing ovations and tribute videos—the things that future Hall of Famers sometimes get when they announce their final season. He would be a bench player, logging ten to twelve minutes a game while providing veteran leadership. It would be a feel-good season, and he’d be seen off generously.
That plan came to an end last week, when the Clippers abruptly sent Chris Paul home from a road game in Atlanta and put out a statement explaining that Paul would not be with the team for the rest of the season. The next day, ESPN’s Shams Charania reported on the reason for his departure: “Chris Paul and his leadership style clashed with the Clippers, sources tell ESPN. Paul has been vocal in holding management, coaches and players accountable, which the team felt became disruptive.” Charania also reported that Paul and the Clippers’ head coach, Ty Lue, had not been on speaking terms for “several weeks,” an alarming fact considering that the N.B.A. season itself is less than two months old. (Lue later told reporters this was not true.)
These days, all I talk about and think about is the cognitive dissonance required to move through the world. Increasingly, I struggle to disentangle my many selves, to get on with the day. All my selves weep often. I try to have grace. I tell my friends that I’m no longer sure how anyone just drifts through the days, the months, without acknowledging the horrors. I imagine what it must be like to be able to turn off the parts of the world that unsettle you. It must feel like existing in an animated universe that adheres to cartoon physics: you fall from an inconceivable height and, landing, a cloud of dust billows up from the ground, but then you shake yourself off and keep moving.
I convince myself that I still laugh enough. Everyone I love would like to see an end to wars, would like to stop people from being snatched off the streets and deported, but some days we can’t march, because it’s so hot outside where I am that it is dangerous. It is dangerously hot outside, in part because of the climate consequences of the wars; they don’t stop and haven’t stopped for as long as we’ve been alive. The masjid on my block received threats last year, so community members put our money together to hire security. One of the elders joked that as long as the masjid was empty someone should feel free to burn it down—it would give us a good excuse to finally remodel. We laughed. I feel most Muslim when others might think that the joke is on my people, but my people are surviving, and so the joke is actually not on us at all.
At the end of Youssef’s show, he paced the stage in the near-silent aftermath of rousing applause. Then he began talking about two things that had left him hopeful that week. I clocked a couple in the row ahead of me mouthing “Zohran?” Then there he was, onstage, waving, taking in a standing ovation. He talked briefly about his vision for a different New York, one where people could advocate for Palestinian rights without the threat of persecution. And then Youssef introduced Khalil, who got an even bigger, more raucous ovation. He smiled wide and threw up a fist, a gesture that many in the audience returned.
Toward the end of Khalil’s short remarks, he looked at Mamdani as if it were just the two of them in the room, and he said, “I am excited about the possibility of raising my son in a city where you are mayor.” It was a stunning moment, one of those times when you could, if you were listening, hear a collective catching of breath before a fresh wave of applause. People made their way to the exits, some wiping away tears. I saw a friend, and we hugged. She said, “I didn’t realize I was crying, but now I can’t stop.”
As beautiful as that memory was, what lingered in my mind was the final joke of the night, when Khalil said that he was honored to be standing with Mamdani, “a man so principled that ICE hasn’t arrested him yet.” He paused and then, with perfect timing, added, “You can tell they are thinking about it.” Mamdani laughed. Youssef laughed. I laughed in my seat. It was a classically funny joke, made by someone who had been snatched from the lobby of his building by ICE agents, a joke lovingly directed at a mayoral candidate who has been threatened with deportation by the President and other political leaders. The joke was funny because of what some of us in the room knew and because of what the person telling it had lived through. The joke was funny because, though some of us in the room wept often, our laughter outpaced what we know of the world, for a few seconds at a time. ♦
In May of 1971, Marvin Gaye released what many consider to be his masterwork, “What’s Going On?” A song cycle told from the point of view of a Vietnam veteran returning to the United States after serving abroad, having witnessed all manner of suffering, violence, and injustice, it is not an entirely idyllic album. Yet the inquisitive nature of its title, and the question that foregrounds the work, suggests a faith in America held, if not by Gaye himself, then certainly by the speaker he invents to guide listeners through the forest of concerns the album conjures. We are to understand that the soldier in question left one place to go fight in another, and, upon returning home, found no improvement from the conditions he’d left.
By November of the same year, Sly Stone seemed to pose an answer: “There’s a Riot Goin’ On.” At the time that album was released, Stone, who died this week, at the age of eighty-two, was facing a make-or-break career inflection point. He and his band, Sly and the Family Stone, the multiracial, late-sixties-utopian-fever-dream ensemble, had ended the previous decade on a high, with the album “Stand!” garnering overwhelming acclaim. An accompanying performance at Woodstock left their label, Epic Records, eager for a next release. Yet, by 1971, all that had been put out were a couple of singles and a greatest-hits album. Stone missed recording deadlines. His relationship with the band had begun to fray amid creative disagreements, drug use, and Sly’s erratic behavior. Amid all of this, “There’s a Riot Goin’ On” landed as a jolt, as if he’d just shaken himself out of a long slumber, looked upon the country, and realized that he couldn’t stand carrying on in it the same way.
“There’s a Riot Goin’ On” acted almost as an inverse to some of the more upbeat, chart-friendly pursuits of Sly and the Family Stone’s earlier career. “Stand!” had been recorded at Pacific High Studios, in San Francisco. Just days after its release came Bloody Thursday, when police cracked down on antiwar protests at Berkeley, killing one and injuring at least a hundred and twenty-eight. Yet “Stand!” evinced a kind of relentless optimism, with exhilarating instrumentation ornamenting lyrics that were sometimes vague and gauzy. It closed with the song “You Can Make It If You Try,” which emanated a confidence that fortunes might change for us all. In the time between “Stand!” and “There’s a Riot Goin’ On,” Stone had faced increasing pressure from the Black Panthers, whose leaders wanted him to be more politically direct, and to de-integrate his band. The idealism of the sixties was dead, and with its death came the harsh realities of the new moment: political assassinations, expanded police violence, a shifting civil-rights movement, and a sense of disillusionment that seemed to haunt Stone as he searched for a purpose beyond hippie-culture stardom.
The grooves on “Riot” were deeper and darker, with collisions of vocals that in some moments barely resembled language at all. There was a kind of performance of apathy on the album which felt like both a reflection of Sly’s lived reality—a kind of rage that led itself to confusion, and then exhaustion—and a mimicry of the hippie movement, interrogating where it had left people and who it had left behind. On the first track, “Luv N’ Haight,” Sly’s voice is a distorted mumble as he sings the opening lyrics: “Feel so good inside myself / don’t wanna move.” As the song progresses, it becomes a polyphonic collision of sentiments: feel so good feel so good wanna move wanna move coming up against feel so good inside myself, don’t wanna move. It is hard to tell where one phrase peels off from the other, or whether the two statements are even at odds with each other. They exist within the same addled mind: We have to do something; we don’t know what it is. There was a sense of both resolve and resignation on the album, a heartbreak that seems almost in conversation with the hopeful ending of “Stand!” Now, over stark and downbeat instrumentals, Stone implied that you, like he, may have been dreaming.