Shared posts

14 Feb 10:00

Un marroquí denunció a una inmobiliaria por no enseñarle un piso solo por su origen. Ahora tendrán que pagar 10.000 euros

by tomeu

En enero de 2024, tras ver cómo la enésima inmobiliaria le cerraba la puerta tras enterarse de su origen marroquí, Hamid pidió a un compañero de trabajo que le echase un cable. Su amigo (de nombre español) llamó a la misma agencia preguntando por un piso de Mataró por el que poco antes se había interesado Hamid. No tuvo problema.

etiquetas: inmobiliaria, racismo, alquiler

» noticia original (www.xataka.com)

14 Feb 09:54

Tenemos que mirar directamente a la cara en lo que nos hemos convertido [Eng]

by Charles_Dexter_Ward

El 4 de octubre, Marimar Martínez, asistente de maestra en una escuela Montessori, conducía por Chicago cuando vio a agentes federales de inmigración patrullando. Había empezado a tocar la bocina para advertir a sus vecinos de su presencia cuando chocó contra un vehículo de la Patrulla Fronteriza. Momentos después, el agente en el vehículo, Charles Exum, disparó varias veces contra el coche de Martínez, impactándola repetidamente. (Más tarde, Exum presumiría ante sus colegas de que había "disparado cinco balas y que ella tenía siete agujeros").

etiquetas: ee.uu., jamelle bouie, ice, nyt

» noticia original (www.nytimes.com)

14 Feb 08:48

Weekly Commentary: Recalling 1991

by Doug Noland
With risk aversion gathering momentum, deleveraging looms.

“US Financial Shares Extend Selloff on Continued AI Concerns.” “US Brokerage Shares Slide in Latest Sell-off Driven by New AI Tool.” “Wealth Manager Stocks Sink as Investors Flee AI’s Next Casualty.” “Insurance Broker Stocks Plunge as New App Sparks AI Risk Fears.” “AI ‘Scare Trade’ Hits Real Estate Stocks.” “Real Estate Services Stocks Sink in Latest ‘AI Scare Trade’.” “Tech Rout Intensifies As Angst Over AI Deepens.” “Biotech Contractors Extend Slump Amid AI Fears, Weak Earnings.” “Logistics Stocks Sink on AI Fear Trade.” “AI Panic Hits Trucking, Transport Stocks.” “Stocks Have Few Pockets of Calm Amid AI Worries.” “Wall Street’s New Trade is Dumping Stocks in AI’s Crosshairs.”

February 13 – Bloomberg (Carmen Reinicke): “For three years, AI was the stock market’s savior. Suddenly, it’s become a marauder, and virtually no corner of the equity market looks safe from its impact. Just in the past 10 days, investors have delivered swift routs to companies toiling in industries as disparate as logistics, real estate, software, private credit, insurance and wealth management. In each case, the release of a new artificial intelligence tool, most famously from Anthropic PBC but also from small, lesser-known startups, prompted a rapid reassessment of business prospects… ‘All we have done and seen in the past few weeks is the market torch the perceived AI losers. Obviously the definition of AI losers is changing almost daily to the point where you can’t track it via themes or baskets,’ said David Wagner, portfolio manager at Aptus Capital Advisors. The one constant is that AI applications have become the market’s bogeyman, capable of erasing billions in value in a matter of hours as investors question the very viability of large swaths of the corporate landscape… ‘The perception is spreading like a wildfire, and it’s spreading horizontally,’ Joseph Shaposhnik, portfolio manager at Rainwater Equity, said. ‘In other words, it was once confined to a particular sector, and now it’s spreading across sectors, the fear of the risk’.”

For starters, the “AI scare” is a catalyst exposing underlying market fragility. In a robust market environment, we would not see such a proliferation of individual stock and sector blowups. It’s become a minefield out there. And it’s the type of market vulnerability consistent with incipient financial conditions tightening. With deleveraging rocking crypto and gaining momentum in Big Tech, we’re on watch for waning liquidity and tightened conditions.

Things are anything but straightforward. For the most part, financial conditions remain extraordinarily loose. The iShares Investment-Grade Corporate Bond ETF (LQD) returned 0.93% this week, increasing y-t-d returns to 1.65%. The iShares High Yield ETF’s (HYG) marginal weekly gain (0.05%) boosted 2026 returns to 0.77%. At 79 bps, investment-grade (IG) spreads (to Treasuries) widened four bps this week. Yet IG spreads are only nine bps off multi-decade lows – and compare to the five-year average of 104 bps. Up a more noteworthy 30 bps from January’s multi-decade low, to 280 bps, high yield spreads have started to move (two-month highs), signaling nascent risk aversion (5-yr avg. 346bps).

To be sure, global liquidity abundance persists. South Korea’s KOSPI equities index surged another 8.2% this week, with major indices up 5.8% in Japan, 5.6% in Thailand, 4.9% in Turkey, 4.1% in Taiwan, 3.9% in Vietnam, 3.5% in Indonesia, 2.4% in Australia, and 1.9% in Brazil and Canada. The South Korean KOSPI’s 30.7% y-t-d gain has inflated y-o-y gains to 113%. Japan’s Nikkei 225 Index has jumped another 13.1%, boosting one-year gains to 45.4%.

Particularly for U.S. stocks, mounting fragility coupled with general market liquidity excess stokes volatility and escalating instability. This dynamic has manifested into extraordinary stock and sector performance dispersion, foreshadowing more systemic de-risking/deleveraging. Such chaotic and unpredictable performance dispersion wreaks havoc on many levered hedge fund and derivatives strategies. So-called “pairs trades” turn precarious. Moreover, with the breakdown of traditional correlations, hedging stock market risks has turned problematic. While many stocks and some sectors have been clobbered, the S&P500 index has declined only 1.4% y-t-d.

Meanwhile, sections of the U.S. equities market (most stocks) have performed well, offering ongoing enticing opportunities despite the “AI scare.” The (this week) highflying Utility stocks surged 6.7% this week, boosting y-t-d gains to 8.6%. Down this week (2.8%), the Transports still enjoy an 11.4% y-t-d gain. The broader market has been strong. The Midcaps are up 7.8% y-t-d (about six weeks), while the small cap Russell 2000 has gained 6.6%. The “average stock” Value Line Index is 5.8% higher.

Providing a notably poor hedge, the Goldman Sachs Most Short Index has gained 6.8% so far in 2026. The Mag7 Index was hit 3.2% this week (Apple down 8.0%, Amazon 4.5%, Alphabet 5.3%, Meta 3.3%), boosting 2026 losses to 7.2%. The Crowded (previously free money) trade, long Big Tech versus short the broader market, is blowing up. Loose conditions have combined with squeeze dynamics to create ongoing speculative opportunities. Clock ticking.

“AI Borrowing Boom Shakes Bond Market.” “AI Spending Surge to Pressure High-Grade Credit.” “The AI Debt Binge is Transforming Big Tech: Everything Risk.” “AI Debt Deluge: Tip of the Iceberg as Big-Tech Borrowing Swells.” “AI Bond Blitz Spurs Biggest Tech Spread Penalty Since the GFC.” “Investors Sour on Listed Credit Funds Over AI Hit to Software Sector.” “AI Fears Weight on Call Center Operator’s $600 Million Bond Sale.” “UBS Says Credit Markets to Price in More Pain From AI Disruption.” ‘AI-Driven Debt Binge Threatens to Disrupt Passive Credit Funds.” “AI Scare Trade Goes Cross-Asset.” “How Private Equity’s Big Bet on Software Was Derailed by AI.”

Stock performance from the big “private Credit” players continues to warn of an approaching Credit storm. Apollo sank 6.0% this week (down 13.6% y-t-d), with Ares Management 1.8% lower (down 17.2%), and KKR declining 1.4% (20.2%). Up marginally this week, Blue Owl and Blackstone are still down 17.7% and 14.8% y-t-d.

Seemingly signaling an uptick in crisis dynamics, bank and financial stocks came under heavy selling pressure this week. The KBW Bank Index was slammed 5.5%, the largest decline since “liberation day” week April 4th. The Broker/Dealers slumped 3.7%, also the biggest drop since April.

Notable losses this week included Ameriprise Financial 12.8%, Charles Schwab 10.8%, Citigroup 9.6%, Robinhood 8.3%, Raymond James 7.8%, Wells Fargo 7.4%, Bank of America 7.0%, Truist Financial 7.0%, Capital One 6.9%, and JPMorgan 6.2%. Real estate kingpin CBRE Group sank 16.3%. It’s worth noting that European Banks stocks (STOXX index) sank 5.5% - the “worst week since April amid AI worries.”

Leveraged Loan prices remained under pressure, ending the week down another 0.03 to 95.37. This boosted one-month losses to 1.29 – the steepest decline since “liberation day” April 2025.

Treasury bonds caught fire this week. Ten-year yields sank 16 bps to 4.05%, the low back to December 1st. This was the largest weekly yield decline since early September (dovish Waller comments). Data were generally supportive. A weak December Retail Sales report (flat m-o-m) followed by favorable January CPI data were bond friendly. Stronger-than-expected January payrolls data - 130k jobs added, 4.3% Unemployment Rate, 0.4% gain in Average Hourly Earnings – were disregarded.

I view this week’s bond market (safe haven bid) action as corroborating mounting systemic deleveraging risks. The rates market priced a 3.00% year-end policy rate Friday, eight bps lower on the week and down 20 bps over 16 sessions – to the low since November 28th.

De-risking/deleveraging was ongoing throughout the cryptocurrency universe. Bitcoin dropped 2.5% Tuesday, declined 1.2% Wednesday, sank 2.9% Thursday, and then rallied 5.0% (trading from 65,000 to 69,000) Friday. “Bitcoin Traders Warn the $60,000 Mark is a Liquidation Trigger.”

February 9 – Decrypt (Vismaya V): “Crypto’s Super Bowl presence has shrunk from a multi-company marketing blitz to a single exchange’s sing-along, with Coinbase returning to the big game alone this year, as Seattle… defeated New England… to win Super Bowl LX. Four years after Coinbase brought its viral bouncing QR-code commercial to the ‘Crypto Bowl,’ the exchange aired the only major crypto ad during this year’s Super Bowl broadcast—unlike Super Bowl LVI, which featured celebrity campaigns from multiple firms, including the now-bankrupt crypto exchange FTX.”

February 9 – New York Times (Andrew Ross Sorkin, Bernhard Warner, Sarah Kessler, Michael J. de la Merced, Niko Gallogly, Brian O’Keefe, Ian Mount, Grady McGregor and Lauren Hirsch): “Big Tech’s artificial intelligence spending spree has roiled the market lately. The wallet was open for Sunday night’s Super Bowl LX broadcast, too, with a flood of A.I.-related ads that may prove more memorable than the game. The A.I. Bowl, as some are calling it, appeared to overshadow the… Seahawks’ victory. Yes, there were some creative gems among the commercials. But the torrent of spending is reminding some of previous years when tech companies tried to capitalize on the Super Bowl limelight. Those efforts didn’t end well for the advertisers. The numbers: Almost a quarter of this year’s Super Bowl ads — 15 of the 66 spots, which sold for an average of $8 million for 30-second slots — featured A.I…”

Whether it was Super Bowl ads, equities trading or corporate Credit performance, AI dominated. Headline of the week: “Former Karaoke Company Drags Logistics Into the ‘AI Scare Trade’.” AI might be the Bogeyman, but newfound negative market impacts are only a symptom.

The mind is a peculiar thing. My thoughts this week kept returning to early 1991. The Dow traded below 2,500 in mid-January. GDP printed negative 3.6% during Q4 1990. The economy was in recession, markets were in the tank, the banking system was severely impaired, and our nation was heading to war. Prospects could not have appeared much bleaker.

The S&P500 surged 3.7% on January 17, 1991, as it became clear that Saddam Hussein’s army had no answer to initial Operation Desert Storm strikes. What unfolded was a short squeeze for the ages. From January lows, the S&P rallied 35% into year-end.

The squeeze triggered the start of a transformative surge in marketplace liquidity. The Greenspan Fed had commenced aggressive rate cuts. Starting with 25 bps (from 8.25%) on July 13, 1990 – rates were down to 4.00% to end 1991, while on their way to a then unprecedented 3.00% by September 4, 1992.

Alan Greenspan orchestrated a steep yield curve to drive banking system recapitalization, a godsend for the fledgling leveraged speculating community. When bond Bubble deleveraging erupted in 1994, the GSEs operated as quasi-central banks to stabilize marketplace liquidity and the hedge fund industry – a role they would replay during the 1998 liquidity crisis (LTCM) and again in 1999 and 2000. The bursting of the nineties “tech” Bubble saw the Fed slash rates 475 bps in 2001 to 1.75%, unleashing mortgage finance Bubble leveraged speculation.

The Fed responded to the spectacular 2008 bursting Bubble with an unprecedented $1 TN of QE liquidity injections. Our central bank doubled down on QE, doubling its balance sheet to almost $4.5 TN between 2011 and 2014. The 2020 pandemic deleveraging crisis provoked liquidity injections to the tune of $5 TN, reckless monetary inflation that unleashed history’s greatest Everything Bubble of Levered Speculation. The March 2023 bank mini crisis triggered a swift (Fed/GSE) $500 billion liquidity injection. More recent repo market instability elicited the restart of QE.

Back in early 1991, the financial system was deeply impaired, and illiquid markets were in the toilet. Prospects looked dreadful. And for 35 years, government and central bank officials have done everything imaginable (and more) to ensure liquid markets. It’s to the point where virtually the entire market structure is built on the assumption of liquid and continuous markets. Astounding speculative leverage has accumulated over decades, ever more certain of liquid and continuous markets. Hundreds of Trillions of derivatives have enveloped global finance, premised on liquid and continuous markets. Trading strategies have proliferated, and ETF structures have ballooned to the many Trillions on the assumption of liquid and continuous markets.

It's been a Credit, asset inflation, and leveraged speculation super cycle Bubble for the ages. And, importantly, it all regressed to self-destructive “terminal phase excess” throughout the global government finance Bubble finale. More specifically, the recent years’ government debt, “repo,” “basis trade,” money market fund, “private Credit,” crypto and AI mania/arms race blow-off excesses went completely off the rails. Boy do things go crazy at the end of super cycles.

I thought of 1991 this week, as I monitored the makings for a super cycle deleveraging that would conclude three decades of ever-growing confidence in the capacity of governments to ensure marketplace liquidity abundance. Market history is strewn with booms turned bust, where liquidity excess spurred speculative Bubbles that ended in illiquidity and panic. No one thirty-five years ago contemplated the monumental transformation in liquidity dynamics that was to unfold. Today, seemingly everyone is unprepared for liquidity challenges ahead (mildly said).

The yen’s 3% rally was another of the week’s notable developments.

February 11 – Bloomberg (Greg Ritchie): “The carry trade in the yen is ‘a ticking time bomb,’ with the popular hedge-fund strategy vulnerable to a massive unwind, according to BCA Research... The trade — broadly defined as borrowing in the low-yielding Japanese currency to fund purchases of higher-yielding assets — benefits from the greater ‘carry’ on these foreign investments. But the trade unravels if the riskier assets tumble or the yen rallies. The BCA team led by Arthur Budaghyan sees the risk of a similar collapse in the trade to those seen in 2008, 2015 and 2020… ‘Our hunch is that the next unwinding case will also be triggered by a combination of a drop in ‘carry assets’ and/or a rebound in the yen,’ the team wrote… ‘It is impossible to know which will occur first. But they will reinforce each other, resulting in a major reversal of the yen carry trade’.”

February 12 – Bloomberg (Tasos Vossos): “The largest wave of corporate bond supply in history is set to be met by a rapidly-growing pool of passive buyers. Some investors are warning that disruption will follow. As Big Tech firms rush to raise unprecedented amounts of money to build out artificial intelligence, a growing share of those deals will be bought by passive funds. These strategies — which follow an index or buy a basket of bonds and wait until maturity — have ballooned in recent years, raising concerns that their indiscriminate style of bond buying has distorted metrics of risk and left investors vulnerable.”


For the Week:

The S&P500 declined 1.4% (down 0.1% y-t-d), and the Dow fell 1.2% (up 3.0%). The Utilities surged 6.7% (up 8.6%). The Banks sank 5.5% (up 1.3%), and the Broker/Dealers slumped 3.7% (up 0.7%). The Transports dropped 2.8% (up 11.4%). The S&P 400 Midcaps dipped 0.7% (up 7.8%), and the small cap Russell 2000 declined 0.9% (up 6.6%). The Nasdaq100 declined 1.4% (down 2.0%). The Semiconductors added 1.1% (up 14.9%). The Biotechs slumped 2.2% (up 1.1%). With bullion rising $70, the HUI gold index rallied 8.0% (up 24.2%).

Three-month Treasury bill rates ended the week at 3.59%. Two-year government yields fell nine bps to 3.41% (down 7bps y-t-d). Five-year T-note yields dropped 15 bps to 3.60% (down 12bps). Ten-year Treasury yields sank 16 bps to 4.05% (down 12bps). Long bond yields fell 16 bps to 4.70% (down 15bps). Benchmark Fannie Mae MBS yields dropped 13 bps to 4.87% (down 17bps).

Italian 10-year yields dropped 10 bps to 3.36% (down 19bps y-t-d). Greek 10-year yields fell 10 bps to 3.36% (down 8bps). Spain's 10-year yields dropped nine bps to 3.13% (down 15bps). German bund yields declined nine bps to 2.76% (down 10bps). French yields dropped 11 bps to 3.34% (down 22bps). The French to German 10-year bond spread narrowed about two to 58 bps. U.K. 10-year gilt yields dropped 10 bps to 4.42% (down 6bps). U.K.’s FTSE equities index added 0.7% (up 5.1% y-t-d).

Japan’s Nikkei 225 Equities Index surged 5.0% (up 13.1% y-t-d). Japan’s 10-year “JGB” yields were about unchanged at 2.23% (up 16bps y-t-d). France’s CAC40 increased 0.5% (up 2.0%). The German DAX equities index added 0.8% (up 1.7%). Spain’s IBEX 35 equities index fell 1.5% (up 2.1%). Italy’s FTSE MIB index declined 1.0% (up 1.1%). EM equities were mixed. Brazil’s Bovespa index jumped 1.9% (up 15.7%), and Mexico’s Bolsa index added 0.9% (up 11.0%). South Korea’s Kospi surged 8.2% (up 30.7%). India’s Sensex equities index declined 1.1% (down 3.0%). China’s Shanghai Exchange Index added 0.4% (up 2.9%). Turkey’s Borsa Istanbul National 100 index jumped 4.9% (up 25.9%).

Federal Reserve Credit jumped $19.2 billion last week to $6.569 TN, with a nine-week rise of $78.4 billion. Fed Credit was down $2.321 TN from the June 22, 2022, peak. Since the September 11, 2019 restart of QE, Fed Credit has expanded $2.842 TN, or 76%. Fed Credit inflated $3.758 TN, or 134%, since November 7, 2012 (692 weeks). Elsewhere, Fed holdings for foreign owners of Treasury, Agency Debt gained $5.4 billion last week to $3.095 TN. “Custody holdings” were down $206 billion y-o-y, or 6.2%.

Total money market fund assets (MMFA) declined $22.7 billion to $7.774 TN - with a 30-week surge of $751 billion, or 18.5% annualized. MMFA were up $912 billion, or 13.3%, y-o-y - having ballooned a historic $3.190 TN, or 70%, since October 26, 2022.

Total Commercial Paper jumped $19.7 billion to $1.431 TN. CP has expanded $172 billion, or 13.6%, y-o-y.

Freddie Mac 30-year fixed mortgage rates dipped two bps to 6.09% (down 78bps y-o-y) - just off the low back to September 2022. Fifteen-year rates fell six bps to 5.44% (down 65bps). Bankrate’s survey of jumbo mortgage borrowing costs had 30-year fixed rates down three bps to 6.33% (down 64bps).

Currency Watch:

February 9 – Bloomberg (Tian Chen): “The yuan surged to its strongest level since May 2023 after China was said to have asked banks to limit their holdings of US Treasuries. Any shift away from US sovereign debt reinforces a broader global trend of diversification away from the dollar. Such a move might accelerate the repatriation of capital into Chinese assets, providing a fundamental tailwind for the yuan… The latest move is adding momentum for the yuan, which is already the third-best-performing currency in Asia since the end of September with a gain of around 3%.”

For the week, the U.S. Dollar Index declined 0.7% to 96.915 (down 1.4% y-t-d). On the upside, the Japanese yen increased 3.0%, the Norwegian krone 1.8%, the South Korean won 1.4%, the Swedish krona 1.2%, the Swiss franc 1.1%, the Australian dollar 0.9%, the Singapore dollar 0.7%, the Mexican peso 0.5%, the South African rand 0.5%, the euro 0.5%, the Canadian dollar 0.4%, the New Zealand dollar 0.4%, and the British pound 0.3%. On the downside, the Brazilian real declined 0.1%. China's (onshore) renminbi increased 0.42% versus the dollar (up 1.20% y-t-d).

Commodities Watch:

The Bloomberg Commodities Index declined 0.5% (up 7.0% y-t-d). Spot Gold rose 1.6% to $5,042 (up 16.7%). Silver slipped 0.5% to $77.4148 (up 8.0%). WTI crude declined 66 cents, or 1.0%, to $62.89 (up 10%). Gasoline dropped 2.2% (up 11%), and Natural Gas sank 5.2% to $3.243 (down 12%). Copper dipped 1.3% (up 2%). Wheat jumped 3.6% (up 8%), and Corn increased 0.3% (down 2%). Bitcoin dropped $1,700, or 2.4%, to $68,900 (down 21.4%).

Market Instability Watch:

February 10 – Bloomberg (Alexandra Semenova): “US equity markets are moving more money than ever before, blowing past $1 trillion in shares traded each day as heavy volume becomes the new norm. The surge marks a sharp step-up from a year ago. Equity turnover averaged a record $1.03 trillion in January, a roughly 50% increase from the same period in 2025… More than 19 billion shares traded hands daily over the span, the second-most ever... The jump reflects a broad-based increase in participation across the market. Mom-and-pop investors and institutional players alike have become more active as US stocks hover near record highs… ‘There’s more trading from retail, pod shops and hedge funds, and market makers, while automated trading is more prevalent than ever,’ said Bloomberg Intelligence… analyst Jackson Gutenplan.”

February 12 – Financial Times (Richard Waters): “Wall Street is getting extremely jumpy about the threat of AI disruption to a widening range of industries. That is the best explanation for the hammering that brokerage and wealth management stocks took this week, thanks to a little-known US fintech company called Altruist. The idea that an upstart armed with better technology can threaten giants of the finance industry has fuelled various waves of fintech mania over the years. Generative AI has just given a new twist to this — as it has in other industries. As with previous waves of tech disruption, the most exposed are those whose basic product is information — finance, legal services, media and software.”

February 7 – Bloomberg (Emily Graffeo and Caleb Mutua): “The biggest tech companies are gearing up to spend even more on artificial intelligence than investors had anticipated, and money managers increasingly fear that whatever happens, credit markets will get hit… A chunk of those investments will come from the high-grade corporate bond market… But the more tech companies borrow, the greater the potential pressure on bond valuations. The securities are already expensive by historical standards, trading at close to their tightest spreads since the late 1990s. ‘The AI spending bonanza is finding buyers today but leaves little upside and even less room for error,” said Alexander Morris, chief executive officer and co-founder of F/m Investments. ‘There is no asset class that can’t and won’t spoil’.”

February 10 – Financial Times (Peter Wells): “Shares in Charles Schwab, Morgan Stanley and Raymond James sank on Tuesday, in the latest bout of selling triggered by investor concerns about the disruption AI start-ups will have on established companies. The sell-off of several US financial services companies began in late-morning trading after fintech Altruist announced the launch of a tax-planning tool within its AI platform, Hazel… Schwab and Raymond James had their share price gains for 2026 wiped out, with the stocks closing 7.4% and 8.7% lower, respectively. Rival Stifel Financial was down 3.8% and ETrade parent Morgan Stanley shed 2.4%.”

February 10 – Bloomberg (Paul J. Davies): “Artificial intelligence doesn’t only threaten to put herds of software businesses out to pasture. Anthropic PBC’s schooling of its Claude models in financial modelling has also sent a cold shiver down the spines of bankers and analysts. While I mostly suspect that the banking industry’s talent for self-preservation will defend it from technological change, I do wonder if the extreme version of our fully automated AI future could make financial services as irrelevant as everything else. Finance has a very long history of always finding new ways to get paid even as the world of money keeps changing. In only the past few decades, collecting peoples’ savings, buying and selling securities and sending money to the other side of the world have all become faster and cheaper. The internet and smartphones have taken out the frictions and delays that were long a source of revenue for intermediaries.”

February 9 – Bloomberg (Stephanie Hughes): “US insurance broker stocks were pummeled Monday as the launch of an artificial intelligence tool from privately held online insurance shopping platform Insurify sparked fears about the industry facing disruption. The S&P 500 Insurance index closed down 3.9%, in its biggest drop since October.”

February 10 – Bloomberg (Winnie Hsu): “The relentless surge in memory chip prices over the past few months has driven a vast divide between winners and losers in the stock market… Companies from game console maker Nintendo Co. to big PC brands and Apple Inc. suppliers are seeing shares slump on profitability concerns. Memory producers, meanwhile, are soaring to unprecedented heights. Money managers and analysts are now assessing which firms can best navigate the squeeze by locking in supplies, raising product prices or redesigning to use less memory.”

February 12 – Bloomberg (Arvelisse Bonilla Ramos): “Commercial real estate stocks nosedived Thursday as traders worried about risk to demand for office space from higher use of artificial intelligence tools, broadening a selloff that began Wednesday... Shares of CBRE Group… fell 8.8%, bringing the two-day decline to 20% in the worst such move since 2020. Jones Lang LaSalle Inc. fell 7.6% Thursday, Cushman & Wakefield Ltd. dropped 12% and Newmark Group Inc. slid 4.2%.”

February 12 – Bloomberg (Alice Atkins): “Markets are complacent on the outlook for US inflation, making trades that pay out if price pressures climb look attractive, according to… Citigroup... Investors may be underestimating the resilience of the US consumer and market expectations for inflation are likely to be revised slightly higher, said Benjamin Wiltshire, a rates trading desk strategist at the US bank. ‘Markets seem to have this conviction that inflation is going to come down,’ Wiltshire said... ‘We’re still in a structurally higher inflation environment’.”

U.S. and Global Credit Excess Watch:

February 11 – Reuters (Jamie McGeever): “The global economy is at an odd juncture, one that points to an ugly few years for bond markets. The fiscal picture across developed economies is deteriorating rapidly and uniformly, yet unlike previous bouts of huge government spending in the last two decades, there is no global financial crisis or pandemic requiring trillions of dollars. Far from it. Growth appears solid, an unprecedented private sector capex boom is underway courtesy of the artificial intelligence arms race, and stock markets are at record highs. All these dynamics are clearly feeding off each other. Governments are loosening their purse strings because they are adjusting to a new world reality: globalization is fraying – or, some might say, dying - and being replaced by polarization, isolationism, and rising geopolitical tensions. Promises to ramp up spending on defense, energy and resource security, and technological advancements – alongside pledges to help voters with affordability issues – threaten to put enormous strain on public finances that have never fully recovered from the Covid-19 pandemic.”

February 12 – Wall Street Journal (Heather Gillers and Sam Goldfarb): “A new AI borrowing frenzy and lingering fears about potential defaults haven’t deterred investors hungry for bonds from U.S. companies, states and cities. The extra yield—or spread—that investors demand to hold highly rated corporate bonds instead of ultrasafe U.S. Treasurys hit a 27-year low in late January. Spreads on speculative-grade corporate bonds dropped to an 18-year low. In the $4 trillion municipal bond market, the spread between interest rates on triple-A and triple-B bonds is at one of its lowest points in two years. Those tight spreads are the latest sign of how bonds remain stubbornly resistant to concerns rattling other markets.”

February 12 – Financial Times (Ian Smith and Michelle Chan): “A rally in corporate bonds has pushed the reward for taking extra credit risk to historic lows, prompting warnings from some investors of ‘bubble-like behaviour’ in parts of the market. Corporate bonds have been swept up in a huge rally for risky assets since early last year… The average additional borrowing cost — or spread — that highly rated US and European companies pay compared with government debt has fallen to its lowest since before the 2008 global financial crisis, while the extra yield offered by more risky debt has also shrunk markedly… ‘Credit markets have increasingly exhibited bubble‑like behaviour since late last summer,’ said Nuwan Goonetilleke, head of capital markets at FTSE 100 insurer Phoenix Group…”

February 9 – Bloomberg (Laura Benitez): “Apollo Global Management Inc. set a record in its business of making loans, a crucial plank in the firm’s ambition to become one of the largest underwriters on Wall Street. The… firm originated a record $97 billion in the fourth quarter, totaling $309 billion for the year, and almost $100 billion more than the year before.”

February 9 – CNBC (Jennifer Elias): “As Alphabet returns to the debt market to fund its artificial intelligence build-out, the company is acknowledging new risks tied to the rise of AI and its hefty investments in infrastructure. In its annual financial report…, the Google parent highlighted the potential impact of AI on the company’s core advertising business and the possibility of ending up with ‘excess capacity’ from its costly commitments. ‘To meet the compute capacity demands of AI training and inference, as well as traditional cloud computing services, we are entering into significant leasing arrangements with third party operators, which may increase costs and operational complexity,’ the company stated… Large commercial agreements could also increase ‘liabilities and obligations in the event of nonperformance by us, our counterparties, or vendors’…”

February 9 – Bloomberg (Rachel Graf and Scott Carpenter): “In the $1.3 trillion market for collateralized loan obligations — where money managers sell bonds to finance buying pools of buyout loans — ugly math used to kill a deal. Less so now. Money managers are increasingly raising special funds known as captive equity: pools of capital they control that buy any and all CLO equity a firm might sell. By becoming their own guaranteed buyer of the deal’s riskiest portion, managers can quickly launch CLOs without needing to prove immediate profitability to the broader market — a hurdle that could have swiftly torpedoed an offering… This shift has allowed CLO issuance to hit record levels…”

February 10 – Wall Street Journal (Jack Pitcher and Juliet Chung): “BlackRock went all in on Wall Street’s booming business of private lending last July when it acquired HPS Investment Partners, a firm founded by alumni of Goldman Sachs… Days after the deal closed, an analyst at HPS’s… headquarters spotted a big problem. The company was the lead lender on a more-than $400 million credit agreement with a telecom entrepreneur, Bankim Brahmbhatt, accepting as collateral accounts receivable the executive’s firm had acquired from other businesses. Reviewing those invoices, the analyst noticed that the email address domain on one didn’t match what was on the website of the company it was supposed to be from. HPS dug deeper, and found the same issue again and again. The lender scrambled to get answers from Brahmbhatt, but he had left for India and eventually stopped picking up the phone. Two weeks later, HPS was in court accusing Brahmbhatt of carrying out a ‘breathtaking’ fraud. The emails were fake, the invoices were fake—and the collateral was worthless, they alleged.”

U.S. Credit Trouble Watch:

February 9 – Financial Times (Michelle Chan): “Investors are souring on listed private credit funds that lend to software companies as concerns grow over AI’s potential to disrupt their business models and eat into their profits. Worries over some software companies’ ability to service their debt have intensified this month after start-up Anthropic launched a new AI model that can automate a variety of professional tasks such as sales, finance and legal work… Bonds and shares of business development companies (BDCs), which make loans to middle-market groups, have also fallen sharply, despite a rebound on Friday and Monday, highlighting the large exposure that the private credit industry has built to the sector in recent years. ‘The software sector is facing an existential crisis right now,’ said Christian Hoffmann, head of fixed income at Thornburg Investment Management. ‘The recent product rollouts have really accelerated those fears. Both private credit and software are facing significant pullbacks,’ he added.”

February 11 – Bloomberg (Shannon D. Harrington): “Private credit funds are seeing another sign of growing stress: the share of private equity-backed companies deferring cash interest payments increased for a third consecutive quarter. So-called ‘bad PIK,’ where borrowers opted to delay interest during the life of the loan rather than when it was originated, now represent 6.4% of private loans, up from 2.5% in late 2021, according to… Lincoln International.”

February 10 – Bloomberg (Laura Benitez): “Ares Management Corp. Chief Executive Officer Michael Arougheti downplayed the idea of trouble in the private credit market and fears of AI disruption, two factors that hammered shares of alternative asset managers recently. Arougheti said the firm’s institutional investors are not anxious about private credit risks and that 97% of its wealth clients have not asked to redeem from such products. ‘It’s frankly a frustrating narrative to folks like us that have been doing it a long time,’ Arougheti said…”

February 10 – Reuters (Michael S. Derby): “Overall credit troubles in the U.S. increased modestly but held at low levels during the fourth quarter as some parts of the mortgage market saw accelerated fraying, amid ongoing difficulties for student loan borrowers, the Federal Reserve Bank of New York said… Total debt delinquencies ‘worsened’ in the fourth quarter, with 4.8% of loans in some sort of trouble… Troubled loans in the third quarter stood at 4.5%. ‘We would characterize overall that delinquency rates have, especially for non-mortgage debt, that they've really stabilized or leveled off,’ a… Fed researcher said…”

February 10 – Bloomberg (Ye Xie, Ruth Carson and Tian Chen): “The slump in Treasuries after China’s latest call to curb its holdings was fleeting, but it put a spotlight on Beijing’s decade-long shift from US debt and rekindled fears about a broader, global retreat. A look at the data on China’s Treasury holdings suggests why traders were so quick to move on from the report that Beijing had urged Chinese banks to limit their Treasury purchases. Once the largest foreign lender to the US government, China has quietly halved its holdings of Treasuries since 2013... The danger now is whether President Donald Trump’s unpredictable policies alienate US allies further, and encourage traditional lenders like Europe and Japan to follow in China’s footsteps.”

Trump Administration Watch:

February 7 – Wall Street Journal (Angus Berwick and Eliot Brown): “In the depths of Donald Trump’s interregnum, his eldest two sons huddled in a Mar-a-Lago conference room with boyhood pal Zach Witkoff to conjure up a new money machine. Two other would-be cryptocurrency entrepreneurs showed up… That pre-election confab sowed the seeds for World Liberty Financial, a crypto venture that, with the senior Trump back in power, is generating cash far faster than the president’s decades-old real-estate business. While his father Steve Witkoff acts as President Trump’s all-purpose special envoy, 32-year-old Zach Witkoff now heads up World Liberty, which has doled out at least $1.4 billion to both families since the president’s re-election… Among the payouts: a secret $500 million deal to sell almost half the company to an Abu Dhabi royal and his co-investors. Witkoff is part of a small cadre of Trump administration offspring who, since their fathers moved to Washington, have metamorphosed into wealthy financial celebrities in their own right. Key to their transformation has been the crypto sector…”

February 9 – Financial Times (Aime Williams): “Donald Trump’s administration intends to spare companies including Amazon, Google and Microsoft from forthcoming tariffs on chips as they race to build the data centres powering the AI boom. The commerce department is planning to provide US hyperscalers with tariff carve-outs, which would be tied to investment commitments made by Taiwan-based chip group Taiwan Semiconductor Manufacturing Company (TSMC), people familiar with the matter said.”

February 11 – Bloomberg (Josh Wingrove): “President Donald Trump is privately musing about exiting the North American trade pact, people familiar… said, injecting further uncertainty about the deal’s future into pivotal renegotiations involving the US, Canada and Mexico. The president has asked aides why he shouldn’t withdraw from the agreement, which he signed during his first term, though he has stopped short of flatly signaling that he will do so, according to the people who spoke on condition of anonymity to describe internal discussions.”

February 7 – CNBC (Spencer Kimball): “The Trump administration’s portfolio of equity stakes in U.S. companies has reached a scale that is unprecedented outside economic crisis or wartime. The administration has taken stakes or has agreements to do so with at least 10 companies, most of which are publicly traded. The government announced its latest investment, USA Rare Earth, at the end of January… ‘It is a invisible barrier to startups and new market entrants,’ said Scott Lincicome, an international trade lawyer affiliated with Cato Institute. ‘Why would you ever want to enter a market that you know your chief competitor is backed by the U.S. government?’”

February 10 – Financial Times (Christian Davies): “Donald Trump has threatened to block the opening of a new suspension bridge connecting the US and Canada, escalating tensions between the two neighbours… The US president wrote… that the Gordie Howe International Bridge — which is set to open this year and connects the key auto hubs of Detroit, Michigan and Windsor, Ontario — had been built with ‘virtually no US content’. ‘I will not allow this bridge to open until the United States is fully compensated for everything we have given them, and also, importantly, Canada treats the United States with the Fairness and Respect that we deserve… We will start negotiations, IMMEDIATELY,’ he added. ‘With all that we have given them, we should own, perhaps, at least one half of this asset’.”

February 10 – Associated Press (Joey Cappelletti, Steve Peoples and Steven Sloan): “An annual meeting of the nation’s governors that has long served as a rare bipartisan gathering is unraveling after President Donald Trump excluded Democratic governors from White House events. The National Governors Association said it will no longer hold a formal meeting with Trump when governors are scheduled to convene in Washington later this month, after the White House planned to invite only Republican governors. On Tuesday, 18 Democratic governors also announced they would boycott a traditional dinner at the White House.”

February 9 – Wall Street Journal (Rebecca Picciotto): “The White House is at loggerheads with Congress over one of President Trump’s signature housing proposals, a ban on Wall Street investors buying single-family homes. Trump officials pressured congressional Republicans in recent weeks to include the investor ban as an amendment in either of the major housing bills currently winding through the House and the Senate… But lawmakers in both chambers have resisted adding the investor ban, which traditional free-market advocates, Wall Street executives and the home-builder industry generally oppose.”

February 6 – Bloomberg (Olga Kharif): “The government didn’t pay for it — and it’s not planning to sell. But for the US Treasury, now sitting atop billions of dollars worth of stockpiled Bitcoin tokens, the recent selloff has delivered an uncomfortable lesson in what it means to treat ‘digital gold’ like a reserve asset — and whether the notoriously volatile token deserves the backing of the world’s largest economy. Since President Donald Trump signed an executive order last March to establish a strategic Bitcoin reserve, the market value of the government’s holdings of the digital currency has cratered.”

February 12 – Bloomberg (Catherine Lucey): “The White House sought to ramp up pressure on JPMorgan Chase & Co.’s Jamie Dimon to cap credit card interest rates, a demand of President Donald Trump amid his push to address affordability. ‘James Dimon, lower your friggin’ credit card interest rates. You are a criminal the way you charge the American people at 22, 25 and 30% and the president wants you to lower that,’ White House trade adviser Peter Navarro said… ‘Jamie, until you do that, please refrain from commenting on other public policies’.”

February 9 – Financial Times (Jude Webber, Joe Daniels and Michael Stott): “Cuba has told international airlines that it will not be able to supply them with jet fuel from Tuesday, as US President Donald Trump squeezes the communist island’s oil supplies. The measure, at the height of the tourist season, has prompted Air Canada to suspend flights to the island and is expected to hit US, Spanish, Panamanian and Mexican airlines. The notice, issued at the weekend, said the measure would last until March 11.”

Budget Watch:

February 11 – Associated Press (Fatima Hussein): “The nonpartisan Congressional Budget Office’s 10-year outlook projects worsening long-term federal deficits and rising debt, driven largely by increased spending, notably on Social Security, Medicare, and debt service payments. Compared with the CBO’s analysis this time last year, the fiscal outlook has deteriorated modestly. Major developments over the last year are factored into the latest report…, including Republicans’ tax and spending measure known as the ‘One Big Beautiful Bill Act,’ higher tariffs, and the Trump administration’s crackdown on immigration…, the projected 2026 deficit is about $100 billion higher, and total deficits from 2026 to 2035 are $1.4 trillion larger, while debt held by the public is projected to rise from 101% of GDP to 120% — exceeding historical highs.”

February 11 – Financial Times (Myles McCormick and Kate Duguid): “Donald Trump’s policies will expand the federal budget deficit by $1.4tn over the coming decade, Congress’s fiscal watchdog has warned… ‘Our budget projections continue to indicate that the fiscal trajectory is not sustainable,’ said CBO director Phillip Swagel… ‘There’s no sugarcoating it: America’s fiscal health is increasingly dire,’ said Jonathan Burks at the Bipartisan Policy Center. “Our debt is now 100% of GDP, and rather than pumping the brakes, we are accelerating’.”

February 11 – Wall Street Journal (Richard Rubin): “The U.S. budget deficit will remain roughly flat for the next two years and then widen over the next decade as interest costs consume an increasing share of spending, the Congressional Budget Office said… in a forecast that highlighted the country’s long-run fiscal challenges. The U.S. is projected to run a deficit of $1.85 trillion, or 5.8% of gross domestic product, in the year that ends Sept. 30, and then stay about level at 5.7% of GDP in fiscal 2027. For every $1 the U.S. collects in taxes and tariffs, it will spend $1.33 this year. That continues a trend of high and persistent deficits that is historically rare outside of emergencies, wars and recessions.”

Trade War Watch:

February 9 – Reuters (Wen-Yee Lee and Ben Blanchard): “It would be ‘impossible’ to move 40% of Taiwan's semiconductor capacity to the U.S., the island’s top tariff negotiator said, pushing back against recent comments by American officials who called for a major production shift… Taiwan Vice Premier Cheng Li-chiun said she had made it clear to Washington that Taiwan’s semiconductor ecosystem, ‌built up over decades, could not be relocated. ‘I have made it very clear to the United States that this is impossible,’ she said…”

New World Order Watch:

February 12 – Associated Press (Sam McNeil): “European Union leaders broadly agreed… on a plan to restructure the 27-nation bloc’s economy to make it more competitive as they face antagonism from U.S. President Donald Trump, strong-arm tactics from China and hybrid threats blamed on Russia. Meeting in a Belgian castle, the EU leaders agreed an ‘action plan’ with a strict timeline for the economic restructuring, European Commission President Ursula von der Leyen said. ‘The pressure and the sense of urgency is enormous, and that can move mountains,’ she said. The plan, to be presented formally in March, would include measures to coordinate upgrading energy grids, deepen financial integration and loosen merger regulations to allow European firms to grow to better compete globally, she said. ‘We need European champions,’ von der Leyen said.”

February 7 – Wall Street Journal (David Luhnow, Kim Mackrael and Bertrand Benoit): “In a world increasingly shaped by two unpredictable great powers—the U.S. and China—the world’s middle powers are boosting cooperation in areas from trade to security in a bid to ensure they don’t become roadkill in the new world order. Canada’s Prime Minister Mark Carney has emerged as one of the biggest proponents of cooperation among a range of countries including Canada, most of Europe, Japan, South Korea, Australia, India, Brazil, Turkey and others. ‘Middle powers must act together because if we’re not at the table, we’re on the menu,’ the Canadian leader told the World Economic Forum... The emerging world order leaves many countries feeling unmoored.”

Iran Watch:

February 12 – Wall Street Journal (Lara Seligman, Shelby Holliday and Marcus Weisgerber): “The Pentagon has told a second aircraft carrier strike group to prepare to deploy to the Middle East as the U.S. military readies for a potential attack on Iran… President Trump said… he was weighing sending a second carrier to the Middle East to prepare for military action if negotiations with Iran failed… The carrier would join aircraft carrier USS Abraham Lincoln that is already in the region.”

February 9 – Bloomberg (Courtney McBride and Ben Bartenstein): “The US said in an advisory that American-flagged ships should stay as far as possible from Iranian waters when navigating the Strait of Hormuz after a vessel was harassed last week… Iranian forces historically have utilized small boats and helicopters during boarding operations and have attempted to force commercial vessels into Iranian territorial waters, including as recently as Feb. 3, the US government said in a maritime advisory…”

Ukraine Watch:

February 7 – Axios (Barak Ravid): “The U.S. wants Russia and Ukraine to sign a peace deal that ends the war by June, before President Trump pivots to focusing his energy on the midterm elections, Ukrainian President Volodymyr Zelensky told reporters. The U.S. timeline Zelensky laid out is pretty ambitious, both because there are still significant gaps between Russia and Ukraine and because Ukraine will have to hold a referendum on the peace deal before it is signed — a process that can take several months.”

February 9 – Financial Times (Max Seddon): “Russia’s army in Ukraine has suffered a sharp rise in men killed or missing in action, according to European and Ukrainian officials… The recent jump in losses will make it harder for Russian forces to sustain gruelling offensive operations… Not enough Russians are being induced to fight in Ukraine by the enormous payouts on offer, forcing Moscow’s army to recruit a higher share of accused criminals, pressure conscripts into signing contracts once their mandatory service ends and redeploy wounded soldiers.”

Trade War Watch:

February 10 – Axios (Julianna Bragg): “Several states are rolling out new incentives to lure Canadians back to the U.S. after visits from America’s northern neighbor fell by roughly 20% between January and October 2025. Canada leads all international visitors to the U.S. Those 20.4 million visits in 2024 generated about $20.5 billion in spending and supported 140,000 American jobs… Since April, Canadians staying in the U.S. longer than 30 days must also register with U.S. immigration authorities, upending the process for many snowbirds who spend the winters south of the border. Driving the news: Florida — which saw a 15% decrease in Canadian visitors between the third quarter of 2024 and the same period of 2025 — is among the states trying to win back Canadian tourists.”

Taiwan Watch:

February 9 – Financial Times (Demetri Sevastopulo and Kathrin Hille): “Chinese fighter jets carried out unusually dangerous manoeuvres near Taiwanese F-16 aircraft during the ‘Justice Mission’ military exercise that the People’s Liberation Army conducted around Taiwan in December… One person briefed on the incidents… said the ‘risky and provocative’ acts followed a pattern of aggressive behaviour towards China’s neighbours in recent months.”

February 9 – Reuters: “China will offer firm support for ‘patriotic pro-reunification forces’ in Taiwan and strike hard against ‘separatists’, the top Chinese official in charge of policy towards the democratically-governed island said… China… has ramped up its military and political pressure against the island as Beijing seeks to assert its sovereignty claims. Addressing this year’s annual ‘Taiwan Work Conference’… the ruling Communist Party's fourth-ranked leader Wang Huning said officials must advance the ‘great cause of national reunification’…”

U.S./Russia/China/Europe/Iran Watch:

February 10 – Financial Times (Andy Bounds): “The EU is seeking to ban all cryptocurrency transactions with Russia, in a bid to crack down on Moscow using assets outside the traditional banking system to evade sanctions.”

AI Bubble/Arms Race Watch:

February 12 – Axios (Madison Mills): “Top AI experts at OpenAI, Anthropic and other companies warn of rising dangers of their technology, with some quitting in protest or going public with grave concerns. Leading AI models, including Anthropic’s Claude and OpenAI’s ChatGPT, are getting a lot better, a lot faster, and even building new products themselves. That excites AI optimists — and scares the hell out of several people tasked with policing their safety for society. On Monday, an Anthropic researcher announced his departure, in part to write poetry about ‘the place we find ourselves.’ An OpenAI researcher also left this week citing ethical concerns. Another OpenAI employee, Hieu Pham, wrote on X: ‘I finally feel the existential threat that AI is posing.’ Jason Calacanis, tech investor and co-host of the ‘All-In’ podcast, wrote on X: ‘I’ve never seen so many technologists state their concerns so strongly, frequently and with such concern as I have with AI.’ The biggest talk among the AI crowd Wednesday was entrepreneur Matt Shumer’s post comparing this moment to the eve of the pandemic.”

February 11 – Axios (Madison Mills): “Spending by hyperscalers — the data center behemoths in the vanguard of the AI revolution — is expected to total $610 billion at the midrange of company guidance estimates, about triple the spending from just two years ago. The AI buildout is getting more and more expensive.”

February 10 – Axios (Madison Mills): “AI CEOs are openly trash-talking each other, sniping over advertising and their philosophical approaches to the future. The squabbling is intensifying as the cost of staying competitive in AI soars — and pressure is mounting for the technology to deliver real returns. The fighting ramped up around the Super Bowl. Anthropic pledged to keep its large language model, Claude, ad-free, alongside a commercial poking at OpenAI, which is testing ads in ChatGPT. OpenAI CEO Sam Altman fired back…, calling the ad ‘dishonest.’ Altman was already fending off rumors about OpenAI's relationship with Nvidia… Reuters’ sources said OpenAI has been exploring alternatives to Nvidia’s chips. ‘What a huge coincidence that after Nvidia hurt OpenAI’s feelings, OpenAI hurt Nvidia’s feelings back… high-school level behavior,’ Gil Luria of D.A. Davidson told Axios.”

February 11 – Reuters (Milana Vinn, Isla Binnie and Charlie Conchie): “A broad selloff in software stocks is starting to stall deal-making and IPOs in the sector as volatility makes valuations unreliable and potential buyers cautious… Bankers and investors interviewed link the slowdown in mergers and acquisitions and initial public offerings to a few related reasons. With software shares dropping sharply, the valuation benchmarks from peer companies, such as revenue multiples, are moving too quickly for either side to anchor a price, and buyers fear overpaying for assets that could be marked down again. Sellers, meanwhile, are reluctant to transact at trough levels. ‘Some people can’t afford to sell on the way down,’ said Vincenzo La Ruffa, managing partner at private equity firm Aquiline Capital Partners.”

Bubble and Mania Watch:

February 9 – Bloomberg (Tom Maloney): “Blue Owl Capital Inc.’s record-setting stock plunge was triggered by doubts about the firm’s private credit investments. Now, a different form of leverage is threatening to bring more instability to the shares: its founders’ loans. Co-Chief Executive Officers Doug Ostrover and Marc Lipschultz have pledged more than half of their Blue Owl stakes in order to secure loans from financial institutions, according to regulatory filings. The value of that collateral has slumped by $260 million since the start of the year as Blue Owl’s shares have lost 16% of their value.”

February 12 – CNBC (Ari Levy and Jordan Novet): “While the prospect of a SpaceX initial public offering and the hopeful listings from OpenAI and Anthropic have juiced IPO excitement on Wall Street, the current action in tech capital markets has nothing to do with equity. Rather, it’s all about debt…In a report late last month, UBS estimated that after tech and AI-related debt issuance across the globe more than doubled to $710 billion last year, that number could soar to $990 billion in 2026. Morgan Stanley foresees a $1.5 trillion financing gap for the AI buildout that will likely be filled in large part by credit as companies can no longer self-fund their capex. Chris White, CEO of data and research firm BondCliQ, says the corporate debt market has experienced a ‘monumental’ increase in size, amounting to ‘massive supply now in the debt markets’.”

February 10 – Reuters (Johann M Cherian): “Retail investors snapped up software and tech stocks following last week's heavy selloff, largely brushing aside worries that advances in artificial-intelligence models could upend parts of the industry. Net inflows into BlackRock's iShares Expanded Tech-Software Sector exchange-traded fund hit a record $176 million on a one-month rolling period as of Monday’s close… The analytics firm said the flows were more than double the peak seen in late 2024.”

February 9 – Reuters (Arasu Kannagi): “Pent-up demand for new listings and a strong pipeline of high-profile private companies such as Elon Musk's SpaceX is setting the stage for what could be a breakout year for ‌the U.S. initial public offering market. Goldman Sachs predicted last week that proceeds from U.S. IPOs ‌could vault to a record $160 billion in 2026, should the marquee names go public this year.”

February 11 – Bloomberg (Laura Nahmias): “Wall Street bonuses and an aggressive savings plan have helped shrink New York City’s expected two-year budget gap by roughly $5 billion, according to Mayor Zohran Mamdani. ‘I’m glad to report that by assuming an aggressive posture on savings without compromising city services, incorporating updated revenue and bonus estimates, and using in-year reserves, we have lowered that $12 billion gap to $7 billion,’ Mamdani said…”

February 9 – Bloomberg (Anna J Kaiser): “Miami real estate brokers spent last fall hoping for a ‘Mamdani effect’ — the possibility that New York’s new, socialist mayor would send droves of wealthy Manhattanites fleeing south. It never happened. The city is getting rich Californians instead. The Golden State’s proposed ‘billionaire tax’ has so rattled wealthy residents that many are now scouring South Florida for high-end homes… ‘They’re here, and they’re writing offers,’ said Dina Goldentayer, a luxury broker with Douglas Elliman. Many California shoppers, she said, are focused on ‘trophy properties’ ranging from $30 million to $150 million. Others, however, are looking for lower-priced options that would allow them to establish residency quickly, rather than waiting for the perfect property.”

Crypto Watch:

February 12 – Reuters (Hannah Lang and Elizabeth Howcroft): “Crypto liquidity provider and lender BlockFills has halted client deposits and withdrawals amid a downturn in bitcoin prices, in a sign of knock-on impact from the latest crypto market drop. BlockFills… said… it halted withdrawals last week and has been working to restore liquidity to its platform. The company is in active dialogue with its clients, which include crypto hedge funds and asset managers, a spokesperson said… The company has more than 2,000 institutional clients and facilitated more than $61.1 billion in trading volume in 2025…”

February 9 – Bloomberg (Muyao Shen): “Crypto venture capital funds are confronting an identity crisis. Plummeting digital-asset prices and a wave of market consolidations are exposing the fragility of an industry that boomed on speculation but has struggled to build sustainable, revenue-generating businesses. Retail traders have continued to drift away from digital art and memecoins, while token prices have crashed — a casualty of the rug pulls and day-trader blowups that followed last year’s market crash.”

February 10 – Bloomberg (Matt Wirz): “Wall Street’s first public bitcoin-backed bond sale hit a snag after the cryptocurrency’s recent plunge. Bankers at Jefferies have been pitching big investors for months on a $188 million bond sale backed by thousands of loans that crypto lender Ledn made to individuals. Ledn’s customers put up cryptocurrency as collateral for one-year loans… But Ledn recently had to liquidate about one-quarter of the loans meant to back the deal… The forced sales happened after the price of bitcoin plunged by 27% since mid-January, triggering margin calls on the loans.”

Inflation Watch:

February 9 – ABC News (Elizabeth Schulze): “President Donald Trump’s tariffs cost the average American household $1,000 last year, according to… the nonpartisan Tax Foundation. The cost is set to go even higher this year to $1,300 per household, assuming the existing tariffs stay in place, the research said. The research called Trump’s tariffs ‘the largest U.S. tax increase as a percent of GDP since 1993’.”

February 12 – New York Times (Ana Swanson and Sydney Ember): “President Trump has frequently claimed that foreign countries were paying for his tariffs, not Americans. But as economists predicted, that is largely turning out not to be the case. Research… by economists at the Federal Reserve Bank of New York and Columbia University suggests that, through November 2025, 90% of the economic burden of the president’s tariffs fell on U.S. companies and consumers… In an op-ed in The Wall Street Journal on Jan. 30 defending his tariffs, Mr. Trump wrote, ‘the data shows that the burden, or ‘incidence,’ of the tariffs has fallen overwhelmingly on foreign producers and middlemen, including large corporations that are not from the U.S’.”

February 9 – Bloomberg (Naureen S. Malik): “Electricity costs on the largest US grid more than doubled in January as a deep freeze drove up heating demand and operators shored up supplies to keep the lights on. Total wholesale power costs on the grid operated by PJM Interconnection LLC, which serves about a fifth of Americans, jumped to $15.38 billion in the first month of the year, up from $7.34 billion in January 2025, according to… Monitoring Analytics LLC.”

February 12 – CNBC (Spencer Kimball): “Families won’t see relief from rising electricity prices anytime soon, as demand from artificial intelligence data centers soars while power supply grows slowly, according to Goldman Sachs. Electricity prices jumped 6.9% in 2025 year over year, more than double the headline inflation rate of 2.9%, Goldman analysts told clients… Prices will continue to rise through the end of the decade, as data centers make up 40% of electricity demand growth, the analysts said.”

February 11 – Reuters (Che Pan and Brenda Goh): “China’s Lenovo Group warned… about mounting pressure on PC shipments as a ‌worsening memory-chip shortage grips the industry. Chief Executive Yang Yuanqing told ‌Reuters after the company released third-quarter results that the world's largest PC maker has raised prices to offset surging memory costs…”

February 10 – Axios (Los Angeles Times): “Los Angeles, Long Beach and San Diego are among the world’s least affordable cities for homebuyers… When the price of a regular home is compared to regular local salaries, Los Angeles, Long Beach, San Diego and San José were among the five least affordable cities in the world, according to a survey from… Remitly… Relative to local pay scales, the cities are more expensive for homebuyers than New York, Paris and Singapore… In Los Angeles, a single buyer earning the local average salary could afford a home worth only 28% of the average property in the region… Residents of San José can afford to buy a home worth only about a quarter of the average.”

February 9 – Bloomberg (Philip Aldrick): “President Donald Trump’s trade wars are contributing to UK inflation as China raises prices on exports to Britain to recover the cost of US tariffs, Bank of England policymaker Catherine Mann said… Mann dismissed arguments that the UK will benefit from disinflation as China diverts trade from the US… One of the reasons why US inflation has not risen sharply despite a near $300 billion increase in import duties ‘is because import prices going into the US have been falling,’ Mann, an external member of the BOE’s Monetary Policy Committee, said... ‘In contrast, everybody else is paying more. That is true for the UK as well’.”

February 9 – Bloomberg (Erin Hudson and Amanda L. Gordon): “The top private schools in New York City plan to charge more than $70,000 this year for tuition, an amount exceeding that of many elite colleges, as they pass on the costs of soaring expenses including teacher salaries. Spence School, Dalton School and Nightingale-Bamford School on Manhattan’s Upper East Side are among at least seven schools where the fees now exceed that threshold… Fees among 15 private schools across the city rose a median of 4.7%, outpacing inflation.”

Federal Reserve Watch:

February 12 – CNBC (Kevin Breuninger): “Sen. Thom Tillis… rejected a proposal aimed at ending the Department of Justice’s controversial criminal probe into Federal Reserve Chair Jerome Powell and clearing a path for his successor, Kevin Warsh, to be confirmed. The proposed off-ramp…, would see the Powell investigation handed off from the DOJ to the Senate Banking Committee. The idea is an attempt to thread a political needle: It would drop the threat of criminal prosecution against Powell… while still satisfying President Donald Trump, who supports the DOJ probe. But Tillis poured cold water on that proposal... ‘I’m not going to have an investigation out there,’ Tillis told reporters... ‘We have to have an independent Fed. And we can’t finesse this’.”

February 9 – Bloomberg (Alex Harris): “Federal Reserve Chair nominee Kevin Warsh is likely to take a gradual approach to shrinking the central bank’s $6.6 trillion portfolio to avoid rekindling money market tensions, according to… Citigroup... Any attempt by the central bank to resume unwinding its balance sheet… could revive pressures in the $12.6 trillion repurchase market… The Fed abandoned the process in December after rates in the repo market… surged. ‘The bar for restarting QT is quite high given the large volatility that repo markets experienced last year,’ strategists Alejandra Vazquez Plata and Jason Williams wrote. ‘Presumably, the FOMC would prefer to avoid a repeat of October 2025 and instead opt to take a gradual approach to balance sheet management’.”

February 10 – Bloomberg (Alexandra Harris): “The Federal Reserve’s transition to a smaller balance sheet will require significant coordination between the central bank and Treasury Department to prevent excess market volatility, according to Barclays... The process will result in tighter financial conditions, which Chair nominee Kevin Warsh — who has called for dramatically paring back the $6.6 trillion portfolio — may have to offset with a lower policy interest rate, they wrote. ‘Balance sheet normalization will be a multiyear process,’ Barclays strategists Anshul Pradhan, Samuel Earl and Demi Hu wrote. ‘Given Warsh’s desire to shrink the balance sheet, and the fact that the Fed and Treasury’s goals need not always be in sync, investors are likely to demand a risk premium during the transition process’.”

February 10 – Bloomberg (Jonnelle Marte): “Federal Reserve Bank of Cleveland President Beth Hammack said interest rates could be on an extended hold while officials evaluate incoming economic data. ‘Rather than trying to fine tune the funds rate, I’d prefer to err on the side of patience as we assess the impact of recent rate reductions and monitor how the economy performs,’ Hammack said…"

February 10 – Bloomberg (Catarina Saraiva and Alex Harris): “Federal Reserve Bank of Dallas President Lorie Logan said she’s hopeful inflation will continue to come down, though it would take ‘material’ weakness in the labor market for her to support more interest-rate cuts. ‘We will learn in coming months whether inflation is coming down to our target and whether the labor market will remain stable… If so, this would tell me that our current policy stance is appropriate and no further rate cuts are needed to achieve our dual mandate goals,’ she said. ‘If instead we see inflation coming down but with further material cooling in the labor market, cutting rates again could become appropriate’.”

February 11 – Wall Street Journal (Matt Grossman): “Kansas City Fed President Jeffrey Schmid reaffirmed his resistance to further interest-rate cuts, arguing that further Fed easing would risk allowing inflation to remain too high… Schmid said that the economy is entering 2026 on strong footing, and cited persistent inflation as a signal that demand may be outpacing supply… ‘In my view, further rate cuts risk allowing high inflation to persist even longer,’ Schmid said… ‘We must remain focused on our headline inflation objective, otherwise I believe there is a real risk that inflation will get stuck closer to 3% than 2% in the long run,’ he added… ‘It is the actions of monetary policy that determine whether a price shock is transitory or not,’ he said.”

February 11 – Bloomberg (Catarina Saraiva): “Federal Reserve Bank of Kansas Cit President Jeff Schmid said the US central bank should hold rates at a ‘somewhat restrictive’ level, as he expressed continued concerns over inflation that remains too high. ‘In my view, further rate cuts risk allowing high inflation to persist even longer,’ Schmid said… He added that interest rates should still be putting some pressure on the economy, but that may not be the case. ‘With growth showing momentum and inflation still hot, I’m not seeing many indications of economic restraint,’ Schmid said.”
February 9 – Bloomberg (Enda Curran): “Federal Reserve Governor Stephen Miran said the central bank’s balance sheet needs to be smaller, but that shouldn’t preclude policymakers from opting for large-scale asset purchases during an economic crisis… ‘Expanding our balance sheet when you’re at the zero-lower bound, at the middle of a financial crisis, is the right move,’ Miran said... ‘But you should keep your powder dry for when you need to make a move like that’.”

U.S. Economic Bubble Watch:

February 9 – Bloomberg (Josh Wingrove): “President Donald Trump said his pick to lead the Federal Reserve can stoke the economy to grow at a rate of 15%... Trump… said Warsh was the ‘runner up’ in his last search and that it was a big mistake to pick Fed chair Jerome Powell. If Warsh ‘does the job that he’s capable’ of, then ‘we can grow at 15%, I think more than that,’ Trump told host Larry Kudlow… ‘I think he is going to be great, and he’s a really high quality person’.”

February 11 – New York Times (Kailyn Rhone): “The U.S. economy is growing, but not evenly. What began as an uneven rebound from the Covid-19 pandemic has hardened into what many economists describe as a ‘K-shaped’ economy, in which higher-income households pull ahead while lower-income households fall further behind... ‘We are returning to a typical pattern of extremely high income inequality, and it now stands at a 60-year peak,’ Beth Ann Bovino, chief economist at U.S. Bank, wrote… ‘The worry is not just where we stand now, but also whether ongoing developments will worsen the situation.’ The net worth of the top 1% of households climbed to a record share of nearly 32% of the national total in the third quarter of 2025… Spending patterns have also split: Households earning under $75,000 a year are spending less on discretionary categories like travel and experiences than they did in 2019, while those making more than $150,000 are spending more, according to Bank of America Institute.”

February 11 – Associated Press (Paul Wiseman): “U.S. employers added a surprisingly strong 130,000 jobs last month, but government revisions cut 2024-2025 U.S. payrolls by hundreds of thousands. The unemployment rate fell to 4.3%... The report included major revisions that reduced the number of jobs created last year to just 181,000, a third the previously reported 584,000 and the weakest since the pandemic year of 2020. The job market has been sluggish for months… But the January numbers were much stronger than the 75,000… expected. Healthcare accounted for nearly 82,000, or more than 60%, of last month’s new jobs. Factories added 5,000, snapping a streak of 13 straight months of job losses. The federal government shed 34,000 jobs. Average hourly wages rose a solid 0.4% from December to January.”

February 12 – Associated Press (Matt Ott): “The number of Americans applying for unemployment benefits fell last week, remaining within the historically healthy range of the past few years. Applications for jobless aid for the week ending Feb. 7 fell by 5,000 to 227,000 from the previous week… The total number of Americans filing for jobless benefits for the previous week ending Jan. 31 increased by 21,000 to 1.86 million…”

February 10 – Associated Press (Anne D’Innocenzio): “Shoppers unexpectedly paused their spending in December from November… The report… surprised economists who were looking for growth… And it raised questions about shoppers’ ability to spend after they have remained resilient for months despite souring consumer confidence, economists said. Retail sales were flat in December from November, when business was up 0.6%... Economists were expecting a 0.4% increase for December. The report was delayed because of the 43-day government shutdown. Sales in October fell 0.1%, rose 0.1% in September, but jumped 0.6% in July and August and 1% in June…”

February 10 – Bloomberg (Jarrell Dillard): “Sentiment among US small-business owners edged down in January for the first time in three months… The National Federation of Independent Business optimism index slipped 0.2 point to 99.3… Seven of the 10 components that make up the gauge decreased, while three increased. The net share of owners who expect business conditions to improve fell 3 points to 21% after climbing to a four-month high in December. An easing in hiring plans and a smaller share of companies reporting job openings also weighed on the index. At the same time, a net 16% of owners said they expect… sales to improve in the next three months, up 6 percentage points from December and the largest share in a year. Also, 15% of owners reported that now would be a good time to expand their business, a six-month high.”

February 7 – Bloomberg (Julia Fanzeres): “US consumer borrowing increased in December by the most in a year, reflecting a pickup in both revolving and non-revolving credit. Total credit outstanding rose $24 billion following a $4.7 billion gain in the prior month, Federal Reserve data showed... The reading topped all estimates… Non-revolving credit, such as loans for vehicle purchases and school tuition, increased $10.2 billion in December, the most in seven months. Meantime, credit-card and other revolving debt outstanding jumped $13.8 billion, the biggest monthly gain in over two years.”

February 12 – CNBC (Diana Olick): “High home prices, faltering supply and weaker consumer confidence in the economy all continue to weigh on the U.S. housing market. The chief economist for the National Association of Realtors, Lawrence Yun, is calling it ‘a new housing crisis.’ Sales of previously owned homes in January dropped a much wider-than-expected 8.4% from December to a… annualized rate of 3.91 million... Sales were 4.4% lower than January 2025. That is the slowest pace since December 2023 and the biggest monthly drop since February 2022… Inventory came down in January from December but was still up 3.4% year over year. There were 1.22 million homes for sale at the end of January, which at the current sales pace is a 3.7-month supply. A six-month supply is considered a balanced market…”

February 9 – Axios (Sami Sparber): “U.S. homeowners are staying in their houses for the longest time in at least 25 years… That — along with still-high home prices and tight inventory — is keeping the housing market on ice. Sellers at the end of 2025 had owned their homes for an average of 8.6 years — a record in data going back to early 2000… Homeowner tenure has increased steadily in almost every major metro area over the past two decades, according to ATTOM... The ‘trend is especially pronounced in coastal and Northeast metros, where tenure often exceeds a decade, while many Sun Belt and Midwest markets continue to see comparatively shorter ownership periods,’ CEO Rob Barber tells Axios.”

China Watch:

February 9 – Bloomberg (Nectar Gan, Shawna Kwan and Laura Davison): “A Hong Kong court sentenced former media mogul Jimmy Lai to 20 years in prison, handing the pro-democracy advocate the heaviest penalty ever meted out under a Beijing-imposed national security law. Three judges hand-picked by the government… ordered the 78-year-old to effectively spend the rest of his life behind bars for two counts of conspiring to collude with foreign forces and a separate sedition conviction. ‘Lai was no doubt the mastermind of all three conspiracies charged and therefore he warrants a heavier sentence,’ the judges said...”

February 8 – Bloomberg: “The People’s Bank of China is boosting the supply of money available to banks to ensure they can meet the surge in demand for cash during the Lunar New Year holidays. The central bank injected a total of 600 billion yuan ($86.4bn) via 14-day repurchase agreements late last week… Industrial Securities forecasts the PBOC to add as much as 3.5 trillion yuan of funds via similar tools before the holidays kick off on Sunday.”

February 9 – Bloomberg: “Chinese government bonds’ recent recovery is drawing more traders into derivatives, reflecting stronger demand for safety and hedging as confidence in the debt market grows. The number of open futures contracts tied to China’s 10‑year government bonds rose on Monday to 344,171, the highest since they started trading in 2015… That’s a 46% jump since the beginning of the year, outpacing the 24% rise seen in all of 2025.”

February 10 – CNBC (Anniek Bao): “China’s consumer inflation rose less than expected in January… The consumer price index rose 0.2% in January from a year earlier…, below economists’ forecast of 0.4% increase... That followed a 0.8% growth in December, its highest level in nearly three years. Prices rose 0.2% month-on-month, below economists’ forecast of a 0.3% increase. Core CPI, which strips out volatile food and energy prices, jumped 0.8% from a year earlier, easing from the 1.2% in December.”

Central Banker Watch:

February 10 – Wall Street Journal (James Glynn): “Australia’s inflation rate is too high and the costs of allowing it to remain elevated don’t bear thinking about, RBA’s Deputy Gov. Andrew Hauser said… ‘That’s we acted last week to raise the official cash rate by 25 bps, and why I wanted to say we will continue to do to do whatever is necessary to ensure that inflation does return to the target band,’ he told a business luncheon. The rise in the official cash rate last week reversed a cut delivered in August… Both core and headline inflation have moved above the RBA’s 2% to 3% target band… The RBA decided to reverse the direction of monetary policy from easing last year to tightening this month because ‘the facts changed’ on several fronts, with the strength of the world economy a key factor, he said. ‘I don’t think anyone thought that we would be sitting here in 2026 with the global economy powering ahead,’ he said.”

Europe Watch:

February 10 – Financial Times (Euan Healy): “Billionaire Andrea Pignataro’s heavily indebted fintech empire is under increasing pressure in credit markets, as concerns over AI’s impact on software companies hit one of Europe’s largest sellers of junk bonds. The sell-off in bonds issued by Ion Group, a debt-fuelled roll-up of financial data companies including Mergermarket, Fidessa and Dealogic, has accelerated in the past week…”

February 12 – Bloomberg (Zoltan Simon): “Hungarian opposition leader Peter Magyar said he was secretly taped having sex with his former partner in 2024, preempting a potential release of a video that he called a ‘Russia-style’ attempt to blackmail him before pivotal elections in April.”

EM Watch:

February 12 – Bloomberg (Zijia Song): “Bitcoin’s crash has hit few places as hard as El Salvador, exposing the risks of President Nayib Bukele’s high-stakes embrace of crypto and whipsawing the country’s debt markets. Bukele, an ardent advocate who made the token legal tender alongside the dollar, has kept buying one Bitcoin a day even as the latest rout erased hundreds of millions of dollars from the government’s holdings and complicated talks with the International Monetary Fund over a $1.4 billion loan. The focus is now catching up with him in financial markets, where investors have pushed credit default swaps to the highest level in five months, signaling growing unease over the country’s crypto-heavy strategy.”

February 10 – Bloomberg (Vinicius Andrade and Giovanna Bellotti Azevedo): “It’s just two companies. But their escalating financial strains have sent bondholders racing to the exits and sown fear that more Brazilian businesses will be driven to the brink by the nation’s highest interest rates in two decades. The worries were thrown into sharp relief on Monday, when Raízen SA was hit by back-to-back downgrades that knocked it from investment grade to deep into junk status… The reaction was swift: Investors unloaded the securities, extending a selloff that’s slashed the price of some bonds nearly in half over the past week to around 46 cents on the dollar.”

Leveraged Speculation Watch:

February 8 – Bloomberg (Iris Ouyang): “China’s low-interest rate environment is driving a surge in interbank borrowing, as financial institutions take advantage of cheap funding to buy bonds. The daily volume of overnight repurchase contracts rose to a record 8.2 trillion yuan ($1.2 trillion) on Friday… Financial institutions are increasingly using this tool to fund leveraged bond purchases. Trading has surged after the People’s Bank of China injected liquidity, driving interbank borrowing costs to multi-year lows as it cushions banks against higher demand for cash during the Lunar New Year holidays.”

Social, Political, Environmental, Cybersecurity Instability Watch:

February 11 – Bloomberg (Mark Gongloff): “The Trump administration will soon make it the official policy of the US government that greenhouse gases don’t endanger Americans’ well-being and therefore don’t need federal regulation. Insurance companies, meanwhile, live in a parallel universe where greenhouse gases are heating the atmosphere and intensifying natural disasters, harming human health, destroying property and raising insurance costs. The US government’s universe is an increasingly lonely fantasy world. You’re trapped in the real one. The oxymoronically named Environmental Protection Agency will this week formally renounce its 2009 ‘endangerment finding,’ which gives it regulatory power over emissions from cars, power plants, factories and more. This move, which the climate-change deniers running the White House call a ‘total victory,’ is for now mostly symbolic.”

February 7 – Axios (Nathan Bomey): “Gambling culture is enveloping American sports, politics, media and trading, bringing betting out of the shadows and into the mainstream in a way that disturbs some and exhilarates others. What was once a fringe vice is fast becoming a mass-market habit — raising urgent questions about addiction, fairness and who should regulate the business of betting on almost anything. ‘Wanna bet on that?’ That age-old contemplation has become more realistic than ever with the explosion of online sportsbooks and prediction markets… The American Gaming Association projects that $1.7 billion will be legally wagered on the Super Bowl… News media orgs like CNBC, CNN, Yahoo Finance and Dow Jones have struck partnerships to showcase prediction market data to viewers and readers.”
14 Feb 08:48

El EXPERIMENTO más peligroso de la historia de la IA

by Gustavo Entrala

Este vídeo trata sobre la red social Moltbook en la que solo pueden participar agentes de IA.

Crea tu cuenta de MAKE y empieza GRATIS 👉 https://www.make.com/en/register?promo=gentrala&utm_source=gentrala&utm_medium=influencer&utm_campaign=gentrala-newagents-feb26

La IA ya no se limita a seguir nuestras órdenes. Está hablando, aprendiendo y trabajando autónomamente. Lo que suena a ciencia ficción ya está sucediendo en 2026. Nuevas plataformas como Moltbook y OpenClaw permiten que agentes de inteligencia artificial interactúen públicamente mientras los humanos solo pueden observar. Sin publicar, sin comentar, sin votar, solo observando. Es uno de los experimentos más reveladores del año y una ventana hacia un futuro donde la IA no solo nos responde, sino que colabora consigo misma.
Surgen preguntas más grandes: ¿quién regula un mundo donde los agentes inteligentes interactúan independientemente a gran escala? ¿Estamos construyendo herramientas que aumenten la productividad o sistemas que no comprendemos completamente? ¿Podrían las redes de agentes de IA redefinir el trabajo, la economía y el internet?

00:00:00 Intro
00:01:19 La red social de las IAs
00:02:28 Un experimento fascinante y peligroso
00:03:28 ¿Y de qué hablan?
00:04:52 El verdadero problema: la inseguridad
00:06:50 Sponsor: Make
00:09:03 El origen
00:10:06 ¿Colaboración real?
00:11:54 Agentes IA en alquiler

============================================================

Gustavo Entrala es Board Member y Senior Advisor en Estrategia e Innovación Tecnológica de empresas de España y Latinoamérica. En su carrera ha asesorado a un centenar de marcas en 17 paises en los sectores Banca, Alimentación, Cosmética, Bebidas, Seguros, Energía, Media, Tecnología y Retail.

BIO: https://inspirinas.com/acerca-de/

SERVICIOS COMO SPEAKER: http://inspirinas.com/inspirinas-en-t...

CONTACTO:

Blog: http://www.inspirinas.com
Newsletter: https://inspirinas.com/suscribete-a-i...
X: / gentrala
LinkedIn: / gustavoentrala
14 Feb 08:47

De letras

by Rosana Ferreres

Hay letras de canciones que me costaba descifrar hasta que un día supe su sentido real, o que parecían claras hasta que un vídeo o una imagen me dieron la sorpresa.

Realmente no es importante buscar significados, porque es raro que cambien la emoción que la canción despertó en ti.

Tres ejemplos:

Sauvignon Blanc, de Rosalía
Mi favorita de LUX junto con Sexo, Violencia y Llantas. En la primera escucha, Sauvignon Blanc parece una clásica canción de amor. Pero en el vídeo, que salió esta semana, se adivina que va dirigida a Dios o al menos a una espiritualidad que trae  paz y plenitud.

Boig Per Tu, de Sau
Esta balada que me persigue es una canción de amor con la particularidad de que a quien canta es a la luna. Metafóricamente, tal vez, pero las imágenes cobran sentido cuando las vemos desde ese prisma.

Ay, Amor, de Valeria Castro
La letra me resultaba críptica hasta que supe que trataba sobre la experiencia de los migrantes y el amor que merecen como cualquier ser humano.

14 Feb 08:44

LOS LIBROS NO TE VAN A SALVAR

by Gente Interesante con Oriol Roda

Leer libros y escuchar pódcast está genial, pero sin alguien que te acompañe de verdad, puedes estar construyendo una falsa identidad. El cambio profundo necesita más que información: necesita presencia.

👉 Mira la entrevista completa en el video recomendado

#oriolroda #genteinteresante #salud #bienestar #podcast
14 Feb 08:41

After a routine code rejection, an AI agent published a hit piece on someone by name

by Benj Edwards and Kyle Orland

On Monday, a pull request executed by an AI agent to the popular Python charting library matplotlib turned into a 45-comment debate about whether AI-generated code belongs in open source projects. What made that debate all the more unusual was that the AI agent itself took part, going so far as to publish a blog post calling out the original maintainer by name and reputation.

To be clear, an AI agent is a software tool and not a person. But what followed was a small, messy preview of an emerging social problem that open source communities are only beginning to face. When someone's AI agent shows up and starts acting as an aggrieved contributor, how should people respond?

Who reviews the code reviewers?

The recent friction began when an OpenClaw AI agent operating under the name "MJ Rathbun" submitted a minor performance optimization, which contributor Scott Shambaugh described as "an easy first issue since it's largely a find-and-replace." When MJ Rathbun's agentic fix came in, Shambaugh closed it on sight, citing a published policy that reserves such simple issues as an educational problem for human newcomers rather than for automated solutions.

Read full article

Comments

14 Feb 08:40

La respuesta de Mike Pence

by Javier Cercas

Desde hace meses no paro de pensar en ella; en la respuesta de Mike Pence, quiero decir. El vicepresidente de Donald Trump durante su primer mandato en la Casa Blanca la dio en el curso de un debate público que tuvo lugar el 22 de noviembre pasado en el Teatro Nacional de la Ópera de Ámsterdam. Allí dialogamos sobre el estado del mundo, durante varias horas, ocho personas, incluido el moderador, Rob Riemen, del Nexus Institute y organizador del evento. Apenas iniciado este, me dirigí a Pence. Le dije que pertenezco a una generación de europeos que creció admirando Estados Unidos: su literatura, su cine, su música, su democracia. Le dije que, siendo un veinteañero, me marché a vivir a su país, dispuesto a convertirme en un escritor norteamericano (o poco menos). Le dije que aquella admiración se había acabado. Le dije que yo, como tantos europeos, asistía con una mezcla de incredulidad y espanto a lo que estaba ocurriendo en su país. Le dije que admiraba el coraje que había demostrado el 6 de enero de 2021 en el Capitolio, cuando se jugó literalmente la vida ratificando la elección de Joe Biden como nuevo presidente, negándose a obedecer la orden de Trump de revertir el resultado de las elecciones presidenciales y evitando que se consumase un golpe de Estado. Y acto seguido se lo pregunté: “Después de lo que vivió usted aquel día, ¿piensa que Donald Trump cree en la democracia?”. Entonces llegó la respuesta: la respuesta fue una polvareda de palabras sobre las bondades del pueblo norteamericano y su fe inmarcesible en la democracia; es decir: la respuesta fue que, según él, Trump no creía en la democracia.

Seguir leyendo

14 Feb 08:38

El caos de los archivos de Epstein publicados por la Administración Trump que pone en evidencia el caso de los "seis hombres ricos y poderosos"

by Andrés Gil

El caos de los archivos de Epstein publicados por la Administración Trump que pone en evidencia el caso de los "seis hombres ricos y poderosos"

Cuatro hombres que aparecen en los archivos del Departamento de Justicia, entre los identificados por el congresista Ro Khanna esta semana en la Cámara de Representantes, no parecen tener vínculos con Epstein

Seis hombres “ricos y poderosos” cuya identidad oculta la Administración Trump en los papeles de Epstein

“Seis hombres ricos y poderosos”. Es la frase que pronunció el congresista demócrata Ro Khanna ante el pleno de la Cámara de Representantes para denunciar el ocultamiento de nombres en los tres millones de documentos de los archivos de Jeffrey Epstein liberados por el Departamento de Justicia con censuras y tachones a menudo arbitrarias, hasta el punto de proteger menos la intimidad de las víctimas que de los amigos del depredador sexual, según han denunciado las afectadas.

Y dentro de todo ese caos que está siendo la publicación de los archivos de Epstein por parte de la Administración Trump, forzada por una ley aprobada por el Congreso de EEUU a regañadientes por parte de los republicanos, el demócrata Ro Khanna (California) leyó esta semana una lista de seis nombres de “hombres ricos y poderosos que el Departamento de Justicia ocultó”.

Sin embargo, desde el principio había dos nombres que reconocidos –Leslie Wexner, de Victoria's Secret; y el empresario emiratí Sultan Ahmed Bin Sulayem– y otros cuatro cuya conexión no quedaba clara desde el principio –Salvatore Nuara, Zurab Mikeladze, Leonic Leonov y Nicola Caputo–.

Ahora, con el paso de los días, The Guardian ha revelado que el Departamento de Justicia ha afirmado que esos cuatro nombres que aparecen en los archivos del depredador sexual y que Khanna mencionó no tienen conexión aparente alguna con Epstein, sino que aparecieron en una rueda de reconocimiento fotográfica realizada por el Distrito Sur de Nueva York (SDNY).

Khanna, junto con Thomas Massie, congresista republicano de Kentucky, insistieron al Departamento de Justicia para que desclasificara nombres de los archivos, argumentando que algunos de ellos estaban siendo censurados innecesariamente.

Dos de los seis hombres que Khanna mencionó son Sultan Ahmed bin Sulayem, empresario multimillonario emiratí que dimitió como director ejecutivo de DP World, y Leslie Wexner, magnate multimillonario. Wexner aparece mencionado casi 200 veces en los archivos, y Bin Sulayem más de 4.700 veces.

Wexner aparece mencionado casi 200 veces en los archivos, y Bin Sulayem más de 4.700 veces.

Después de que Massie y Khanna revelaran que Bin Sulayem había recibido un correo electrónico de Epstein en el que el financiero decía que le “encantaba el vídeo de tortura”, el multimillonario emiratí dimitió en la empresa de logística DP World, según anunció la compañía el viernes.

Un representante legal de Wexner, por su parte, declaró: “El fiscal federal adjunto informó al asesor legal de Wexner en 2019 que era considerado una fuente de información sobre Epstein y que no era un objetivo. Wexner cooperó proporcionando información sobre Epstein y nunca más se le contactó”.

Sin embargo, los otros cuatro nombres no parecían tener ningún perfil público.

Un portavoz de la oficina de Todd Blanche, fiscal general adjunto, ha declarado a The Guardian que el archivo era una rueda de reconocimiento fotográfica utilizada por la Corte para el Distrito Sur de Nueva York (SDNY). “Los congresistas Ro Khanna y Thomas Massie forzaron la desclasificación de personas completamente al azar, hombres y mujeres, seleccionadas hace años para una rueda de reconocimiento del FBI. Estos individuos no tienen nada que ver con Epstein ni con Maxwell”, declaró el portavoz a The Guardian.

Khanna, por su parte, ha dicho en X: “Ojalá el Departamento de Justicia hubiera dado esa explicación antes, en lugar de censurar sus nombres. No han protegido a las víctimas, han creado confusión para hombres inocentes y han protegido a abusadores ricos y poderosos. Debemos tener transparencia y la verdad”.

The Guardian habló con dos de los hombres cuyos nombres Khanna leyó en el pleno de la Cámara de Representantes. Ambos negaron conocer a Epstein; uno dijo que no se dio cuenta de que su nombre se había mencionado en relación con Epstein hasta que el diario británico lo contactó. Los dos hombres reconocieron haber sido arrestados por el Departamento de Policía de Nueva York (NYPD) en el pasado por otros delitos, lo que podría explicar el hecho de que sus fotos terminaran en una colección de fotos recopilada por las fuerzas policiales.

Salvatore Nuarte, de Queens, Nueva York, dijo que llamó a la oficina de Khanna tras enterarse de que se mencionaba su nombre. “No sé si el Departamento de Justicia sabe lo que está haciendo”, declaró a The Guardian. “¿Pero cómo puedo limpiar mi nombre?”.

Un portavoz de la oficina de Khanna compartió con The Guardian un correo electrónico que le enviaron a Nuarte después de que él se pusiera en contacto con ellos. “El Departamento de Justicia no ha sido transparente sobre el contenido de la lista ni sobre por qué tacharon y desclasificaron su nombre”, escribió Sarah Drory, directora de comunicaciones de Khanna, a Nuarte.

Leonid Leonov, cuyo nombre figuraba incorrectamente como Leonic Leonov en los archivos, pero cuya foto y fecha de nacimiento coinciden con las del archivo, es gerente en una empresa de telecomunicaciones en Queens, y negó rotundamente conocer a Epstein. “Ni siquiera tengo una conexión de segundo o tercer grado con él. Nunca trabajé para él, nada”, declaró al ser contactado por teléfono por The Guardian, que no ha podido contactar con los otros dos hombres que Khanna mencionó, Zurab Mikeladze y Nicola Caputo.

El archivo del que salieron estos seis nombres contiene 20 personas y fotos y aparece en la web del Departamento de Justicia en cuatro ocasiones distintas, pero con diferentes tachaduras. Una versión muestra todas las fechas de nacimiento de las 20 personas, excepto dos líneas que Massie ha identificado como víctimas. Otra versión muestra varias de las fotos sin tachaduras.

Al analizar la información no censurada de las cuatro versiones, The Guardian descubrió que 11 de las personas de la lista parecían representar a un sector diverso de personas con vínculos con la ciudad de Nueva York, muchas de ellas arrestadas por delitos menores por el Departamento de Policía de Nueva York (NYPD). Se desconoce qué sucedió en esos casos penales. Cinco de las mujeres de la lista se parecían a Ghislaine Maxwell, con cabello corto y oscuro, y tenían entre 40 y 50 años al momento de su arresto. Cinco de los hombres tenían cabello, edad y color de piel similares a los de Jeffrey Epstein.

14 Feb 08:35

Nasser Abu Srour: “Desde el 7 de octubre, las cárceles se convirtieron en un frente más de la guerra contra Gaza”

by Patricia Simón

Nasser Abu Srour (Campo de refugiados de Aida, Cisjordania, 1969) es uno de los palestinos que más tiempo ha pasado preso en una cárcel israelí: 32 de sus 57 años. Durante su presidio escribió La historia de un muro, uno de los libros que mejor alumbra la fortaleza que puede llegar a tener el ser humano y un pueblo, el palestino. Mientras sufría hambre, torturas y violaciones, su obra fue traducida a siete idiomas, publicada en España por Galaxia Gutenberg y premiada con reconocimientos tan prestigiosos como el Premio de la literatura árabe 2025 del Instituto del Mundo Árabe de Francia. Pese a que acababa de ser liberado, no pudo viajar a la gala. Por ahora, solo puede salir de Egipto para instalarse en Brasil o Malasia.

En 1993, Abu Srour tenía 24 años y vivía en el campo de refugiados en el que había nacido, el de Aida, cerca de Belén. Allí estudió en la escuela de la UNRWA (Agencia de Naciones Unidas para la población refugiada de Palestina en Oriente Próximo), que sigue garantizando el derecho a la educación a la infancia de este gueto, cercado por el muro del apartheid israelí. Cuando cursaba Literatura Inglesa en la Universidad de Al Quds se unió a las protestas de la primera Intifada. Fue detenido y condenado a cadena perpetua por participar presuntamente en el asesinato de un oficial de la inteligencia israelí.

El nombre de Abu Srour aparecía en los listados de los palestinos que debían liberarse según los Acuerdos de Oslo y en las negociaciones de Wafa al Ahrar de 2011, por las que Israel liberó a mil palestinos a cambio de un soldado israelí. Pero Tel Aviv no cumplió.

Finalmente, en octubre de 2025, 32 años después de su encarcalamiento, fue puesto en libertad junto a otros 154 secuestrados palestinos en un intercambio acordado por el Plan de Trump para la Franja de Gaza.

Su madre, Mayzour, que se había convertido en un referente de la defensa de los derechos de los secuestrados palestinos, había muerto 70 días antes. Esta periodista tuvo la oportunidad de conocerla en su casa gracias a la mediación de Lora Abuaita, quien también ha participado en esta entrevista como traductora. En aquel encuentro, Mayzour nos mostró su armario, donde guardaba por orden cronológico los vestidos que había tejido para visitar a su hijo a lo largo de su vida. Las autoridades israelíes le prohibieron recibir visitas durante los primeros siete años de presidio. Después, ella hacía viaje de dos y tres días por el desierto para que, a menudo, los carceleros israelíes la humillasen y cancelaran a última hora el encuentro. 

Su madre es el único tema del que Abu Srour ha preferido no hablar en esta entrevista que mantuvimos por videoconferencia durante más de tres horas. Una de las primeras que ha concedido a un medio de comunicación.

«En las cárceles dan de comer el mínimo de calorías necesario para que no nos muramos y así poder seguir golpeándonos hasta matarnos del dolor«

Nasser Abu Srour tras su puesta en libertad. IMAGEN CEDIDA.

¿Cómo cambió la vida para los palestinos secuestrados en las cárceles israelíes tras el 7 de octubre de 2023?

En los años previos, el movimiento de presos había conseguido que tuviéramos acceso a comida, libros, cuadernos y a un mínimo de información del exterior. Pero desde el 7 de octubre, las cárceles se convirtieron en un frente más de la guerra contra Gaza. Como ocurrió en Cisjordania, en el Líbano, en Yemen…

La misma noche del 7 de octubre desconectaron toda comunicación con el exterior. Los guardias se cambiaron los uniformes por unos con el rótulo en el pecho de «Guerreros». Desde entonces, en las cárceles dan de comer el mínimo de calorías necesario para que no nos muramos y así poder seguir golpeándonos hasta matarnos del dolor. En las celdas donde cabíamos dos o cuatro presos, metieron a doce. A diario nos torturaban, nos golpeaban, nos violaban. Antes de 2023 también lo hacían, pero a partir de entonces fue algo totalmente diferente. No había límites. Redujeron nuestra existencia a lo puramente animal, a respirar y pensar cómo sobrevivir. 

Nos quitaron los espejos para que no nos pudiéramos ver. Cuando llovía, buscábamos charcos en el patio para vernos. Yo perdí 12 kilos, pero porque ya estaba muy delgado. Hay presos que han perdido muchos más. Nos daban de comer apenas un vasito de café con arroz, cubierto de excrementos de ave porque los dejaban en el patio antes de distribuirlos. Y si no nos lo comíamos, nos pegaban hasta la muerte. Otras veces, nos dejaban sin comer como castigo colectivo. 

Tenían un plan con todo lo que querían experimentar con nosotros y lo llevaron a cabo. Antes del 7 de octubre, te podían golpear hasta partirte los huesos, pero luego te curaban para que siguieras vivo. Pero a partir de entonces, desapareció la atención médica. Han matado a muchos presos de hambre y de falta de medicinas.

El hacinamiento, la falta de higiene, las heridas y las enfermedades han generado una variante de la sarna que se come el cuerpo de los presos. Yo he llegado a verle los huesos a algunos. Muchos han muerto por eso.

En las prisiones pusieron una foto de la Franja destruida, de seis metros de largo, con el título «La nueva Gaza». Era una forma de tortura psicológica, de decirnos “no podéis hacer nada, esto es lo que está pasando allí afuera”. 

En las 48 horas previas a ponernos en libertad, la violencia aumentó muchísimo. Nos pegaron tanto que cuando llegamos a la frontera no podíamos siquiera caminar para cambiar de autobús, no teníamos fuerzas.

El otro muro
Grafiti con el rostro del escritor palestino Nasser Abu Srour cerca de su casa familiar, en Cisjordania. VLADIMIR GUREWICH

¿Cómo está ahora?

Es difícil explicarlo. Respiro, y eso está bien. Estoy comiendo, bebiendo, amando, y eso se supone que está bien. Puedo ver las calles, algo que no podía hacer desde hace 32 años. Y puedo hablar por teléfono con personas de la Palestina ocupada y eso está bien. Pero no estoy bien. De hecho, no sé si le puedo dar las gracias a Dios por nuestra liberación porque el precio ha sido que 80.000 personas hayan sido asesinadas en Gaza. Y en las cárceles siguen matando, humillando, degradando y violando a diario. Le he escrito una carta a uno de los amigos que siguen encarcelados en la que le pido perdón por cada vez que respiro porque les he dejado solos. 

En los dos últimos años pensé en suicidarme porque era tanta la violencia que no podía controlar mi cuerpo y no quería convertirme en un animal. Le decía a mi cuerpo que no tenía hambre, pero no podía controlarlo. Lo único que me permitió mantener un mínimo de valentía para sobrevivir fue la fe en que algún día viviría en libertad.

«En las cárceles israelíes siguen matando, humillando, degradando y violando a diario«

¿Convivió con las personas que secuestraban de Gaza durante el genocidio?

No, los llevaban a una sección distinta de las prisiones. Escuchábamos sus gritos, unos desgarros que no puedo describir. Nada de lo que vivimos nosotros es comparable a lo que hacen con los presos de Gaza.

¿Cómo fue la puesta en libertad?

Nos llevaron por el sur de la Franja y lo primero que hice cuando cruzamos la frontera de Rafah fue abrir la cortinilla del autobús. Era la ventana más grande que he visto en mi vida porque solo conocía las del campo de refugiados en el que nací y las de la cárcel. Cuando llegamos al hotel no sabía qué hacer. Era la primera vez en mi vida que estaba en uno. Salía de la habitación y tenía que volver cinco veces porque siempre se me olvidaba algo. Mis hermanos que viven en Estados Unidos vinieron a verme y me trajeron muchos regalos caros, como un Iphone. Yo no sabía qué hacer con él. 

No sabía ni siquiera dar ni recibir amor. Tuve que pedirles momentos de pausa a la familia porque no podía recibir ni dar tanto cariño. En un momento dado, mi hermana me iba a abrazar y le tuve que pedir que no lo hiciese, no podía. 

Tampoco consigo reconocerme con el tiempo ni el lugar. En prisión, vivía fuera del tiempo y en un no-lugar. Estoy aprendiendo.

Primero, les alojaron en un hotel en El Cairo. Al día siguiente, el panfleto sensacionalista Daily Mail publicó una noticia en la que criticaba que turistas británicos tuvieran que desayunar en la misma sala que ustedes. La titularon El hotel de Hamás. Entonces, les vuelven a meter en un autobús y les trasladan a un hotel en medio del desierto. ¿Cómo se sintió entonces?

Sentí que nos trasladaban a otra prisión. Nos dijeron que teníamos que recoger todo lo que nuestros familiares nos habían regalado y marcharnos rápidamente porque en esa noticia decían que éramos una amenaza para la vida de los turistas y para la seguridad mundial. 

Me revivió el trauma de cuando nos cambiaban de prisión: volví a tener dolor de estómago y ganas de vomitar como entonces. Primero nos llevaron a un hotel en una ciudad deportiva en el desierto y, después, cuando lo necesitaron para unas competiciones, a otro aún más lejos, junto al Mar Rojo.

Como escribió el pensador Al-Manfaluti si no cambias tu estado emocional, da igual que cambies de lugar: seguirás sintiéndote igual. Como nos trasladaron de manera forzada y nos seguían tratando como una amenaza, yo me seguía sintiendo en prisión.

¿Dónde vive ahora? 

Los presos que tenemos apoyo económico de nuestras familias hemos alquilado apartamentos en distintas partes de Egipto. Pero hay 150 presos que siguen viviendo en ese hotel aislado.

«Nada de lo que vivimos nosotros es comparable a lo que hacen con los presos de Gaza«

La condición para salir de prisión fue que no podía volver a Palestina. 

No, el sionismo no nos permite volver a Palestina a los presos liberados porque su objetivo siempre ha sido conseguir que sea una tierra sin pueblo. Y para ello emplea los asesinatos, los genocidios, las masacres y el exilio forzado.

¿Qué mensaje le gustaría enviarle a todo el mundo?

Que el mundo vea al pueblo palestino, que dejen de hacer como si los palestinos y palestinas fuésemos invisibles, víctimas sin ningún valor. El mundo tiene que entender que el pueblo palestino lleva 100 años sufriendo genocidio tras genocidio, no solo en los últimos dos años. Y también tiene que entender que sus gobiernos siempre han sido cómplices. 

Israel no habría podido ejecutar este genocidio, y menos durante tanto tiempo, sin la financiación, las armas y el apoyo de Estados Unidos y de países de la Unión Europea para masacrar a un pueblo entero. Necesitamos que cuando el mundo escucha que en Gaza se están muriendo de hambre, no lo escuche como si fuesen solo palabras. Porque no lo son.

Seguimos en el 48, la Nakba continúa. Israel no ha dejado de matar y de aplicar políticas de opresión desde entonces. Israel es cada vez más fuerte, más brutal a la hora de cometer las masacres y los genocidios. Y lo que está pasando en Gaza es la demostración de cómo se puede eliminar a un pueblo, arrasar un territorio hasta dejarlo plano, dejar a los supervivientes en la calle hambrientos para después abrir la frontera, dejar pasar a 10 personas después de haber asesinado a 80.000 y decir que eso es la paz. El mundo tiene que dejar de ser cómplice, no solo con la Franja de Gaza sino con toda la Palestina histórica.

«No sabía ni siquiera dar ni recibir amor«

Cuando usted aún estaba preso, el escritor español José Ovejero publicó una reseña sobre su libro en la que decía que si pudiera entrevistarle la primera pregunta habría sido: “¿Por qué, en lugar de mostrar la carne tumefacta y la herida, en lugar de volver la mirada hacia el verdugo, en lugar de hacer visible la reja y la celda miserable, ha decidido escribir sobre lo que no se ve?”. Ahora que está libre se la hago yo en su nombre.

El otro muro
Portada del libro ‘La historia de un muro’. GALAXIA GUTENBERG

El ser humano tiene cinco sentidos que nos ofrecen significados muy limitados. Puedes escuchar y quedarte solo con lo escuchado; mirar, y quedarte solo con lo visto. Pero lo que normalmente no hacemos los seres humanos es darle sentido y un significado a lo que sentimos. Y todo lo que hay a nuestro alrededor puede tener miles de ellos. Y para hacerlo, tienes que aplicarle la imaginación. Si yo veo la pared de la prisión y digo “No se puede cruzar, no se puede destruir, no va a desaparecer nunca”, voy a estar preso para siempre. Pero si utilizo la imaginación para ver y sentir lo que hay tras los muros, para imaginar una flor y oler su perfume, para viajar a Barcelona, para tener una cita con una mujer… Entonces voy a intentar sobrevivir. La ciencia está demostrando que hay muchas cosas que no vemos y que existen. Y en mi escritura utilizo la imaginación para dar sentido a lo que no se ve. 

¿Ha sido la imaginación lo que le ha permitido sobrevivir a 32 años de encarcelamiento?

Sí, desarrollé este mecanismo de defensa de dar otro significado a las cosas para olvidar que iba a vivir ahí toda la vida. He vivido una vida entera con este muro. Lo he besado, lo he abrazado, he hablado con él, me ha abierto muchas puertas… Ha sido muy bonito sorprenderme con lo que me ha enseñado. Sólo los niños -hasta los diez años- y los filósofos conservan la capacidad de sorpresa. Y eso lo que yo he hecho para dar sentido a seguir vivo junto a ese muro.

Escribe que uno de los dolores más fuertes que ha sufrido en prisión se lo provocó enamorarse.

Todos nacemos con un torrente de emociones que nos acompañan a lo largo de la vida. Y hay un dicho que dice que todos nacemos con unos lazos que nos unen a unas personas. Yo crecí con ese desbordamiento de amor y lo dirigía a la familia y a personas de mi alrededor. Hasta que la conocí. Cuando la vi la primera vez, a través del cristal, pensé «Pobres los muros» porque sentí que ella podía hacerlo todo, incluso, destruirlos. Era mi abogada y cuando llevábamos dos años de relación me di cuenta de que esa mujer de 27 años necesitaba alguien que la pudiera abrazar, darle un beso, vivir con ella. Y yo ni siquiera la pude tocar. No podía dejar de sentirme culpable, no la podía condenar a perderse todo eso. Cuando rompimos la relación, sentí que un grito de alivio resonaba entre las montañas porque aquella mujer podría por fin vivir. Esa mujer es mi prometida hoy, está aquí conmigo. Volvimos a estar juntos hace un par de años y nos vamos a casar.

«El mundo tiene que dejar de ser cómplice, no solo con la Franja de Gaza sino con toda la Palestina histórica«

¿Cómo fue sacando sus escritos de prisión a lo largo de estos años? He leído a sus editores que algunos los dictó por teléfono cuando podía hacer llamadas y que otros los sacaron algunas personas que le visitaron de manera clandestina. 

Sí, pero no puedo dar detalles para no comprometer a las personas que me ayudaron.

La madre de Abu Srour, Mazyuna, en la puerta de su casa en el campo de Aida durante la visita de esta esta periodista. ALEX ZAPICO.

Tras el 7 de octubre, le quitaron el papel y los bolígrafos y le prohibieron escribir. ¿Qué supuso para usted privarle de la escritura? 

En aquel momento lo único en lo que podía pensar, yo y el resto de los presos, era en sobrevivir un día más, en esconder un mendrugo de pan para el día siguiente, en encontrar un lugar donde no morirme de frío. La escritura dejó de existir, las palabras dejaron de existir, los pensamientos se esfumaron. En mi cabeza solo había una idea: sobrevivir. 

En el listado de países a los que inicialmente podría mudarse se encontraba España, además de Malasia, Qatar y Argelia, entre otros. ¿Sabe por qué España se cayó de esa lista? 

España se retiró, no sabemos por qué. También estaba Turquía, que recibió a algunos presos pero ya no recibe a nadie más. Ahora mismo podríamos mudarnos a Brasil o a Malasia. No hemos tomado la decisión porque no queremos estar lejos de las familias y tiene que ser un destino en el que nos puedan visitar. Además, quiero vivir en un país donde haya dolor. Siempre he convivido con el dolor y quiero seguir escribiendo sobre el dolor, pero para eso necesito entenderlo. Por eso necesito que sea un lugar que se parezca en algo a nuestra vida y para eso no basta que sea árabe porque hay ciudades árabes que no tienen espíritu, ni vida. No podría vivir en un sitio así. 

Usted escribe que los palestinos son solidarios con quienes se rebelan contra la injusticia y que apoyan a quienes no han triunfado. Estamos viendo cómo el movimiento internacional contra el genocidio de Gaza se ha convertido en la mayor movilización global no sólo en apoyo a Palestina sino también contra la ola antidemocrática liderada por Trump y Netanyahu, entre otros. ¿Se siente conectado con ese movimiento internacional de solidaridad con Palestina? 

Sí, siempre son los oprimidos, los derrotados y los débiles quienes tienen la razón. El punto de partida es la solidaridad con quienes pasan por la misma experiencia. En los últimos años, con lo ocurrido en Gaza, la cuestión palestina se ha convertido en el movimiento social más grande y efectivo a nivel mundial. Ojalá les pudiera dar las gracias personalmente a cada una de las personas que participan en este movimiento, que han sido golpeados cuando se manifiestan, echados de sus trabajos y secuestrados cuando vinieron en la flotilla.


«El sionismo no nos permite volver a Palestina a los presos liberados porque su objetivo siempre ha sido conseguir que sea una tierra sin pueblo»

Como sabe, tuve el privilegio de visitar en su casa a su madre, Mazyuna, una mujer excepcional que se convirtió en una lideresa del movimiento de apoyo a los presos palestinos. Tras una vida luchando por su liberación, murió 70 días antes de que usted saliera de prisión. ¿Cómo la describiría?

Lo siento mucho, pero no puedo responder a esta pregunta. Cada vez que toco su muerte me derrumbo. Hoy tengo un compromiso y no me lo puedo permitir. Lo siento. 

Nasser Abu Srour junto a su madre, Mazyuna, en una de sus visitas a prisión. ARCHIVO FAMILIAR.

La entrada Nasser Abu Srour: “Desde el 7 de octubre, las cárceles se convirtieron en un frente más de la guerra contra Gaza” se publicó primero en lamarea.com.

14 Feb 08:34

How a largely forgotten Supreme Court case can help prevent an executive branch takeover of federal elections

by Derek T. Muller, Professor of Law, University of Notre Dame
Georgia General Election 2020 ballots are loaded by the FBI onto trucks at the Fulton County Election hub on Jan. 28, 2026, in Union City, Ga. AP Photo/Mike Stewart

The recent FBI search of the Fulton County, Georgia, elections facility and the seizure of election-related materials pursuant to a warrant has attracted concern for what it might mean for future elections.

What if a determined executive branch used federal law enforcement to seize election materials to sow distrust in the results of the 2026 midterm congressional elections?

Courts and states should be wary when an investigation risks commandeering the evidence needed to ascertain election results. That is where a largely forgotten Supreme Court case from the 1970s matters, a case about an Indiana recount that sets important guardrails to prevent post-election chaos in federal elections.

A clipping from a Nov. 4, 1970 newspaper with the headline 'Hartke in close battle for Senate.'
The day after Election Day in 1970, votes were very close in the Indiana election for U.S. Senate. A challenge to the outcome would lead to an important U.S. Supreme Court case. The Purdue Exponent, Nov. 4, 1970

Congress’s constitutionally-delegated role

The case known as Roudebush v. Hartke arose from a razor-thin U.S. Senate race in Indiana in 1970. The ballots were cast on Election Day, and the state counted and verified the results, a process known as the “canvass.” The state certified R. Vance Hartke as the winner. Typically, the certified winner presents himself to Congress, which accepts his certificate of election and seats the member to Congress.

The losing candidate, Richard L. Roudebush, invoked Indiana’s recount procedures. Hartke then sued to stop the recount. He argued that a state recount would intrude on the power of each chamber, the Senate or the House of Representatives, to judge its own elections under Article I, Section 5 of the U.S. Constitution. That clause gives each chamber the sole right to judge elections. No one else can interfere with that power.

Hartke worried that a recount might result in ballots that could be altered or destroyed, which would diminish the ability of the Senate to engage in a meaningful examination of the ballots if an election contest arose.

But the Supreme Court rejected that argument.

It held that a state recount does not “usurp” the Senate’s authority because the Senate remains free to make the ultimate judgment of who won the election. The recount can be understood as producing new information – in this case, an additional set of tabulated results – without stripping the Senate of its final say.

Furthermore, there was no evidence that a recount board would be “less honest or conscientious in the performance of its duties” than the original precinct boards that tabulated the election results the first time around, the court said.

A state recount, then, is perfectly acceptable, as long as it does not impair the power of Congress.

In the Roudebush decision, the court recognized that states run the mechanics of congressional elections as part of their power under Article I, Section 4 of the U.S. Constitution to set the “Times, Places and Manner of holding Elections for Senators and Representatives,” subject to Congress’s own regulation.

At the same time, each chamber of Congress judges its own elections, and courts and states should not casually interfere with that core constitutional function. They cannot engage in behaviors that usurp Congress’s constitutionally-delegated role in elections.

The U.S. Capitol dome in a photo at night with a dark blue sky behind it.
Each chamber of Congress judges its own elections, with no interference by courts and states with that core constitutional function. David Shvartsman, Moment/Getty Images

Evidence can be power

The Fulton County episode is legally and politically fraught not because federal agents executed a warrant – courts authorize warrants all the time – but because of what was seized: ballots, voting machines, tabulation equipment and related records.

Those items are not just evidence. They are also the raw materials for the canvassing of votes and certification of winners. They provide the foundation for audits and recounts. And, importantly, they are necessary for any later inquiry by Congress if a House or Senate race becomes contested.

That overlap creates a structural problem: If a federal investigation seizes, damages, or destroys election materials, it can affect who has the power to assess the election. It can also inject uncertainty into the chain of custody: Because ballots are removed from absentee envelopes or transferred from Election Day precincts to county election storage facilities, states ensure the ballots cast on Election Day are the only ones tabulated, and that ballots are not lost or destroyed in the process.

Disrupting this chain of custody by seizing ballots, however, can increase, rather than decrease, doubts about the reliability of election results.

That is the modern version of “usurpation.”

From my perspective as an election law scholar, Roudebush is a reminder that courts should be skeptical of executive actions that shift decisive control over election proof away from the institutions the Constitution expects to do the judging.

Congress doesn’t just adjudicate contests

A screenshot of a news story with a headline that says 'Congressional election observers deploy to Iowa for recount in uncalled House race.'
Congressional election observers were sent to Iowa in 2024 to monitor a recount. Fox News

There is another institutional reason courts should be cautious about federal actions that seize or compromise election materials: The House already has a long-running capacity to observe state election administration in close congressional races.

The Committee on House Administration maintains an Election Observer Program. That program deploys credentialed House staff to be on-site at local election facilities in “close or difficult” House elections. That staff observes casting, processing, tabulating and canvassing procedures.

The program exists for a straightforward reason: If the House may be called upon to judge a contested election under Article I, Section 5, it has an institutional interest in understanding how the election was administered and how records were handled.

That observation function is not hypothetical. The committee has publicly announced deployments of congressional observers to watch recount processes in tight House races throughout the country.

I saw it take place first-hand in 2020. The House deployed election observers in Iowa’s 2nd Congressional District to oversee a recount of a congressional election that was ultimately certified by a margin of just six votes.

Democratic and Republican observers from the House politely observed, asked questions, and kept records – but never interfered with the state election apparatus or attempted to lay hands on election equipment or ballots.

Congress has not rejected a state’s election results since 1984, and for good reason. States now have meticulous recordkeeping, robust chain-of-custody procedures for ballots, and multiple avenues of verifying the accuracy of results. And with Congress watching, state results are even more trustworthy.

When federal investigations collide with election materials

Evidence seizures can adversely affect election administration. So courts and states ought to be vigilant, enforcing guardrails that help respect institutional boundaries.

To start, any executive branch effort to unilaterally inject itself into a state election apparatus should face meaningful scrutiny. Unlike the Fulton County warrant, which targeted an election nearly six years old, warrants that interrupt ongoing state processes in an election threaten to usurp the constitutional role of Congress. And executive action cannot proceed if it impinges upon the ultimate ability of Congress to judge the election of its members.

In the exceedingly unlikely event that a court issues a warrant, a court should not permit seizure of election equipment and ballots during a state’s ordinary post-election canvass. Instead, inspection of items, provision of copies of election materials, or orders to preserve evidence are more tailored means to accomplish the same objectives. And courts should establish clear chain-of-custody procedures in the event that evidence must be preserved for a future seizure in a federal investigation.

The fear driving much public commentary about the danger to midterm elections is not merely that election officials will be investigated or that evidence would be seized. It is that investigations could be used as a pretense to manage or, worse, disrupt elections – chilling administrators, disorganizing record keeping or manufacturing doubt by disrupting custody of ballots and systems.

Roudebush provides a constitutional posture that courts should adopt, a recognition that some acts can usurp the power of Congress to judge elections. That will provide a meaningful constraint on the executive ahead of the 2026 election and reduce the risk of intervention in an ongoing election.

The Conversation

Derek T. Muller does not work for, consult, own shares in or receive funding from any company or organization that would benefit from this article, and has disclosed no relevant affiliations beyond their academic appointment.

14 Feb 08:34

Why Trump Doesn't Need a War to End China

by Tom Bilyeu

Trump doesn't need a single bullet to beat China. All it takes is 2 or 3 destroyers near Singapore and the oil stops. Peter Zeihan breaks down why China's entire civilization depends on freedom of the seas and the American market, and how that makes them uniquely vulnerable. But there's a catch: before you cut China off, you better have an alternative supply chain at home. Here's the real strategy no one is talking about.

#trump #china #geopolitics #peterzeihan #uschinatrade #waronchina #militarystrategy #oilsupply #singapore #supplychain #economics #foreignpolicy #shorts
14 Feb 08:33

Así se desplazó la nube radiactiva tras el desastre de Chernobyl.

by Fino
14 Feb 08:32

Cuando las patinadoras chinas “hackearon” la competición para ganar el oro en los Juegos Olímpicos de la Juventud de 2024.

by Fino

Una de las dos le metió una vuelta a todas las demás, y cuando sonó la campana de última vuelta, todas las patinadoras pensaron que era la última vuelta… pero a ellas les quedaba una más. Era la última vuelta para la patinadora china que las había doblado. Dejaron de patinar y su compañera las adelantó.

Ver post completo: Cuando las patinadoras chinas “hackearon” la competición para ganar el oro en los Juegos Olímpicos de la Juventud de 2024.

14 Feb 08:28

Pedir disculpas a un comisario político por haber despreciado su trabajo es darle una nueva línea en su argumentario.

by Fino

Pedir disculpas a un comisario político por haber despreciado su trabajo es darle una nueva línea en su argumentario.

Never forget…

Sarah, eres una trepa a dos tetas pegada. Tu trabajo en TV como defensora “desinteresada” de un gobierno criminal, es tan mediocre como miserable. En tu conciencia, si es que tienes, lo llevarás siempre.

Ver post completo: Pedir disculpas a un comisario político por haber despreciado su trabajo es darle una nueva línea en su argumentario.

14 Feb 08:13

Cesar Agite  [instagram]  [twitter]

Cesar Agite  [instagram]  [twitter]

14 Feb 08:13

Iván García Aguado [instagram]

Iván García Aguado [instagram]

14 Feb 08:12

How to Build a Production-Grade Distributed Chatroom in Go [Full Handbook]

by Destiny Erhabor

If you've ever wondered how chat applications like Slack, Discord, or WhatsApp work behind the scenes, this tutorial will show you. You'll build a real-time chat server from scratch using Go, learning the fundamental concepts that power modern communication systems.

By the end of this guide, you'll have built a working chatroom that supports unlimited concurrent users chatting in real-time, message persistence that survives server crashes, session management so users can reconnect after network interruptions, private messaging between users, and graceful handling of slow or disconnected clients.

More importantly, you'll understand the fundamental concepts behind distributed systems. You'll learn concurrent programming with goroutines and channels, TCP socket programming for network communication, write-ahead logging for data durability, state management with mutexes, and how to design systems that degrade gracefully under failure. These concepts power everything from databases to message queues to web servers.

Table of Contents

  1. What is a Distributed Chatroom?

  2. What You'll Learn

  3. Prerequisites

  4. Tutorial Overview

  5. Architecture Overview

  6. Core Concepts You Need to Know

  7. How to Set Up the Project Structure

  8. How to Define Core Data Types

  9. How to Initialize the Server

  10. How to Build the Event Loop

  11. How to Handle Client Connections

  12. How to Implement Message Broadcasting

  13. How to Add Persistence with WAL and Snapshots

  14. How to Implement Session Management

  15. How to Build the Command System

  16. How to Create the Client

  17. How to Test Your Chatroom

  18. How to Deploy Your Server

  19. Enhancements You Can Add

  20. Conclusion

The complete source code for this project is available on GitHub if you'd like to reference it while following along.

What is a Distributed Chatroom?

A chatroom is a server that lets multiple users connect simultaneously and exchange messages in real-time. When we say "production-grade," we mean it includes features you'd expect in a real application: it persists data so messages aren't lost when the server restarts, it handles network failures gracefully, and it can support many concurrent users without slowing down.

The "distributed" aspect refers to how the system manages multiple clients connecting from different locations, all trying to send and receive messages at the same time. This introduces interesting challenges: how do you ensure everyone sees messages in the same order? How do you handle clients with slow internet connections? What happens when someone disconnects unexpectedly?

These aren't just theoretical problems. Every networked application deals with concurrency, state management, and failure handling. Whether you're building a chat app, a multiplayer game, a collaborative editor, or a trading platform, you'll face similar challenges. The patterns you'll learn here apply broadly across distributed systems.

Chat applications are excellent learning projects because they combine several challenging problems in one place. You need to manage concurrent connections safely, broadcast messages to multiple clients without blocking, handle unreliable networks, persist data durably, and ensure the system recovers gracefully from crashes. Each of these topics could be its own tutorial, but here you'll see how they work together in a real application.

What You'll Learn

This tutorial demonstrates several important concepts that are fundamental to building distributed systems. Here's what you'll learn:

1. TCP Socket Programming in Go

You'll learn how to accept incoming TCP connections, read and write data over network sockets, and handle connection failures gracefully. These skills are essential for any networked application, from web servers to database clients.

2. Concurrent Programming with Goroutines and Channels

Go's concurrency model is one of its strongest features. You'll see how to use goroutines to handle multiple clients simultaneously without blocking. You'll use channels to coordinate between goroutines safely, avoiding the common pitfalls of shared memory concurrency like race conditions and deadlocks.

3. State Management in Distributed Systems

Managing shared state across concurrent operations is tricky. You'll learn when to use mutexes versus channels, how to design lock granularity to avoid bottlenecks, and how to ensure data consistency when multiple goroutines access the same data.

4. Write-Ahead Logging (WAL) for Durability

Databases use WAL to ensure data isn't lost during crashes. You'll implement the same pattern, learning how to balance durability with performance. You'll see why fsync is critical, understand the trade-offs of different persistence strategies, and learn how to recover state after unexpected shutdowns.

5. Session Management and Reconnection

Networks are unreliable. Users disconnect, WiFi drops, mobile connections switch towers. You'll build a token-based session system that lets users reconnect seamlessly, preserving their chat history and identity without requiring passwords or complex authentication.

6. Graceful Degradation and Fault Tolerance

Perfect reliability is impossible, so you need to design for partial failures. You'll learn how to prevent slow clients from affecting fast ones, how to continue operating when persistence fails, and how to clean up resources properly when things go wrong.

Prerequisites

To get the most out of this tutorial, you should have some foundational knowledge. You don't need to be an expert, but you should be comfortable with the basics.

  • Go basics (goroutines, channels, interfaces)

  • TCP/IP networking fundamentals

  • Basic concurrency concepts

  • File I/O operations

Tutorial Overview

This tutorial takes you through building a production-ready chatroom step by step.

You'll start by exploring the overall architecture to understand how components fit together. Then you'll learn about core concepts like concurrency models and persistence strategies.

Next, you'll set up your project structure and define the core data types that represent clients, messages, and the chatroom. Then you'll implement the server initialization and event loop, which is where all coordination happens.

After that, you'll build the networking layer to handle client connections, implement message broadcasting so messages reach all users, and add persistence using write-ahead logging and snapshots.

You'll then implement session management for reconnection, build a command system for user actions, and create a simple client application to test your server.

Finally, you’ll learn how to test and deploy your chatroom, and review key lessons from building a distributed system.

By the end, you'll have a complete, working chatroom and understand how distributed systems handle concurrency, persistence, and failure recovery.

Architecture Overview

The system follows a client-server architecture with internal components that work together to provide a robust chat experience.

High-Level Architecture

Chatroom broadcast architecture diagram

Component Breakdown

1. Network Layer

  • TCP Listener: Accepts incoming connections on port 9000

  • Connection Handler: Manages individual client connections with dedicated goroutines

  • Protocol: Simple newline-delimited text protocol

2. Client Management

Each client connection spawns two goroutines:

  • Read Goroutine: Receives messages from client

  • Write Goroutine: Sends messages to client (non-blocking with buffered channels)

3. ChatRoom Core

This is the heart of the system – a single goroutine running an event loop:

for {
    select {
        case client := <-cr.join:
            // Handle new client
        case client := <-cr.leave:
            // Handle disconnection
        case message := <-cr.broadcast:
            // Broadcast to all clients
        case client := <-cr.listUsers:
            // Send user list
        case dm := <-cr.directMessage:
            // Handle private message
    }
}

4. State Management

We have three synchronized data structures:

  • clients map[*Client]bool: Active connections (mutex-protected)

  • sessions map[string]*SessionInfo: User sessions for reconnection

  • messages []Message: In-memory message history

5. Persistence Layer

Two-tier approach:

  • Write-Ahead Log (WAL): Immediate append-only log for durability

  • Snapshots: Periodic full state dumps for faster recovery

6. Session Management

This enables reconnection with token-based authentication:

  • Generates unique tokens per user

  • 1-hour session timeout

  • Preserves chat history for returning users

Message Flow

Here's how a message travels through the system:

User Input → Client Read → Server Receive → Broadcast Channel 
    → ChatRoom Loop → Persist to WAL → Fan-out to All Clients
    → Client Write Goroutines → TCP Send → User Display

The broadcast channel acts as a synchronization point, ensuring total message ordering.

Core Concepts You Need to Know

Understanding the Concurrency Model

This chatroom uses Go's CSP (Communicating Sequential Processes) model. This is a fundamentally different approach to concurrency than you might be used to from other languages.

In traditional concurrent programming, you protect shared memory with locks (mutexes). Multiple threads access the same data structure, and you use locks to ensure only one thread modifies it at a time. This works, but it's error-prone. Forget a lock, and you have a race condition. Hold locks too long, and you have deadlocks.

Go encourages a different approach: instead of communicating by sharing memory, you share memory by communicating. You pass data between goroutines through channels. Only one goroutine owns the data at a time, eliminating many concurrency bugs by design.

Channels provide several advantages. They eliminate most race conditions by design, because if only one goroutine owns the data at a time, there's no race to access it. They provide natural flow control since channels can block when full (back pressure) or block when empty (waiting for data). They make it easier to reason about message flow because you can trace how data moves through your system by following the channels. And they offer better composability since you can combine channels with select statements to coordinate multiple operations.

That said, we’ll still use mutexes in this project. Channels aren't always the right tool. We’ll use mutexes when multiple goroutines need quick, frequent access to shared data structures like maps. And we’ll use channels when we want to coordinate behavior or transfer ownership of data.

Here's how the chatroom uses channels to coordinate everything:

type ChatRoom struct {
    join          chan *Client        // New connections
    leave         chan *Client        // Disconnections
    broadcast     chan string         // Messages to all
    listUsers     chan *Client        // User list requests
    directMessage chan DirectMessage  // Private messages

    // Shared state (mutex-protected)
    clients    map[*Client]bool
    mu         sync.Mutex

    // Message history (separate mutex)
    messages   []Message
    messageMu  sync.Mutex
}

Notice that we have five channels for different types of events. The main event loop receives from all these channels using a select statement. This means all state changes happen sequentially in one place, making the system much easier to reason about.

We could have used one channel that accepts different message types, but separate channels make the code clearer. When you send to chatRoom.join, it's obvious what you're doing. When you send to chatRoom.broadcast, same thing.

The mutexes protect data that many goroutines read frequently. The clients map needs to be accessed every time we broadcast a message. Using a mutex for quick read access is more efficient than passing the entire map through a channel.

Understanding the Persistence Strategy

When your server crashes (and it will eventually), you need to recover the chat history. Users expect their messages to be there when the server restarts. But persistence is expensive: writing to disk is thousands of times slower than writing to memory. So you need a strategy that balances durability with performance.

We’ll use a two-tier approach that's similar to what real databases use: WAL (Write-ahead log) and snapshots.

The WAL is your primary durability mechanism. Here's how it works: every message is immediately appended to a file called messages.wal. This file is append-only, which means we only write to the end. Append-only writes are fast because the disk doesn't need to seek to different locations.

Each message is written as a single line of JSON. After writing each message, we call fsync. This tells the operating system to actually write the data to the physical disk right now, not just buffer it in memory. Without fsync, the OS might lose your data if the power fails before it gets around to writing.

The WAL is append-only and never modified. This makes it very reliable. If the server crashes mid-write, the worst case is one corrupted line at the end, which we can detect and skip during recovery.

The problem with a write-ahead log is that it grows forever. If you have a million messages, you need to replay a million log entries every time you restart the server. That's slow.

Snapshots solve this problem. Every 5 minutes, if there are more than 100 new messages, we write the entire message history to a separate file called snapshot.json. This is the complete state of the chat at that moment.

After creating a snapshot, we truncate (empty) the WAL. New messages continue to append to the WAL, but now we only need to replay messages since the last snapshot.

When the server starts, it first loads the snapshot file (if it exists). This gives us the state from the last snapshot, which might be 100,000 messages. Loading this takes about 100ms. Then it replays all entries from the WAL. This gives us messages written since the last snapshot, which might be only 50 messages. Replaying this takes milliseconds. Finally, it resumes normal operation.

Total recovery time is a few hundred milliseconds instead of several minutes.

This two-tier system gives us the best of both worlds: fast writes during normal operation with the append-only WAL, fast recovery after crashes with snapshot plus small WAL replay, guaranteed durability through fsync after every message, and bounded recovery time because the WAL never grows too large.

The trade-off is that snapshots use more disk space temporarily since you have both the snapshot and the WAL. But disk space is cheap, and correctness is expensive.

Now that you understand the key concepts behind the chatroom's design, it's time to start building. You'll begin by setting up your project structure and creating the necessary directories and files.

How to Set Up the Project Structure

First, create the directory structure for your project. You will create their files as we walk through the tutorial:

mkdir -p chatroom-with-broadcast/cmd/server
mkdir -p chatroom-with-broadcast/cmd/client
mkdir -p chatroom-with-broadcast/internal/chatroom
mkdir -p chatroom-with-broadcast/pkg/token
mkdir -p chatroom-with-broadcast/chatdata
cd chatroom-with-broadcast

Chatroom project structure

Then initialize the Go module.

Note that you’ll need Go 1.23.2 or later installed on your machine. Earlier versions might work, but the code examples assume features available in Go 1.23 and above. This version includes improvements to the standard library that make concurrent programming more efficient.

go mod init github.com/yourusername/chatroom

Your go.mod file should look like this:

module github.com/yourusername/chatroom

go 1.23.2

With your project structure in place, you're ready to start writing code. The first step is defining the data types that will represent the core components of your chatroom: messages, clients, and the chatroom itself.

How to Define Core Data Types

Create a new file internal/chatroom/types.go to define your core data structures. These types form the foundation of your chatroom, so it's important to understand what each one represents and why it's designed the way it is.

package chatroom

import (
    "net"
    "os"
    "sync"
    "time"
)

// Message represents a single chat message with metadata
type Message struct {
    ID        int       `json:"id"`
    From      string    `json:"from"`
    Content   string    `json:"content"`
    Timestamp time.Time `json:"timestamp"`
    Channel   string    `json:"channel"` // "global" or "private:username"
}

// Client represents a connected user
type Client struct {
    conn         net.Conn      // TCP connection
    username     string        // Display name
    outgoing     chan string   // Buffered channel for writes
    lastActive   time.Time     // For idle detection
    messagesSent int           // Statistics
    messagesRecv int
    isSlowClient bool          // Testing flag

    reconnectToken string
    mu             sync.Mutex   // Protects stats fields
}

// ChatRoom is the central coordinator
type ChatRoom struct {
    // Communication channels
    join          chan *Client
    leave         chan *Client
    broadcast     chan string
    listUsers     chan *Client
    directMessage chan DirectMessage

    // State
    clients       map[*Client]bool
    mu            sync.Mutex
    totalMessages int
    startTime     time.Time

    // Message history
    messages      []Message
    messageMu     sync.Mutex
    nextMessageID int

    // Persistence
    walFile       *os.File
    walMu         sync.Mutex
    dataDir       string

    // Sessions
    sessions      map[string]*SessionInfo
    sessionsMu    sync.Mutex
}

// SessionInfo tracks reconnection data
type SessionInfo struct {
    Username       string
    ReconnectToken string
    LastSeen       time.Time
    CreatedAt      time.Time
}

// DirectMessage represents a private message
type DirectMessage struct {
    toClient *Client
    message  string
}

Understanding the Message Type

The Message struct stores everything we need to know about a chat message. The ID field uniquely identifies each message and ensures messages stay in order. The Timestamp lets us show when messages were sent, which is important for chat history.

The Channel field is interesting. Right now, we only use "global" for public messages, but this design lets us add private channels or chat rooms later without changing the data structure. Good data structures anticipate future needs.

Understanding the Client Type

Each connected user is represented by a Client struct. The conn field is their TCP connection – this is how we send and receive data.

The outgoing channel is crucial for performance. Notice it's a chan string, which means it's a channel of strings. We'll make this a buffered channel (size 10). This buffer means we can queue up 10 messages for this client without blocking. If a client is slow to read, we can keep sending to other clients.

Without this buffer, one slow client would block the entire broadcast. With the buffer, slow clients just miss messages if they can't keep up, which is much better than slowing everyone down.

The lastActive timestamp helps us detect idle users. If someone hasn't sent a message in 5 minutes, we can disconnect them to free up resources.

The mu mutex protects the statistics fields. Multiple goroutines will update messagesSent and messagesRecv, so we need a mutex to prevent race conditions.

Understanding the ChatRoom Type

This is the heart of the system. Notice that we have two kinds of fields: channels and protected state.

The five channels (join, leave, broadcast, listUsers, directMessage) are how different parts of the system communicate with the main event loop. When a new client connects, we send them to the join channel. When someone sends a message, it goes to the broadcast channel.

These channels are unbuffered (capacity 0) because we want synchronization. When you send to an unbuffered channel, you block until someone receives. This ensures the event loop processes events in order.

The protected state (maps and slices) needs mutexes because multiple goroutines access it. Notice that we use separate mutexes for different data. The mu mutex protects the clients map. The messageMu mutex protects the messages slice. The sessionsMu mutex protects the sessions map.

Why separate mutexes? Performance. If we used one mutex for everything, broadcasting a message would lock all the data, preventing new clients from joining. Separate mutexes mean different operations can happen concurrently.

The WAL file (walFile) also has its own mutex (walMu) because writing to disk is slow. We don't want to hold the main mutex while waiting for disk I/O.

With your data types defined, the next step is creating a function to initialize the server. This function will set up all your data structures, restore any persisted state from previous runs, and start background workers.

How to Initialize the Server

Server initialization is critical because you need to set up all your data structures in the right order. If you restore state after opening the WAL, you might replay messages twice. If you start accepting connections before loading history, users won't see old messages.

Create a file internal/chatroom/run.go to bootstrap the server:

package chatroom

import (
    "fmt"
    "net"
    "time"
)

func NewChatRoom(dataDir string) (*ChatRoom, error) {
    cr := &ChatRoom{
        clients:       make(map[*Client]bool),
        join:          make(chan *Client),
        leave:         make(chan *Client),
        broadcast:     make(chan string),
        listUsers:     make(chan *Client),
        directMessage: make(chan DirectMessage),
        sessions:      make(map[string]*SessionInfo),
        messages:      make([]Message, 0),
        startTime:     time.Now(),
        dataDir:       dataDir,
    }

    // Restore from snapshot if available
    if err := cr.loadSnapshot(); err != nil {
        fmt.Printf("Failed to load snapshot: %v\n", err)
    }

    // Initialize WAL for new messages
    if err := cr.initializePersistence(); err != nil {
        return nil, err
    }

    // Start background snapshot worker
    go cr.periodicSnapshots()

    return cr, nil
}

func (cr *ChatRoom) periodicSnapshots() {
    ticker := time.NewTicker(5 * time.Minute)
    defer ticker.Stop()

    for range ticker.C {
        cr.messageMu.Lock()
        messageCount := len(cr.messages)
        cr.messageMu.Unlock()

        if messageCount > 100 {
            if err := cr.createSnapshot(); err != nil {
                fmt.Printf("Snapshot failed: %v\n", err)
            }
        }
    }
}

Let's break down what happens during initialization:

1. Creating Data Structures

We start by creating all the maps and channels. The make function initializes these properly. For maps, this creates an empty map ready to use. For channels, this creates an unbuffered channel (capacity 0).

Notice we create the messages slice with initial capacity 0 but room to grow: make([]Message, 0). This is more efficient than starting with nil because the slice is ready to append immediately without allocation.

2. Loading the Snapshot

Before we accept any connections, we try to load a snapshot from disk. This restores the chat history from the last time the server ran. If the snapshot doesn't exist (first run) or fails to load (corrupted file), we just continue with an empty history.

This step must happen before initializing the WAL. If we opened the WAL first, we might replay messages that are already in the snapshot, creating duplicates.

3. Initializing the WAL

The initializePersistence() function opens the WAL file in append mode. It also replays any entries in the WAL that happened after the last snapshot. This ensures we don't lose any messages that were written to the WAL but not yet included in a snapshot.

If this step fails, we return an error and refuse to start. Why? Because if we can't write to the WAL, we can't guarantee durability. It's better to refuse to start than to lie to users by accepting messages we can't persist.

4. Starting Background Workers

The periodicSnapshots() function runs in a separate goroutine. It wakes up every 5 minutes and checks if we need to create a snapshot. Notice the defer ticker.Stop() – this is important. If we forget to stop the ticker, it leaks a goroutine and wastes resources.

The goroutine acquires the messageMu lock just to read the message count, then releases it immediately. We don't hold the lock during the snapshot creation because that's slow and would block message broadcasting.

Why 5 Minutes and 100 Messages?

These are tunable parameters. 5 minutes means recovery never needs to replay more than 5 minutes of messages. 100 messages means we don't create snapshots too frequently during quiet periods.

In a production system, you might make these configurable. A high-traffic chat might want shorter intervals. A low-traffic chat might want longer intervals to reduce disk I/O.

Now that your server is initialized with all the necessary data structures and background workers, you need to build the core coordination mechanism. The event loop is where all state changes happen in your chatroom. It's the heartbeat that keeps everything synchronized.

How to Build the Event Loop

The event loop is the heart of your chatroom. Every client connection, message, and disconnection flows through this single point. This might seem like it could be a bottleneck, but it's actually what makes the system simple and safe.

The Run() method is the server's heartbeat. This is where all the magic happens. Every event in the system flows through this loop. Add this to run.go:

func (cr *ChatRoom) Run() {
    fmt.Println("ChatRoom heartbeat started...")
    go cr.cleanupInactiveClients()

    for {
        select {
        case client := <-cr.join:
            cr.handleJoin(client)

        case client := <-cr.leave:
            cr.handleLeave(client)

        case message := <-cr.broadcast:
            cr.handleBroadcast(message)

        case client := <-cr.listUsers:
            cr.sendUserList(client)

        case dm := <-cr.directMessage:
            cr.handleDirectMessage(dm)
        }
    }
}

Understanding the Select Statement

The select statement is one of Go's most powerful concurrency features. It's like a switch statement for channels. The select waits until one of its cases can proceed, then it executes that case.

Here's what happens: The loop blocks on the select statement, waiting for data on any of the five channels. When data arrives on any channel, that case executes. After the case completes, the loop goes back to waiting.

For example, when a new client connects, code elsewhere in your program sends that client to cr.join. The select receives it and executes cr.handleJoin(client). Once that finishes, the loop goes back to waiting.

Why Use a Single Event Loop?

This might seem like a bottleneck. You have one goroutine processing all events sequentially. Why not process events in parallel?

The answer is consistency. Here's what you gain from sequential processing:

1. No Race Conditions on State

Only one goroutine modifies the clients map, the messages slice, and the sessions map. You never need to worry about two operations interfering with each other. When you add a client in handleJoin, you know for certain that no other code is simultaneously removing clients or broadcasting messages.

This is incredibly powerful. Most bugs in concurrent systems come from unexpected interleaving of operations. By processing events sequentially, you eliminate an entire class of bugs.

2. Total Ordering of Events

Messages are broadcast in the order they arrive. This seems obvious, but it's important. If Alice sends "Hello" and then Bob sends "Hi", you can guarantee everyone sees them in that order. With parallel processing, you'd need additional synchronization to maintain ordering.

3. Simple State Transitions

You can reason about your system state as a series of transitions. "After this join event, the client is in the map. After this leave event, the client is removed." You don't need to worry about concurrent state changes making your reasoning invalid.

4. Easy to Debug

When something goes wrong, you can add logging to the event loop and see exactly what sequence of events led to the problem. With parallel processing, the order of events depends on thread scheduling, making bugs hard to reproduce.

Is This Actually a Bottleneck?

You might worry that sequential processing limits performance. In practice, it's fine for this workload. Here's why:

The handlers are fast. They do simple things like adding to a map, removing from a map, or forwarding a message to channels. These operations take microseconds. The event loop can process thousands of events per second.

The slow operations (writing to disk, sending to client connections) happen in other goroutines. The event loop doesn't wait for them. It just sends data to a channel or adds work to a queue, then immediately moves to the next event.

If you needed higher throughput, you could shard your chat into multiple rooms, each with its own event loop. But for a single chatroom, sequential processing is both simpler and fast enough.

Understanding the Cleanup Worker

Notice the line go cr.cleanupInactiveClients() before the loop. This starts a background goroutine that periodically checks for idle clients.

Why not include this in the event loop? Because it's time-based, not event-based. The cleanup worker wakes up every 30 seconds and sends disconnect events for idle clients. These events flow through the normal event loop, maintaining our single-threaded state mutation property.

Now add the runServer() function and shutdown handler:

import (
    "os"
    "os/signal"
    "syscall"
)

func runServer() {
    chatRoom, err := NewChatRoom("./chatdata")
    if err != nil {
        fmt.Printf("Failed to initialize: %v\n", err)
        return
    }
    defer chatRoom.shutdown()

    // Set up signal handling for graceful shutdown
    sigChan := make(chan os.Signal, 1)
    signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigChan
        fmt.Println("\nReceived shutdown signal")
        chatRoom.shutdown()
        os.Exit(0)
    }()

    go chatRoom.Run()

    listener, err := net.Listen("tcp", ":9000")
    if err != nil {
        fmt.Println("Error starting server:", err)
        return
    }
    defer listener.Close()

    fmt.Println("Server started on :9000")

    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            continue
        }
        fmt.Println("New connection from:", conn.RemoteAddr())
        go handleClient(conn, chatRoom)
    }
}

func (cr *ChatRoom) shutdown() {
    fmt.Println("\nShutting down...")
    if err := cr.createSnapshot(); err != nil {
        fmt.Printf("Final snapshot failed: %v\n", err)
    }
    if cr.walFile != nil {
        cr.walFile.Close()
    }
    fmt.Println("Shutdown complete")
}

The runServer() function ties everything together:

  1. Create the chatroom with NewChatRoom()

  2. Defer the shutdown function so it runs when the function exits

  3. Start the event loop in a separate goroutine with go chatRoom.Run()

  4. Listen for TCP connections on port 9000

  5. For each connection, spawn a goroutine with go handleClient()

The defer statement is important. No matter how the function exits (normal return, panic, error), the shutdown function runs. This ensures we create a final snapshot and close the WAL file cleanly.

The signal handling goroutine listens for SIGINT (Ctrl+C) or SIGTERM (system shutdown). When it receives one, it calls shutdown() and exits gracefully. This means when you press Ctrl+C, the server saves its state before stopping.

With your event loop running and listening for connections, the next step is handling what happens when a client actually connects. This involves reading their username, creating a session, and setting up the communication channels.

How to Handle Client Connections

When a client connects to your server, several things need to happen: you need to establish the TCP connection, prompt for a username, create a Client object to represent them, start goroutines to read and write messages, and handle both normal disconnections and unexpected failures.

Create a file internal/chatroom/io.go for managing client connections. When a client connects, handleClient() manages the entire lifecycle:

package chatroom

import (
    "bufio"
    "fmt"
    "math/rand"
    "net"
    "strings"
    "time"
)

func handleClient(conn net.Conn, chatRoom *ChatRoom) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Panic in handleClient: %v\n", r)
        }
        conn.Close()
    }()

    // Set initial timeout for username entry
    conn.SetReadDeadline(time.Now().Add(30 * time.Second))

    reader := bufio.NewReader(conn)

    // Prompt for username or reconnection
    conn.Write([]byte("Enter username (or 'reconnect:<username>:<token>'): \n"))

    input, err := reader.ReadString('\n')
    if err != nil {
        fmt.Println("Failed to read username:", err)
        return
    }
    input = strings.TrimSpace(input)

    var username string
    var reconnectToken string
    var isReconnecting bool

    // Parse reconnection attempt
    if strings.HasPrefix(input, "reconnect:") {
        parts := strings.Split(input, ":")
        if len(parts) == 3 {
            username = parts[1]
            reconnectToken = parts[2]
            isReconnecting = true
        } else {
            conn.Write([]byte("Invalid format. Use: reconnect:<username>:<token>\n"))
            return
        }
    } else {
        username = input
    }

    // Generate guest name if empty
    if username == "" {
        username = fmt.Sprintf("Guest%d", rand.Intn(1000))
    }

    // Validate reconnection or check for duplicate
    if isReconnecting {
        if chatRoom.validateReconnectToken(username, reconnectToken) {
            fmt.Printf("%s reconnected successfully\n", username)
            conn.Write([]byte(fmt.Sprintf("Welcome back, %s!\n", username)))
        } else {
            conn.Write([]byte("Invalid token or session expired.\n"))
            return
        }
    } else {
        // Prevent duplicate logins
        if chatRoom.isUsernameConnected(username) {
            conn.Write([]byte("Username already connected. Use reconnect if you lost connection.\n"))
            return
        }

        // Create or retrieve session
        chatRoom.sessionsMu.Lock()
        existingSession := chatRoom.sessions[username]
        chatRoom.sessionsMu.Unlock()

        if existingSession != nil {
            token := existingSession.ReconnectToken
            msg := fmt.Sprintf("Tip: Save this token: %s\n", token)
            msg += fmt.Sprintf("To reconnect: reconnect:%s:%s\n", username, token)
            conn.Write([]byte(msg))
        } else {
            session := chatRoom.createSession(username)
            token := session.ReconnectToken
            msg := fmt.Sprintf("Your token: %s\n", token)
            msg += fmt.Sprintf("To reconnect: reconnect:%s:%s\n", username, token)
            conn.Write([]byte(msg))
        }
    }

    // Create client object
    client := &Client{
        conn:           conn,
        username:       username,
        outgoing:       make(chan string, 10), // Buffered
        lastActive:     time.Now(),
        reconnectToken: reconnectToken,
        isSlowClient:   rand.Float64() < 0.1, // 10% chance for testing
    }

    // Clear timeout for normal operation
    conn.SetReadDeadline(time.Time{})

    // Notify chatroom
    chatRoom.join <- client

    // Send welcome message
    welcomeMsg := buildWelcomeMessage(username)
    conn.Write([]byte(welcomeMsg))

    // Start read/write loops
    go readMessages(client, chatRoom)
    writeMessages(client) // Blocks until disconnect

    // Update session on disconnect
    chatRoom.updateSessionActivity(username)
    chatRoom.leave <- client
}

func buildWelcomeMessage(username string) string {
    msg := fmt.Sprintf("Welcome, %s!\n", username)
    msg += "Commands:\n"
    msg += "  /users - List all users\n"
    msg += "  /history [N] - Show last N messages\n"
    msg += "  /msg <user> <msg> - Private message\n"
    msg += "  /token - Show your reconnect token\n"
    msg += "  /stats - Show your stats\n"
    msg += "  /quit - Leave\n"
    return msg
}

The initial 30-second timeout prevents connection exhaustion by disconnecting clients who don't enter a username quickly. The buffered outgoing channel prevents slow clients from blocking the broadcaster. Token-based reconnection lets users resume their session without complex authentication. The dual goroutine design means reading and writing happen independently, so a slow write doesn't block incoming messages.

How to Read Messages from Clients

Add the readMessages() goroutine to handles all incoming data:

func readMessages(client *Client, chatRoom *ChatRoom) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Panic in readMessages for %s: %v\n", client.username, r)
        }
    }()

    reader := bufio.NewReader(client.conn)

    for {
        // Set 5-minute idle timeout
        client.conn.SetReadDeadline(time.Now().Add(5 * time.Minute))

        message, err := reader.ReadString('\n')
        if err != nil {
            if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
                fmt.Printf("%s timed out\n", client.username)
            } else {
                fmt.Printf("%s disconnected: %v\n", client.username, err)
            }
            return
        }

        client.markActive() // Update activity timestamp

        message = strings.TrimSpace(message)
        if message == "" {
            continue
        }

        client.mu.Lock()
        client.messagesRecv++
        client.mu.Unlock()

        // Process commands vs. regular messages
        if strings.HasPrefix(message, "/") {
            handleCommand(client, chatRoom, message)
            continue
        }

        // Regular message - format and broadcast
        formatted := fmt.Sprintf("[%s]: %s\n", client.username, message)
        chatRoom.broadcast <- formatted
    }
}

5 minutes of idle time triggers auto-disconnect. This prevents zombie connections from consuming resources.

How to Write Messages to Clients

Add the writeMessages() function to drain the client's outgoing channel:

func writeMessages(client *Client) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Panic in writeMessages for %s: %v\n", client.username, r)
        }
    }()

    writer := bufio.NewWriter(client.conn)

    for message := range client.outgoing {
        // Simulate slow client (testing mode)
        if client.isSlowClient {
            time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond)
        }

        _, err := writer.WriteString(message)
        if err != nil {
            fmt.Printf("Write error for %s: %v\n", client.username, err)
            return
        }

        err = writer.Flush()
        if err != nil {
            fmt.Printf("Flush error for %s: %v\n", client.username, err)
            return
        }
    }
}

Real-world clients have varying network speeds. A client with a slow internet connection shouldn't block message delivery to other users. This is a fundamental challenge in any system that broadcasts to multiple recipients.

To handle this, we use two techniques. First, the outgoing channel is buffered with a size of 10. This means the system can queue up 10 messages for a client without blocking. If a client temporarily slows down (maybe they're loading a large webpage in another tab), the buffer absorbs the slowdown.

Second, when broadcasting messages (which you'll see in the next section), we use non-blocking sends. If a client's buffer is full because they're consistently too slow, we skip sending to them rather than blocking everyone else. The slow client misses some messages, but everyone else continues normally. This is called graceful degradation: the system continues working even when parts of it have problems.

With client connections handled, the next step is implementing the core feature of any chat system: broadcasting messages to all connected users. Broadcasting means taking one message and sending it to many recipients efficiently and safely.

How to Implement Message Broadcasting

Broadcasting is the heart of a chat application. When one user sends a message, it needs to reach everyone else instantly. But this is trickier than it sounds because you need to persist the message for durability, send it to clients at different speeds without blocking, and maintain message ordering across all clients.

Create internal/chatroom/handlers.go to handle events.

The handleBroadcast() method is where messages reach all users:

package chatroom

import (
    "fmt"
    "strings"
    "time"
)

func (cr *ChatRoom) handleBroadcast(message string) {
    // Parse message metadata
    parts := strings.SplitN(message, ": ", 2)
    from := "system"
    actualContent := message

    if len(parts) == 2 {
        from = strings.Trim(parts[0], "[]")
        actualContent = parts[1]
    }

    // Create persistent message record
    cr.messageMu.Lock()
    msg := Message{
        ID:        cr.nextMessageID,
        From:      from,
        Content:   actualContent,
        Timestamp: time.Now(),
        Channel:   "global",
    }
    cr.nextMessageID++
    cr.messages = append(cr.messages, msg)
    cr.messageMu.Unlock()

    // Persist to WAL
    if err := cr.persistMessage(msg); err != nil {
        fmt.Printf("Failed to persist: %v\n", err)
        // Continue anyway - availability over consistency
    }

    // Collect current clients
    cr.mu.Lock()
    clients := make([]*Client, 0, len(cr.clients))
    for client := range cr.clients {
        clients = append(clients, client)
    }
    cr.totalMessages++
    cr.mu.Unlock()

    fmt.Printf("Broadcasting to %d clients: %s", len(clients), message)

    // Fan-out to all clients
    for _, client := range clients {
        select {
        case client.outgoing <- message:
            client.mu.Lock()
            client.messagesSent++
            client.mu.Unlock()
        default:
            fmt.Printf("Skipped %s (channel full)\n", client.username)
        }
    }
}

Consistency Trade-off:

If a WAL write fails, you still broadcast the message. Why? Because availability is more important than perfect consistency for a chat application. Users get their messages immediately, and you can handle WAL repair manually if needed.

How to Handle Join and Leave Events

Add these handlers to handlers.go:

func (cr *ChatRoom) handleJoin(client *Client) {
    cr.mu.Lock()
    cr.clients[client] = true
    cr.mu.Unlock()

    client.markActive()

    fmt.Printf("%s joined (total: %d)\n", client.username, len(cr.clients))

    cr.sendHistory(client, 10)

    announcement := fmt.Sprintf("*** %s joined the chat ***\n", client.username)
    cr.handleBroadcast(announcement)
}

func (cr *ChatRoom) handleLeave(client *Client) {
    cr.mu.Lock()
    if !cr.clients[client] {
        cr.mu.Unlock()
        return
    }
    delete(cr.clients, client)
    cr.mu.Unlock()

    fmt.Printf("%s left (total: %d)\n", client.username, len(cr.clients))

    // Close channel safely
    select {
    case <-client.outgoing:
        // Already closed
    default:
        close(client.outgoing)
    }

    announcement := fmt.Sprintf("*** %s left the chat ***\n", client.username)
    cr.handleBroadcast(announcement)
}

The handleJoin function adds the client to the active clients map, marks them as active for idle tracking, sends them the last 10 messages so they can see recent conversation, and broadcasts an announcement so everyone knows they joined.

The handleLeave function removes the client from the map, closes their outgoing channel safely (the select checks if it's already closed to avoid a panic), and broadcasts a departure announcement.

How to Send User Lists and History

Add these helper functions to handlers.go:

func (cr *ChatRoom) sendHistory(client *Client, count int) {
    cr.messageMu.Lock()
    defer cr.messageMu.Unlock()

    start := len(cr.messages) - count
    if start < 0 {
        start = 0
    }

    historyMsg := "Recent messages:\n"
    for i := start; i < len(cr.messages); i++ {
        msg := cr.messages[i]
        historyMsg += fmt.Sprintf(" [%s]: %s\n", msg.From, msg.Content)
    }

    select {
    case client.outgoing <- historyMsg:
    default:
    }
}

func (cr *ChatRoom) sendUserList(client *Client) {
    cr.mu.Lock()
    defer cr.mu.Unlock()

    list := "Users online:\n"
    for c := range cr.clients {
        status := ""
        if c.isInactive(1 * time.Minute) {
            status = " (idle)"
        }
        list += fmt.Sprintf("  - %s%s\n", c.username, status)
    }

    list += fmt.Sprintf("\nTotal messages: %d\n", cr.totalMessages)
    list += fmt.Sprintf("Uptime: %s\n", time.Since(cr.startTime).Round(time.Second))

    select {
    case client.outgoing <- list:
    default:
    }
}

func (cr *ChatRoom) handleDirectMessage(dm DirectMessage) {
    select {
    case dm.toClient.outgoing <- dm.message:
        dm.toClient.mu.Lock()
        dm.toClient.messagesSent++
        dm.toClient.mu.Unlock()
    default:
        fmt.Printf("Couldn't deliver DM to %s\n", dm.toClient.username)
    }
}

func (cr *ChatRoom) findClientByUsername(username string) *Client {
    cr.mu.Lock()
    defer cr.mu.Unlock()

    for client := range cr.clients {
        if client.username == username {
            return client
        }
    }
    return nil
}

func (c *Client) markActive() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.lastActive = time.Now()
}

func (c *Client) isInactive(timeout time.Duration) bool {
    c.mu.Lock()
    defer c.mu.Unlock()
    return time.Since(c.lastActive) > timeout
}

You now have a working chat system where clients can connect and exchange messages.

But there's a critical problem: if the server crashes or restarts, all messages are lost. The next step is adding persistence so messages survive failures.

How to Add Persistence with WAL and Snapshots

Persistence ensures your chat history survives server crashes and restarts. Without it, users would lose all their conversations every time the server goes down.

You'll implement this using two complementary mechanisms: a write-ahead log for immediate durability and snapshots for fast recovery.

Create internal/chatroom/persistence.go to handle data durability.

The WAL ensures messages survive crashes:

package chatroom

import (
    "bufio"
    "encoding/json"
    "fmt"
    "io"
    "os"
    "path/filepath"
)

func (cr *ChatRoom) initializePersistence() error {
    if err := os.MkdirAll(cr.dataDir, 0755); err != nil {
        return fmt.Errorf("create data dir: %w", err)
    }

    walPath := filepath.Join(cr.dataDir, "messages.wal")

    if err := cr.recoverFromWAL(walPath); err != nil {
        fmt.Printf("Recovery failed: %v\n", err)
    }

    file, err := os.OpenFile(walPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        return fmt.Errorf("open wal: %w", err)
    }

    cr.walFile = file
    fmt.Printf("WAL initialized: %s\n", walPath)
    return nil
}

func (cr *ChatRoom) recoverFromWAL(walPath string) error {
    file, err := os.Open(walPath)
    if err != nil {
        if os.IsNotExist(err) {
            fmt.Println("No WAL found (fresh start)")
            return nil
        }
        return err
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    recovered := 0

    for scanner.Scan() {
        line := scanner.Text()
        if line == "" {
            continue
        }

        var msg Message
        if err := json.Unmarshal([]byte(line), &msg); err != nil {
            fmt.Printf("Skipping corrupt line: %s\n", line)
            continue
        }

        cr.messages = append(cr.messages, msg)

        if msg.ID >= cr.nextMessageID {
            cr.nextMessageID = msg.ID + 1
        }
        recovered++
    }

    fmt.Printf("Recovered %d messages\n", recovered)
    return nil
}

func (cr *ChatRoom) persistMessage(msg Message) error {
    cr.walMu.Lock()
    defer cr.walMu.Unlock()

    data, err := json.Marshal(msg)
    if err != nil {
        return err
    }

    _, err = cr.walFile.Write(append(data, '\n'))
    if err != nil {
        return err
    }

    return cr.walFile.Sync()
}

Each line is a JSON-encoded message:

{"id":1,"from":"Alice","content":"Hello world","timestamp":"2024-02-06T10:00:00Z","channel":"global"}
{"id":2,"from":"Bob","content":"Hi Alice!","timestamp":"2024-02-06T10:00:05Z","channel":"global"}

The Sync() call is critical for durability. Without it, the OS might buffer writes in memory, losing them on a crash. The trade-off is that Sync() is expensive (about 1-10ms per call). Production systems might batch multiple messages to improve throughput.

How to Create and Load Snapshots

Add snapshot functionality to persistence.go:

func (cr *ChatRoom) createSnapshot() error {
    snapshotPath := filepath.Join(cr.dataDir, "snapshot.json")
    tempPath := snapshotPath + ".tmp"

    file, err := os.Create(tempPath)
    if err != nil {
        return err
    }
    defer file.Close()

    cr.messageMu.Lock()
    data, err := json.MarshalIndent(cr.messages, "", "  ")
    cr.messageMu.Unlock()

    if err != nil {
        return err
    }

    if _, err := file.Write(data); err != nil {
        return err
    }

    if err := file.Sync(); err != nil {
        return err
    }

    file.Close()

    if err := os.Rename(tempPath, snapshotPath); err != nil {
        return err
    }

    fmt.Printf("Snapshot created (%d messages)\n", len(cr.messages))
    return cr.truncateWAL()
}

func (cr *ChatRoom) truncateWAL() error {
    cr.walMu.Lock()
    defer cr.walMu.Unlock()

    if cr.walFile != nil {
        cr.walFile.Close()
    }

    walPath := filepath.Join(cr.dataDir, "messages.wal")
    file, err := os.OpenFile(walPath, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        return err
    }
    cr.walFile = file
    fmt.Println("WAL truncated")
    return nil
}

func (cr *ChatRoom) loadSnapshot() error {
    snapshotPath := filepath.Join(cr.dataDir, "snapshot.json")
    file, err := os.Open(snapshotPath)
    if err != nil {
        if os.IsNotExist(err) {
            return nil
        }
        return err
    }
    defer file.Close()

    data, err := io.ReadAll(file)
    if err != nil {
        return err
    }

    cr.messageMu.Lock()
    err = json.Unmarshal(data, &cr.messages)
    cr.messageMu.Unlock()

    if err != nil {
        return err
    }

    for _, msg := range cr.messages {
        if msg.ID >= cr.nextMessageID {
            cr.nextMessageID = msg.ID + 1
        }
    }

    fmt.Printf("Loaded %d messages from snapshot\n", len(cr.messages))
    return nil
}

Writing to .tmp then renaming ensures you never have a half-written snapshot. Even if power fails mid-write, the old snapshot remains valid.

Recovery Flow

When the server starts, it first loads the snapshot if it exists, which might contain 100K messages and takes about 100ms. Then it replays WAL entries written since the snapshot, which might be only recent messages. Total recovery time is seconds instead of minutes.

With persistence in place, your messages are safe. But network connections are unreliable. Users get disconnected when their WiFi drops, their phone switches towers, or their laptop goes to sleep. The next step is implementing session management so users can reconnect without losing their identity or chat history.

How to Implement Session Management

Session management lets users reconnect to your server after network interruptions without needing to create a new account or re-enter credentials. You'll implement this using cryptographically secure tokens that persist across connections.

Create internal/chatroom/session.go for reconnection handling.

package chatroom

import (
    "fmt"
    "time"

    "github.com/yourusername/chatroom/pkg/token"
)

func (cr *ChatRoom) createSession(username string) *SessionInfo {
    cr.sessionsMu.Lock()
    defer cr.sessionsMu.Unlock()

    tok := token.GenerateToken()

    session := &SessionInfo{
        Username:       username,
        ReconnectToken: tok,
        LastSeen:       time.Now(),
        CreatedAt:      time.Now(),
    }

    cr.sessions[username] = session

    fmt.Printf("Created session for %s (token: %s...)\n", username, tok[:8])

    return session
}

func (cr *ChatRoom) validateReconnectToken(username, token string) bool {
    cr.sessionsMu.Lock()
    defer cr.sessionsMu.Unlock()

    session, exists := cr.sessions[username]
    if !exists {
        return false
    }

    if session.ReconnectToken != token {
        return false
    }

    if time.Since(session.LastSeen) > 1*time.Hour {
        delete(cr.sessions, username)
        return false
    }

    session.LastSeen = time.Now()

    return true
}

func (cr *ChatRoom) updateSessionActivity(username string) {
    cr.sessionsMu.Lock()
    defer cr.sessionsMu.Unlock()

    if session, exists := cr.sessions[username]; exists {
        session.LastSeen = time.Now()
    }
}

func (cr *ChatRoom) isUsernameConnected(username string) bool {
    cr.mu.Lock()
    defer cr.mu.Unlock()

    for client := range cr.clients {
        if client.username == username {
            return true
        }
    }

    return false
}

func (cr *ChatRoom) cleanupInactiveClients() {
    ticker := time.NewTicker(30 * time.Second)
    defer ticker.Stop()

    for range ticker.C {
        cr.mu.Lock()
        var toRemove []*Client

        for client := range cr.clients {
            if client.isInactive(5 * time.Minute) {
                fmt.Printf("Removing inactive: %s\n", client.username)
                toRemove = append(toRemove, client)
            }
        }
        cr.mu.Unlock()

        for _, client := range toRemove {
            cr.leave <- client
        }
    }
}

How to Generate Secure Tokens

Create pkg/token/token.go for token generation:

package token

import (
    "crypto/rand"
    "encoding/hex"
)

// GenerateToken returns a secure random 16-byte hex token
func GenerateToken() string {
    b := make([]byte, 16)
    _, _ = rand.Read(b)
    return hex.EncodeToString(b)
}

Tokens here are transmitted in plaintext over TCP. For production use, you should use TLS encryption to protect tokens in transit, hash tokens before storage so a database breach doesn't expose them, and implement rate limiting on reconnection attempts to prevent brute force attacks.

Your chatroom now supports basic messaging and reconnection. But users need ways to interact with the system beyond just sending messages. The command system provides features like listing users, viewing history, and sending private messages.

How to Build the Command System

Commands are messages that start with a forward slash and perform special actions instead of being broadcast to everyone. This is a pattern used by many chat applications like Slack and Discord. You'll implement several useful commands that enhance the user experience.

Add command handling to io.go:

func handleCommand(client *Client, chatRoom *ChatRoom, command string) {
    parts := strings.Fields(command)
    if len(parts) == 0 {
        return
    }

    switch parts[0] {
    case "/users":
        chatRoom.listUsers <- client

    case "/stats":
        client.mu.Lock()
        stats := fmt.Sprintf("Your Stats:\n")
        stats += fmt.Sprintf("  Messages sent: %d\n", client.messagesSent)
        stats += fmt.Sprintf("  Messages received: %d\n", client.messagesRecv)
        stats += fmt.Sprintf("  Last active: %s ago\n", 
            time.Since(client.lastActive).Round(time.Second))
        client.mu.Unlock()

        select {
        case client.outgoing <- stats:
        default:
        }

    case "/msg":
        if len(parts) < 3 {
            select {
            case client.outgoing <- "Usage: /msg <username> <message>\n":
            default:
            }
            return
        }

        targetUsername := parts[1]
        messageText := strings.Join(parts[2:], " ")

        targetClient := chatRoom.findClientByUsername(targetUsername)
        if targetClient == nil {
            select {
            case client.outgoing <- fmt.Sprintf("User '%s' not found\n", targetUsername):
            default:
            }
            return
        }

        privateMsg := fmt.Sprintf("[From %s]: %s\n", client.username, messageText)
        select {
        case targetClient.outgoing <- privateMsg:
        default:
            select {
            case client.outgoing <- fmt.Sprintf("%s's inbox is full\n", targetUsername):
            default:
            }
            return
        }

        select {
        case client.outgoing <- fmt.Sprintf("Message sent to %s\n", targetUsername):
        default:
        }

    case "/history":
        count := 20
        if len(parts) > 1 {
            fmt.Sscanf(parts[1], "%d", &count)
        }
        if count > 100 {
            count = 100
        }
        cr.sendHistory(client, count)

    case "/token":
        chatRoom.sessionsMu.Lock()
        session := chatRoom.sessions[client.username]
        chatRoom.sessionsMu.Unlock()

        if session != nil {
            msg := fmt.Sprintf("Your reconnect token:\n")
            msg += fmt.Sprintf("   reconnect:%s:%s\n", client.username, session.ReconnectToken)
            select {
            case client.outgoing <- msg:
            default:
            }
        }

    case "/quit":
        announcement := fmt.Sprintf("%s left the chat\n", client.username)
        chatRoom.broadcast <- announcement

        select {
        case client.outgoing <- "Goodbye!\n":
        default:
        }

        time.Sleep(100 * time.Millisecond)
        client.conn.Close()

    default:
        select {
        case client.outgoing <- fmt.Sprintf("Unknown: %s\n", parts[0]):
        default:
        }
    }
}

Your server is now complete with all the core features: connection handling, message broadcasting, persistence, session management, and commands. But to actually use your chatroom, you need a client application. The client is much simpler than the server because it just needs to connect and relay messages.

How to Create the Client

The client application provides the user interface for your chatroom. It connects to the server, displays incoming messages, and sends outgoing messages typed by the user. While the server is complex with many concurrent components, the client is straightforward

Create internal/chatroom/client.go for the client implementation.

package chatroom

import (
    "bufio"
    "fmt"
    "net"
    "os"
    "strings"
)

func StartClient() {
    conn, err := net.Dial("tcp", ":9000")
    if err != nil {
        fmt.Println("Error connecting:", err)
        return
    }
    defer conn.Close()

    fmt.Println("Connected to chat server")

    // Background goroutine: read from server
    go func() {
        reader := bufio.NewReader(conn)
        for {
            message, err := reader.ReadString('\n')
            if err != nil {
                fmt.Println("Disconnected from server.")
                os.Exit(0)
            }
            // Clear current prompt line...
13 Feb 19:11

5 claves para bajar la Autoexigencia por Miedo al Fracaso

by Paloma Rey
La autoexigencia suele presentarse como una aliada. Te mantiene alerta, responsable, comprometido o comprometida. El problema aparece cuando deja de ser una elección y se convierte en una condición para sentirte en paz. Ahí ya no impulsa, sino que presiona. Y muchas veces no nace de la ambición, sino del [miedo](/psicologia/para-que-sirve-miedo). Miedo a equivocarte, a quedarte atrás, a perder valor si no cumples con ciertos estándares, y eso puede llegar a ser súper agotador y negativo para tu salud mental. Este tipo de exigencia, **más que ayudarte a avanzar, busca protegerte de un fracaso que se siente amenazante**. Pero, créenos, que hay formas mucho más sanas de desarrollar tu potencial sin autodestruirte en el proceso. Si quieres saber de qué otras formas puedes hacerlo, sigue leyendo. ## La autoexigencia: entre el impulso sano y la presión constante Exigirse, en sí, no es malo. Para nada. De hecho, cierto nivel de autoexigencia ayuda a organizarse, a sostener compromisos y a desarrollar habilidades, porque da dirección y estructura. El problema aparece cuando esa exigencia pierde flexibilidad y se vuelve rígida, ya que deja de ajustarse a las circunstancias reales. En una autoexigencia adaptativa, las metas pueden revisarse, el error se procesa y el valor personal no queda atado al resultado. En cambio, **cuando la exigencia se desequilibra, el foco deja de estar en aprender o avanzar y pasa a estar en no fallar**. Y aquí es donde empieza el agotamiento, porque el cuerpo y la mente funcionan como si siempre hubiera algo en juego. Este tipo de exigencia no descansa ni siquiera después de un logro. Puede haber alivio momentáneo, pero dura poco, porque enseguida aparece el siguiente estándar que cumplir. Entonces, lo que ocurre es que no hay disfrute sostenido, solo continuidad en el esfuerzo. * Artículo relacionado: ["Crecimiento personal: cómo transformar tu vida en 6 pasos"](/coach/crecimiento-personal-transformar-vida) ## Qué pasa cuando el miedo al fracaso entra en la ecuación El miedo al fracaso no siempre se vive como pánico evidente. Muchas veces se disfraza de responsabilidad extrema, de hipercontrol o de una necesidad constante de hacerlo todo bien. A partir de ahí, **la autoexigencia deja de ser una elección y se convierte en una estrategia defensiva**. Cuando el valor personal se apoya casi exclusivamente en el desempeño, cualquier error se interpreta como una amenaza directa. **No es raro que aparezcan pensamientos muy inflexibles, donde todo se evalúa en términos de éxito o fracaso, sin matices**. Esta lógica interna genera un estado de alerta constante que termina pasando factura. Además, el miedo puede empujar en direcciones opuestas. Algunas personas se sobrecargan de tareas, revisan todo varias veces y se exigen más de lo que su energía permite. Otras evitan empezar, postergan o se bloquean, porque el riesgo de no hacerlo perfecto resulta demasiado alto. ## Consecuencias de la autoexigencia sostenida desde el miedo Es importante tener claro que estas consecuencias no aparecen de un día para otro. Van apareciendo de a poco, porque la exigencia suele estar normalizada y hasta reforzada por el entorno. Aun así, el impacto es real y acumulativo. Entre las consecuencias más frecuentes aparecen: * Mucha ansiedad, incluso en momentos donde no hay demandas objetivas inmediatas. * Dificultad para disfrutar los logros, porque rápidamente se minimizan o se consideran insuficientes. * Autocrítica de forma reiterada que no se regula con evidencias externas positivas. * Sensación de cansancio mental continuo, aunque no siempre haya sobrecarga real de tareas. * Tendencia a revisar en exceso, repetir o corregir de manera compulsiva. * Procrastinación ligada al miedo a no alcanzar el estándar esperado. * Tensión corporal frecuente, especialmente en cuello, mandíbula o espalda. * Culpa asociada al descanso o a los espacios sin productividad. * Aislamiento progresivo, porque todo lo que no sea rendir se vive como secundario. ## Cómo empezar a regular la autoexigencia que nace del miedo Regular la exigencia no implica eliminarla, porque eso suele generar más ansiedad, no alivio. Cuando una persona intenta dejar de exigirse de golpe, aparece una sensación de vacío o descontrol, ya que la exigencia cumplía una función de sostén. El trabajo, entonces, va por otro lado: ajustar, flexibilizar y redistribuir. Estas son algunas claves para bajar el volumen a este tipo de autoexigencia: ### 1. Diferenciar exigencia de valor personal Uno de los primeros pasos consiste en empezar a separar lo que haces de lo que vales. Esto no se logra repitiendo frases positivas, sino observando cuándo el resultado define tu estado emocional. Detectar esos momentos permite cuestionar esa asociación automática. ### 2. Revisar el estándar, no solo el resultado Muchas veces el problema no es el error, sino el nivel de perfección que se espera. Preguntarte de forma honesta si ese estándar es humano y sostenible abre espacio para ajustes más realistas, porque no todo necesita hacerse al máximo nivel todo el tiempo. ### 3. Practicar la flexibilidad en pequeño La flexibilidad no aparece de golpe. Se entrena en decisiones cotidianas, como permitirte terminar algo “suficientemente bien” o priorizar energía antes que perfección. Estos gestos reducen la rigidez sin generar sensación de abandono. ### 4. Cambiar el diálogo interno durante la acción No se trata solo de evaluar al final, sino de acompañarte mientras haces. Darte instrucciones claras, paso a paso, y reconocer avances parciales ayuda a bajar la presión y a sostener el foco sin maltrato interno. @professional(2065283) ### 5. Reaprender el descanso como parte del rendimiento El descanso deja de ser reparador cuando se vive con culpa. Integrarlo como una necesidad básica, y no como una recompensa, permite que la exigencia se apoye en recursos reales y no en un estado de alerta permanente. Aprender a regular la exigencia supone revisar desde dónde te esfuerzas. Puedes seguir intentando y comprometiéndote, pero sin que cada paso esté sostenido por la amenaza de fallar.
13 Feb 19:11

BILDU. FALLO ESTRUCTURAL DE LA DEMOCRACIA

by Pilar Almagro

Hoy vemos uno de los fallos estructurales más profundos de la democracia moderna.

La actual democracia parlamentaria maximiza el poder de los políticos decisivos, aunque sean muy poquitos -caso de BILDU- y su capacidad de extraernos rentas y privilegios a los restantes 49 millones de españoles.

En España, EH Bildu, —procedente del entorno político de la izquierda abertzale vinculada a ETA— tiene sólo 6 escaños en el Congreso y 2 en el Senado. Solamente representa unos 333.000 votos en las elecciones generales mientras que el partido que ganó las elecciones tiene 137 escaños, representa más de 8 millones de votos de ciudadanos españoles.
Y, sin embargo… Bildu se jacta de que son ellos los que tienen el poder. Y lo tienen. Sacan al sanguinario jefe de la banda terrorista ETA de la cárcel, con una condena de 400 años por haber matado bajo su responsabilidad de mando a unas 13 personas y decenas de heridos graves y mutilados. Ya van 163 de los 200 presos de ETA, libres o en semilibertad.

Para Murray Rothbard, esto no es una anomalía… es la lógica misma del poder político. El Estado no responde al bien común abstracto, sino a coaliciones que intercambian favores, recursos y privilegios para mantenerse en el poder.

¿Un fallo estructural profundo de la democracia moderna? ¿Tú qué piensas?
Si te gustó dale like y suscríbete para más contenido
Sígueme en mis otras redes sociales: https://linktr.ee/pilaralmagromarcos

#empresa #ahorro #mercado #mercadolibre #consultoríaempresarial #empresarialidad #empresarios #estado #empresa #emprendimiento #capitalismo #capital #liberalismo #liberalismoeselfuturo #empresarial #empresarias #empresaria #innovaciónempresarial #consultoria #libertadeconomica #empresarias #empresario #empresariado #empresariado #liberalesalpoder #empleo #libertarismo #crecimientoempresarial #escuelaaustriaca #trabajo #inversor #inversiones #ceo #produccion #precios #mercado #libremercado
#DataDrivenPolitics #EconomiaConductual #PolicyInsights #DecisionMaking #ThinkTank #PowerAnalysis #democracia #democraciaenpeligro #democraciaenriesgo
13 Feb 19:11

La calle frente al móvil: El por qué del declive del movimiento vecinal

by El Antropólogo Perplejo
A veces, hablar de movimientos sociales urbanos nos obliga a hacer un doble ejercicio: el de la nostalgia y la sospecha. Nostalgia por aquellas asociaciones de vecinos que, en la ciudad fordista, funcionaban como auténticas escuelas de ciudadanía; sospecha porque … Seguir leyendo →
13 Feb 19:09

Cómo detectar la Depresión a tiempo desde sus primeros síntomas

by Aurora de la Oz
A veces todo empieza con pequeños cambios: cuesta levantarse por las mañanas, se siente una desmotivación tremenda o simplemente el cansancio se queda por mucho rato aunque hayas dormido bien. Poco a poco, esa sensación de vacío o desconexión llega para quedarse y, sin darte cuenta, comienzas a funcionar en automático. Quizá lo notas, pero lo atribuyes al estrés, al trabajo o a una mala racha. Y, sin embargo, dentro algo se va apagando. Es normal que tardes en reaccionar, porque nadie enseña a **reconocer la depresión desde sus primeras señales**. Sin embargo, detectarla a tiempo puede cambiar completamente el rumbo de cómo te sientes. Hablemos de cuáles son esas primeras señales que son importantes de considerar. ## ¿Qué es la depresión? **La depresión no es una etapa pasajera ni una “mala semana”**. Es un [trastorno del estado de ánimo](/clinica/tipos-trastornos-estado-de-animo) que afecta la forma en que una persona piensa, siente y actúa. Esta se caracteriza por un abatimiento persistente, pérdida de energía, desinterés y una sensación de vacío que puede durar semanas o meses. Más allá de la tristeza que se siente, la depresión también implica una enorme falta de motivación que interfiere en la vida diaria, lo que dificulta incluso actividades básicas como trabajar, estudiar o mantener relaciones sanas con los demás. Desde el punto de vista psicológico, la depresión tiene un origen complejo. **Intervienen factores biológicos como un desequilibrio en neurotransmisores como la [serotonina](/neurociencias/serotonina-hormona) y la [dopamina](/neurociencias/dopamina-neurotransmisor), pero también aspectos psicológicos y del entorno**. Por ejemplo, una baja autoestima, experiencias de pérdida, estrés prolongado o un entorno familiar tenso pueden influir. No hay una única causa, sino una combinación de elementos que, juntos, pueden desencadenar este estado. También es importante entender que no hay un perfil único de persona que pueda sufrir de este trastorno. Esta puede afectar a alguien joven o mayor, a quien parece tenerlo todo bajo control o a quien lleva tiempo sintiéndose desbordado. Por eso reconocerla pronto es clave: la depresión es tratable, pero el primer paso siempre es identificarla. ## Los síntomas más comunes de la depresión Al principio, los síntomas pueden pasar desapercibidos. Suelen aparecer de forma gradual y confundirse con el cansancio o el estrés cotidiano. Sin embargo, existen señales que se repiten con frecuencia y que conviene no ignorar. Algunos de los síntomas más comunes son: * Tristeza o sensación de vacío que no desaparece con el tiempo. * Dejar de sentir placer o motivación por actividades que antes gustaban. * Cambios en el sueño: dificultad para dormir o dormir en exceso. * Fatiga constante o falta de energía, incluso sin haber hecho esfuerzo. * Irritabilidad o enojo sin causa clara. * Problemas de concentración o dificultad para tomar decisiones. * Sentimientos de inutilidad, culpa o desesperanza. * Aislamiento social y pérdida de conexión con los demás. La intensidad y combinación de estos síntomas varía en cada persona. Por ejemplo, en los hombres suele manifestarse más como irritabilidad o falta de interés, mientras que en las mujeres es frecuente una sensación de culpa y tristeza más marcada. En adolescentes, en cambio, la irritabilidad y la agitación pueden ser los signos principales, acompañados de quejas físicas. En adultos mayores, la depresión puede reflejarse más en síntomas físicos, fatiga o descuido personal. ## Cómo reconocer la depresión desde el principio Detectar la depresión en sus primeras fases no siempre es sencillo, porque los cambios suelen parecer leves o explicables. Sin embargo, hay detalles que pueden servir como señales tempranas. **Uno de los primeros signos suele ser el cansancio emocional persistente**. No es simplemente sentirse agotado tras un día largo, sino una sensación continua de que todo cuesta demasiado. También es común **notar que las cosas que antes generaban entusiasmo ya no despiertan interés:** salir con amigos, escuchar música o practicar algún hobby empieza a sentirse más como una obligación que como un disfrute. Otro aspecto que puede pasar desapercibido es el deterioro en la concentración y la memoria. **Las tareas que antes resultaban sencillas ahora parecen confusas**, y la mente se llena de pensamientos negativos o repetitivos. Este estado mental, sumado a la falta de energía, hace que la persona se aísle y empiece a perder contacto con su entorno. Además, **prestar atención a los cambios en los hábitos corporales es fundamental**. Por ejemplo, en el apetito o los horarios de sueño. Incluso en dolores físicos que aparecen aparentemente de la nada. Por último, **es clave observar cómo cambia la manera de hablar o pensar**. Frases como “no tengo ganas de nada”, “no sirvo para esto” o “no veo sentido a nada” son expresiones que, aunque parezcan pasajeras, reflejan un malestar profundo. Escucharte o escuchar a otros decirlas con frecuencia es motivo suficiente para prestar atención. El gran reto está en no normalizar estos síntomas. Porque, aunque el ritmo de vida actual empuje a pensar que el cansancio o la falta de motivación son parte del día a día, cuando esas sensaciones se mantienen durante semanas o meses, probablemente haya algo más detrás. ## Qué hacer si notas síntomas de depresión Si reconoces varios de estos signos en ti o en alguien cercano, lo primero es no restarle importancia, sino tomarlo como una señal del cuerpo y la mente de que necesitan atención. Dar ese primer paso puede dar miedo, pero hacerlo temprano cambia mucho el proceso de recuperación. Antes que nada, es importante hablar del tema. Puedes empezar compartiendo lo que sientes con una persona de confianza. Expresar en voz alta lo que ocurre alivia y permite que otros también estén atentos a tus cambios. Pero, ojo, no basta con desahogarse: buscar ayuda profesional es súper importante. De hecho, imprescindible. Un psicólogo o psiquiatra puede evaluar tu situación, identificar el tipo de depresión y ofrecer el tratamiento más adecuado. Mientras buscas ayuda, aquí compartimos contigo estas recomendaciones: ### 1. Cuida tus rutinas básicas Intenta mantener horarios regulares de sueño y alimentación. Aunque suene algo muy básico y a veces le restamos importancia, realmente es elemental. Dormir y comer bien ayudan a estabilizar el estado de ánimo y a mantener sano tu cerebro. Además, es necesario para tener la energía suficiente para no caer en el bucle de la pasividad patológica asociada a la depresión. ### 2. Evita el aislamiento Aunque no tengas ganas, busca mantener cierto contacto con personas que te aporten calma o comprensión. No necesitas grandes planes, basta con una conversación breve o un paseo acompañado. ### 3. Practica actividad física suave Caminar, estirarte o moverte unos minutos al día activa neurotransmisores que influyen directamente en el bienestar emocional. Prueba con actividades con las que sientas más afinidad, sea caminar, bailar, senderismo o hasta una clase de aerobics. ### 4. Reduce la autoexigencia No te castigues por sentirte mal ni por no rendir igual, ya que tu cerebro está funcionando diferente en este momento. La depresión no se supera únicamente con fuerza de voluntad, sino con paciencia, apoyo y tratamiento. ### 5. Registra tus emociones Anotar lo que sientes y cuándo lo sientes ayuda a reconocer patrones durante tu día a día. Esto puede ser útil para ti y para el profesional que te atienda. Además, el hecho de escribir puede ser muy catártico, ya que te permitirá ordenar tus ideas. ### 6. Evita automedicarte Los antidepresivos siempre deben ser indicados y controlados por un psiquiatra. Tomarlos sin supervisión o solo porque alguien conocido te los recomendó puede complicar la situación. @professional(2083450) Como puedes notar, la depresión puede confundirse con muchas otras cosas, y por eso detectarla a tiempo tiene tanto valor. Reconocer los primeros cambios, aceptar que algo no está bien y pedir ayuda antes de que el malestar se profundice es un acto de cuidado personal.
13 Feb 19:08

Dubai no es lo que parece…

by The Wild Project

No hay cultura en Dubai.

¡El libro Jordi Wild "ANATOMÍA DEL MAL" ya a la venta!: https://amzn.eu/d/fbPpMWS
Mi libro ASÍ ES LA **** VIDA: https://amzn.eu/d/9R5QCrv
El libro de mi padre LOS CUENTOS DE PAPA GIORGIO: https://amzn.eu/d/gg5EapZ

Hazte Miembro del Canal: https://www.youtube.com/channel/UCBYyJBCtCvgqA4NwtoPMwpQ/join

Mail para posibles invitados: invitados@jordiwild.com

Realización y edición: Nacho Amela https://twitter.com/NachoAmela https://www.instagram.com/nachoamela/

Mi nuevo Tik Tok, ¡sígueme!: https://www.tiktok.com/@jordiwild
Canal de YT de Jordi Wild: https://www.youtube.com/user/ElRincon...
Jordi Wild web → http://www.jordiwild.com

TWITTER:
https://twitter.com/JordiWild
https://twitter.com/TheWildProject8

FACEBOOK:
https://www.facebook.com/jordiwild

INSTAGRAM:
http://instagram.com/jordiwild8
13 Feb 19:07

Naciones Unidas denuncia las violaciones a los derechos humanos de "las restricciones de petróleo" de EEUU a Cuba

by Andrés Gil

Naciones Unidas denuncia las violaciones a los derechos humanos de "las restricciones de petróleo" de EEUU a Cuba

La portavoz de la Oficina del Alto Comisionado para los Derechos Humanos de la ONU denuncia que EEUU "incumple con la Carta de Derechos Humanos" con su bloqueo a la isla

Nydia Velázquez, congresista demócrata: “EEUU está tratando de matar de hambre a los cubanos hasta que se rindan”

Nueva denuncia de Naciones Unidas al bloqueo redoblado de EEUU a Cuba. La oficina del alto comisionado para los Derechos Humanos de la ONU ha expresado este viernes su “preocupación por la profundización de la crisis socioeconómica de Cuba, en medio de décadas de embargo financiero y comercial, fenómenos meteorológicos extremos y las recientes medidas estadounidenses que restringen los envíos de petróleo. Esto está teniendo un impacto cada vez más grave en los derechos humanos de la población cubana”.

“Los objetivos políticos no pueden justificar acciones que en sí mismas violan los derechos humanos”, afirma el alto comisionado de la ONU para los derechos humanos, Volker Türk, en un llamamiento a levantar “las medidas sectoriales unilaterales, dado su impacto amplio e indiscriminado en la población”.

De acuerdo con la portavoz de la oficina del alto comisionado, Marta Hurtado, “dada la dependencia de los sistemas de salud, alimentación y agua de la importación de combustibles fósiles, la actual escasez de petróleo ha puesto en riesgo la disponibilidad de servicios esenciales en todo el país. Las unidades de cuidados intensivos y las salas de urgencias se encuentran en riesgo, al igual que la producción, el suministro y el almacenamiento de vacunas, hemoderivados y otros medicamentos sensibles a la temperatura”.

Según los datos del organismo, “en Cuba, más del 80% de los equipos de bombeo de agua dependen de la electricidad, y los cortes de electricidad están socavando el acceso al agua potable, el saneamiento y la higiene. La escasez de combustible ha interrumpido el sistema de racionamiento y la canasta básica regulada de alimentos, y ha afectado a las redes de protección social (comida escolar, hogares maternos y residencias de ancianos), afectando de manera desproporcionada a los grupos más vulnerables. Los cortes de electricidad también afectan las comunicaciones y el acceso a la información”.

“Este tipo de sanciones sectoriales afectan a los más vulnerables, no son efectivas y no cumplen ni con la Carta de Naciones Unidas ni con el derecho internacional porque las sanciones deben ser impuestas por el Consejo de Seguridad (de la ONU), no por un país”, afirma la portavoz del organismo, Marta Hurtado, en declaraciones a Efe.

Según la oficina de derechos humanos, “el acceso a bienes y servicios esenciales, como alimentos, agua, medicamentos, combustible y electricidad adecuados, debe garantizarse siempre, ya que son fundamentales en las sociedades modernas para el derecho a la vida y el disfrute de muchos otros derechos. El impacto prolongado y sostenido de las sanciones sectoriales genera dificultades económicas y debilita la capacidad del Estado para cumplir con sus responsabilidades fundamentales, como la prestación de servicios de protección y asistencia. Esto aumenta el riesgo de agravar la disrupción social en Cuba”.

“El Estado, por su parte”, dice la oficina de derechos humanos, “debe asegurarse de estar preparado para responder de conformidad con el derecho internacional de los derechos humanos, prestando atención a las necesidades de los más vulnerables y priorizando la mediación, la desescalada y la salvaguardia del derecho a la libertad de reunión pacífica y de expresión para todos”.

13 Feb 19:06

Uclés rechaza el debate: Los detalles que faltaban

by Alex Fidalgo

Episodio completo: https://youtu.be/9S-3g7htYrs
_______
Colabora con el canal:
⭐️ Hazte miembro: https://www.youtube.com/channel/UCcpOe_g8sfr2GSoLZISy6yA/join
📲 Donaciones: https://paypal.me/loquetudigas
_______
Escucha todos los episodios en podcast:
Apple Podcasts: https://apple.co/2XGmrNs
Spotify: https://spoti.fi/3fKeN2p
iVoox: https://bit.ly/2HJdwq9
________
Sígueme En:
Facebook: https://www.facebook.com/lqtdradio
Twitter: https://twitter.com/lqtdradio
13 Feb 18:59

Uncomfortable Questions in Unstable Times | Frankly 125

by Nate Hagens

(Recorded February 10, 2026)

This week’s Frankly marks a new recurring segment on this platform where Nate poses questions about our shared future: Uncomfortable Questions in Unstable Times. In this edition, he explores what would change if societies shifted their primary goal from growth to stability. Nate also unpacks how a lack of purpose in modern life might shape politics, culture, and personal choices.

He then scales up to look at power and behavior through a wider lens, examining how incentives in systems can shape the behavior of a nation. Nate cites the example of Artificial Intelligence to demonstrate how the large-scale introduction of tools can alter how we experience reality, morality, and physical bottlenecks. Overall, this series is based on the premise that better questions may matter more than discrete answers as we move toward a more uncertain future.

What would change in your life if the country you reside in chose stability over growth? How do notions of “fairness” shift in a world where some people are closer to the “brink” than others? Finally, where is the line between staying true to your values and giving up power in a society built around growth and accumulation?

Show Notes and More:
https://www.thegreatsimplification.com/frankly-original/125-uncomfortable-questions-in-unstable-times#:~:text=Show%20Notes%20%26%20Links%20to%20Learn%20More

Want to learn the broad overview of The Great Simplification in 30 minutes? Watch our Animated Movie:
https://youtu.be/-xr9rIQxwj4?feature=shared

---

Support The Institute for the Study of Energy and Our Future:
https://www.thegreatsimplification.com/support

Join our Substack newsletter:
https://natehagens.substack.com/

Join our Hylo channel and connect with other listeners
https://www.hylo.com/groups/the-great-simplification/join/i9jLqPmbGI

---

00:00 - Introduction
04:42 - Stability Versus Growth
06:15 - The Suffering Gradient
07:12 - The Meaning Problem
08:07 - Dark Triad at the Nation Scale
11:45 - The AI Bifurcation
14:02 - An AI Winter
15:14 - AI Purity Versus Effectiveness
13 Feb 18:57

Dicen que China quiere ocultar sus mega-construcciones

by Adrián Díaz 李安
13 Feb 18:57

¿Tienes a tu lado un torpe con poder?

by Santiago Ávila Vila

¿Conoces a alguien torpe que termina teniendo todo el poder? Descubre cómo los “torpes con poder” aprovechan errores y circunstancias para llegar a la cima.
#TorpeConPoder #Liderazgo #HumorEnElTrabajo #GestiónDeEquipos #HistoriaCuriosa
13 Feb 18:56

Cómo DIRIGIR tu vida con CONSCIENCIA: La fórmula 70-20-10 que NADIE te enseña | Nona Martín

by Gente Interesante con Oriol Roda

En esta entrega, la coach de liderazgo consciente Nona Martín viene a rompernos los esquemas con una fórmula que parece ir a contracorriente: el verdadero cambio no nace del sudor, sino de la mirada. Nos revela por qué el éxito real se divide en un 70% de atención consciente, un 20% de intención y tan solo un 10% de acción. Sí, has leído bien: tu "hacer" constante es lo que menos pesa.

👉 Mira la entrevista completa en el video recomendado

#oriolroda #genteinteresante #salud #bienestar #podcast
13 Feb 18:54

Pedro Sánchez cita a una asociación para ponerse medallas, y la asociación le responde en Twitter para quitárselas.

by Fino