Add Swiss IT disaster articles and homepage article cards

Created 6 new investigative articles covering Swiss IT failures from 2020-2024:
- INSIEME: CHF 116M tax software failure (2020-03)
- Swiss E-Voting: Security flaw cancellation (2020-08)
- SECO Corruption: CHF 99M contract scandal (2021-02)
- Juris X: Zürich's 16-year software odyssey (2022-06)
- Swisscom: 8-hour emergency services outage (2024-07)
- Credit Suisse: 3,000 applications integration nightmare (2024-11)

Added article-card shortcode and CSS for homepage layout.
Updated homepage to display all investigations with featured cards.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-23 10:26:19 +00:00
parent b2a6be2db7
commit 1f7099a3ed
11 changed files with 1199 additions and 52 deletions

View File

@@ -1,29 +1,96 @@
--- ---
title: "SCION: The Emperor's New Internet?" title: "SwissFini.sh"
category: "Investigation"
subtitle: "After 16 years and millions in funding, Switzerland's \"revolutionary\" internet architecture still requires the same expensive private infrastructure it promised to replace."
source: "Analysis based on IETF documentation, official SCION specs, and ISP deployment data"
--- ---
SCION (Scalability, Control, and Isolation on Next-generation Networks) represents peak Swiss tech nationalism — a "clean-slate" internet architecture from ETH Zurich that's been in development since 2009. The promise was revolutionary: path-aware networking that would give enterprises unprecedented control over their data's journey across the internet, with security properties that would make BGP hijacking and DDoS attacks things of the past. {{< article-card
title="SCION: The Emperor's New Internet?"
subtitle="After 16 years and millions in funding, Switzerland's \"revolutionary\" internet architecture still requires the same expensive private infrastructure it promised to replace."
category="Investigation"
date="December 2025"
link="/articles/scion-vs-sdwan/"
featured="true"
>}}
- Why production SCION can't run over public internet
- The "dedicated infrastructure" requirement hidden in plain sight
- How SSFN replaced MPLS with... more private links
- SRv6: The IETF standard that makes SCION redundant
- Axpo Systems: Sells SCION, deploys SRv6 for ASTRA highways
{{< /article-card >}}
The Swiss Secure Finance Network (SSFN), connecting over 300 financial institutions, is held up as proof that SCION has moved from academic theory to production reality. Swisscom, Sunrise, and SWITCH have all deployed SCION infrastructure. The SCION Association boasts of a "BGP-free" future. {{< article-card
title="Credit Suisse: 3,000 Applications and Counting"
subtitle="Inside the IT nightmare that keeps UBS executives awake at night"
category="Investigation"
date="November 2024"
link="/articles/credit-suisse-3000-applications-legacy/"
>}}
- "Pretty much every department built and maintained its own risk systems"
- UBS keeping only 10% of Credit Suisse's 3,000 applications
- USD 14 billion integration budget (and rising)
- The Deutsche Bank warning: how IT integrations go wrong
{{< /article-card >}}
But a closer look at the actual deployment architecture reveals an uncomfortable truth that the marketing materials carefully obscure. When you dig into the IETF documentation and the technical specifications, you find a revealing admission about what SCION actually requires to deliver on its security promises... {{< article-card
title="Swisscom: 8 Hours Without Emergency Calls"
subtitle="When Switzerland's telecom monopoly took emergency numbers offline during a flood"
category="Investigation"
date="July 2024"
link="/articles/swisscom-8-hours-no-emergency-calls/"
>}}
- Emergency numbers 112, 117, 118, 144 unreachable for 8 hours
- Cause: "A software update led to a malfunction that triggered a domino effect"
- CEO: "Our networks are among the best in the world"
- Third major outage in four years
{{< /article-card >}}
<div class="fade-overlay"> {{< article-card
<div class="paywall-box"> title="Juris X: Zürich's 16-Year IT Odyssey"
<h2>Continue Reading</h2> subtitle="How the canton's justice system spent CHF 36 million to keep running 30-year-old software"
<p>Discover what the SCION marketing doesn't tell you:</p> category="Investigation"
<ul class="teaser-list"> date="June 2022"
<li>Why production SCION can't run over public internet</li> link="/articles/juris-x-zurich-16-year-odyssey/"
<li>The "dedicated infrastructure" requirement hidden in plain sight</li> >}}
<li>How SSFN replaced MPLS with... more private links</li> - 16 years attempting to replace case management software
<li>SCION's missing encryption layer vs SD-WAN</li> - Two failed projects: CHF 24 million + CHF 15.6 million
<li>SRv6: The IETF standard that makes SCION redundant</li> - Parliamentary verdict: "Scheitern mit Ansage" (failure foretold)
<li>Axpo Systems: Sells SCION, deploys SRv6 for ASTRA highways</li> - Current system: 30+ years old and still running
</ul> {{< /article-card >}}
<a href="/articles/scion-vs-sdwan/" class="cta-button">Read Full Analysis</a>
<span class="free-label">No paywall. No subscription. Just facts.</span> {{< article-card
</div> title="SECO IT Corruption: CHF 99 Million in Contracts"
</div> subtitle="When a single civil servant awards contracts without bidding and nobody notices for a decade"
category="Investigation"
date="February 2021"
link="/articles/seco-it-corruption-99-million-reasons/"
>}}
- CHF 99 million in IT contracts awarded without public bidding
- CHF 1.7 million in bribes over 10 years
- Zero internal controls caught the scheme
- Discovered by journalists, not auditors
{{< /article-card >}}
{{< article-card
title="Swiss E-Voting: The Hackers Were Right"
subtitle="How security researchers killed Switzerland's 'third way' of voting in weeks"
category="Investigation"
date="August 2020"
link="/articles/swiss-e-voting-the-hackers-were-right/"
>}}
- University of Melbourne researchers found critical cryptographic flaw
- Votes could be altered during shuffling without detection
- 15 years of development, collapsed in months
- Nine cantons forced to stop offering e-voting
{{< /article-card >}}
{{< article-card
title="INSIEME: The CHF 116 Million Lesson"
subtitle="How Switzerland's tax administration spent a decade and nine figures on software that never existed"
category="Investigation"
date="March 2020"
link="/articles/insieme-the-116-million-lesson/"
>}}
- 12 years, CHF 116 million, zero usable code
- Director served as client, sponsor, and project manager simultaneously
- Corruption and bribery charges filed
- The postmortem found "silo mentality" and "leadership weakness"
{{< /article-card >}}

View File

@@ -0,0 +1,143 @@
---
title: "Credit Suisse: 3,000 Applications and Counting"
subtitle: "Inside the IT nightmare that keeps UBS executives awake at night"
category: "Investigation"
date: 2024-11-20
tags: ["Credit Suisse", "UBS", "Banking", "IT Integration", "Legacy Systems"]
---
## The Numbers
| Metric | Value |
|--------|-------|
| Credit Suisse applications inherited | 3,000 |
| Applications UBS is keeping | ~300 (10%) |
| Applications being decommissioned | ~2,700 (90%) |
| Integration budget | USD 13-14 billion |
| Cost savings target | USD 4.6 billion (remaining) |
| Swiss client migration phase | Q2 2025 Q1 2026 |
| Client accounts to migrate | 1.5 million |
## The Inheritance
When UBS absorbed Credit Suisse in March 2023, they acquired more than a troubled bank. They inherited what one former Credit Suisse technology managing director described as institutional IT chaos:
> "Pretty much every department at Credit Suisse built and maintained its own risk systems."
Not one risk system. Not a unified platform. A sprawl of departmental systems—for prime, equity, rates, FX, credit, and various regional operations—each built and maintained independently.
Three thousand applications. Decades of accumulated technical debt. No unified architecture.
## What Keeps Ermotti Awake
UBS CEO Sergio Ermotti has been candid about the technology challenge:
The Credit Suisse technology "keeps him awake at night."
UBS is bringing over only 10% of Credit Suisse's applications. The other 90%—approximately 2,700 applications—must be decommissioned. If this migration and decommissioning don't go to plan, Ermotti warned, UBS's cost-cutting intentions may be thwarted.
{{< irony >}}
A bank that collapsed in part due to risk management failures maintained separate risk systems for each department, with no unified view of enterprise risk.
The technology architecture reflected the organizational culture: siloed, uncoordinated, and unable to see the full picture until it was too late.
{{< /irony >}}
## The Integration Challenge
UBS faces what may be the most complex banking technology integration in European history:
### Phase 1: International (Completed)
Relatively straightforward migration of non-Swiss client segments.
### Phase 2: Swiss Clients (Q2 2025 Q1 2026)
The critical phase: migrating 1.5 million Swiss client accounts from Credit Suisse systems to UBS infrastructure.
### Early Warning Signs
Delays have already occurred. UBS postponed the transfer of some wealthy clients after earlier transfers of less affluent customer segments revealed operational issues:
- Transactions requiring revision
- Systems temporarily unavailable
- Integration teams facing heavy workloads
## The Cost Spiral
UBS initially budgeted USD 13 billion for Credit Suisse integration. They've since increased this to **USD 14 billion**.
The bank has realized USD 8.4 billion in gross cost savings—about 65% of target. The remaining USD 4.6 billion depends largely on successful technology integration.
If the Swiss phase encounters significant problems, those savings may evaporate.
## The Deutsche Bank Warning
UBS leadership is acutely aware of what can go wrong. They've studied Deutsche Bank's Postbank integration—a cautionary tale of IT project failure:
- Deutsche Bank attempted multiple times to integrate Postbank's systems
- The goal was to decommission Postbank's IT by end of 2022
- Heavy delays and budget overruns pushed savings to end of 2025
- Three years behind schedule
{{< irony title="The Parallel Systems Problem" >}}
UBS cannot run Credit Suisse and UBS application systems in parallel for long:
- Duplicated operations increase costs
- Parallel systems raise the cost/income ratio
- Operational risk multiplies with complexity
- Every day of delay costs money
But rushing the migration risks the operational failures already seen in early phases.
Damned if they hurry. Damned if they don't.
{{< /irony >}}
## The Cultural Factor
Credit Suisse's IT chaos wasn't accidental. It reflected organizational culture:
### Departmental Autonomy
Each business unit operated independently, building systems to serve immediate needs without enterprise coordination.
### Short-Term Thinking
Systems were built for current requirements, not long-term maintainability or integration.
### Risk Silos
The same fragmentation that produced 3,000 applications also prevented unified risk visibility—a factor in Credit Suisse's ultimate failure.
### Talent Exodus
After the acquisition announcement, Credit Suisse technology managing directors began leaving. Institutional knowledge walked out the door with them.
## The Swiss Banking IT Reality
Credit Suisse isn't unique. Swiss banking IT has structural challenges:
- **Regulatory complexity**: Swiss and international requirements create compliance overhead
- **Legacy dependency**: Core banking systems often date to the 1980s or earlier
- **Talent competition**: Top technology talent has options beyond banking
- **Security requirements**: Financial services IT must meet stringent security standards while remaining functional
UBS inheriting Credit Suisse's IT mess is dramatic, but legacy technology challenges exist across Swiss banking.
## The Verdict
{{< conclusion >}}
Credit Suisse's 3,000 applications represent more than technical debt. They represent institutional dysfunction—a bank where departments built separate systems, risk was fragmented across silos, and nobody had a unified view of the enterprise.
UBS now faces the challenge of decommissioning 90% of these applications while migrating 1.5 million client accounts without major disruption. The integration budget has already increased by USD 1 billion. Delays have already occurred.
The technology integration is make-or-break for UBS's acquisition thesis. USD 4.6 billion in remaining cost savings depends on successful execution. The Deutsche Bank/Postbank precedent shows how badly such integrations can go wrong.
Credit Suisse failed for many reasons—risk management, culture, regulation, market conditions. But the 3,000-application IT landscape both reflected and enabled that failure. A bank that couldn't unify its technology couldn't unify its risk view. And a bank that couldn't see its risks couldn't survive them.
UBS has until 2026 to prove they can do what Credit Suisse never could: impose order on chaos.
{{< /conclusion >}}
<div class="sources">
### Sources
- [eFinancialCareers: UBS is fretting about Credit Suisse IT systems](https://www.efinancialcareers.com/news/ubs-is-fretting-about-credit-suisse-it-systems-and-credit-suisse-technology-m-ds-have-quit)
- [eFinancialCareers: UBS has only scratched the surface of Credit Suisse's legacy technology](https://www.efinancialcareers.it/news/ubs-has-only-scratched-the-surface-of-credit-suisse-s-legacy-technology)
- [CTOL: UBS Tackles Massive Credit Suisse IT Migration](https://www.ctol.digital/news/ubs-credit-suisse-it-migration-swiss-phase-billions-at-stake/)
- [The Digital Banker: UBS on USD 1 billion quest to avoid Deutsche Bank's IT missteps](https://thedigitalbanker.com/ubs-on-us1-billion-quest-to-avoid-deutsche-banks-it-missteps/)
- [Private Banker International: UBS delays migration of ultra-high-net-worth Credit Suisse clients](https://www.privatebankerinternational.com/news/ubs-delays-credit-suisse-clients-migration/)
</div>

View File

@@ -0,0 +1,122 @@
---
title: "INSIEME: The CHF 116 Million Lesson Nobody Learned"
subtitle: "How Switzerland's tax administration spent a decade and nine figures on software that never existed"
category: "Investigation"
date: 2020-03-15
tags: ["INSIEME", "Federal Government", "Corruption", "IT Failure", "ESTV"]
---
## The Numbers
| Metric | Value |
|--------|-------|
| Project duration | 12 years (20012012) |
| Total cost | CHF 116 million |
| Lines of usable code delivered | 0 |
| Officials suspended | 1 (Director of Federal Tax Administration) |
| Criminal charges filed | Yes (corruption, bribery) |
| Lessons learned by federal government | Debatable |
## What Was INSIEME?
INSIEME was supposed to modernize the information systems of the Federal Tax Administration (Eidgenössische Steuerverwaltung, ESTV). Initiated in 2001, the project aimed to consolidate and upgrade the tax authority's aging IT infrastructure.
The name means "together" in Italian. The irony writes itself.
## The Timeline of Failure
### 20012005: Genesis
The project begins with optimistic timelines and reasonable budgets. As with all Swiss federal IT projects, this would not last.
### 20052010: The Quiet Years
Work continues. Milestones slip. Budgets expand. Nobody outside the administration pays much attention.
### 20102012: The Unraveling
Investigative journalists and parliamentary oversight begin asking uncomfortable questions. The answers are worse than expected.
### September 2012: The End
Finance Minister Eveline Widmer-Schlumpf pulls the emergency brake. After 12 years and CHF 116 million, INSIEME is officially dead.
## The Conflicts of Interest
The project achieved a remarkable concentration of power that would make any governance expert weep:
{{< irony >}}
The Director of the Federal Tax Administration simultaneously served as:
- **Client** (representing the organization that needed the software)
- **Sponsor** (controlling the budget)
- **Project overseer** (responsible for quality and delivery)
He then appointed senior staff from his own office as overall project managers.
{{< /irony >}}
This arrangement violated every principle of project governance, procurement law, and common sense. It persisted for years.
## The Corruption
In January 2012, Finance Minister Widmer-Schlumpf ordered an investigation that revealed:
- Years of violations against federal procurement regulations
- Contracts awarded without proper bidding processes
- Suspicious relationships between ESTV officials and IT contractors
The long-time chief of the tax administration, Urs Ursprung, was suspended—one of the highest-ranking officials ever disciplined in federal administration.
Criminal charges followed. The former IT chief of the tax administration and two IT industry managers faced prosecution for corruption and bribery.
## The Aftermath
A parliamentary working group conducted a postmortem. Their findings:
> "Leadership weakness at the top of the Federal Department of Finance led to the cancellation of the IT project."
The investigation identified:
- **Silo mentality**: The ESTV refused to cooperate with the Federal Office for IT (BIT)
- **Inadequate oversight**: Nobody at the department level was truly watching
- **Structural failures**: The organizational structure of federal administration presented a "challenge" for complex IT projects
{{< irony title="The Swiss Solution" >}}
The working group recommended better governance structures. The federal government agreed this was important. They would work on implementing improvements. Eventually. Through a proper process. With stakeholder consultation.
Meanwhile, the same structural problems persist across dozens of other federal IT projects.
{{< /irony >}}
## The Deeper Pattern
INSIEME wasn't an aberration. It was a symptom.
A 2019 academic analysis of 15 large IT projects in the Swiss Federal Administration found an **accumulated loss of one billion US dollars**, concluding that project failure was primarily caused by "poor project governance capabilities."
The causes identified in INSIEME—conflicts of interest, silo mentality, inadequate oversight, nobody truly responsible—appear in federal IT postmortem after postmortem.
## What CHF 116 Million Could Have Bought
For context, CHF 116 million is approximately:
- 580 Swiss teachers' annual salaries
- 23 kilometers of autobahn
- 1,160 years of median Swiss household income
- One complete tax administration IT system (if purchased from a competent vendor)
## The Verdict
INSIEME demonstrated that the Swiss federal government could spend over a decade and nine figures on a project that delivered nothing—and face no structural consequences that would prevent it from happening again.
The individuals involved faced some accountability. The system that enabled them remained largely intact.
{{< conclusion >}}
INSIEME wasn't a failure of technology. It was a failure of governance, oversight, and institutional design. The project succeeded brilliantly at one thing: demonstrating that Swiss federal IT procurement could achieve spectacular dysfunction while maintaining a veneer of process and professionalism.
The CHF 116 million is gone. The lessons remain unlearned. And somewhere in Bern, another IT project is quietly exceeding its budget while nobody with authority asks the difficult questions.
{{< /conclusion >}}
<div class="sources">
### Sources
- [NZZ: Insieme IT-Debakel im Bundeshaus](https://www.nzz.ch/meinung/insieme-das-it-debakel-im-bundeshaus-ld.1693578) ([archive.org](https://web.archive.org/web/20220729033312/https://www.nzz.ch/meinung/insieme-das-it-debakel-im-bundeshaus-ld.1693578) &#124; [archive.is](https://archive.ph/20220729112428/https://www.nzz.ch/meinung/insieme-das-it-debakel-im-bundeshaus-ld.1693578))
- [Heise: IT-Großprojekt der Schweizer Finanzverwaltung gescheitert](https://www.heise.de/news/IT-Grossprojekt-der-Schweizer-Finanzverwaltung-gescheitert-1714061.html) ([archive.org](https://web.archive.org/web/20231025013240/https://www.heise.de/news/IT-Grossprojekt-der-Schweizer-Finanzverwaltung-gescheitert-1714061.html))
- [SWI: Four indicted in federal IT corruption case](https://www.swissinfo.ch/eng/politics/bribery-and-misconduct_four-indicted-in-federal-it-corruption-case/45267664)
- [Netzwoche: Schuldige für Insieme-Debakel ausgemacht](https://www.netzwoche.ch/news/2014-11-24/schuldige-fuer-insieme-debakel-ausgemacht)
- [Année Politique Suisse: Informatikprojekt INSIEME](https://anneepolitique.swiss/prozesse/3297-informatikprojekt-insieme)
</div>

View File

@@ -0,0 +1,166 @@
---
title: "Juris X: Zürich's 16-Year IT Odyssey"
subtitle: "How the canton's justice system spent CHF 36 million to keep running 30-year-old software"
category: "Investigation"
date: 2022-06-10
tags: ["Juris X", "Zürich", "Cantonal Government", "Justice System", "IT Failure"]
---
## The Numbers
| Metric | Value |
|--------|-------|
| Years attempting replacement | 16+ (20082024+) |
| Failed projects | 2 (original + Juris X) |
| Cost of first failed project | CHF 24 million (budget was CHF 8 million) |
| Cost of Juris X | CHF 15.6 million |
| Cost of replacement (Gina) | CHF 36.5 million |
| Annual cost to maintain legacy system | CHF 4.8 million |
| Age of current production software | 30+ years |
## The Legacy System
Somewhere in the Canton of Zürich's justice infrastructure, software from the early 1990s continues to run. It manages case files for the Justizvollzug—the justice enforcement system handling prisons, probation, and related functions.
This software predates:
- The World Wide Web (public launch: 1991)
- Windows 95
- The Euro
- Google
- The iPhone
- The entire careers of most current IT staff
It still runs. Nobody fully understands why. Or how.
## The First Attempt (20082016)
The Zürich Justizdirektion recognized the problem early. In 2008, they began a project to replace the aging system.
### The Original Budget
CHF 8 million. Reasonable for a cantonal case management system.
### The Final Cost
CHF 24 million. Three times the original budget.
### The Outcome
In summer 2016, the project was cancelled. Nothing was delivered. The 30-year-old software continued running.
Director at the time: Jacqueline Fehr (SP), who inherited the project and stopped it before costs could escalate further. This was, in retrospect, the right call.
## Enter Juris X (2020)
After the first failure, the canton tried again. Contractor Abraxas proposed a new solution: **Juris X**.
### The Promise
A modern case management system. Proper architecture. Reasonable timeline. Lessons learned from the first failure.
### The Price
CHF 15.6 million—double the original quote, but still less than the first project's final cost.
### The Process
The Regierungsrat approved the project. Development began. Milestones were set.
## The Slow-Motion Collapse
{{< irony >}}
In 2024, Abraxas delivered the news everyone dreaded but nobody admitted they expected:
> "Important milestones were not reached and agreed delivery dates were not met."
The software didn't meet requirements. Years of work. Millions of francs. Nothing usable.
{{< /irony >}}
## "Scheitern mit Ansage"
The parliamentary Geschäftsprüfungskommission (oversight commission) reviewed the debacle. Their assessment was damning:
> "Scheitern mit Ansage" — Failure foretold.
Commission president Jean-Philippe Pinto summarized the problems:
> "Too complex, too big, too high ambitions."
The commission found it "incomprehensible" that the Regierungsrat had held onto the troubled project for so long. Warning signs were visible for years. Nobody acted.
## The Third Attempt: Gina
In August 2024, the Regierungsrat awarded a new contract. Vendor: Glaux Group. Product: "Gina."
### The Cost
CHF 36.5 million. More than double Juris X. Four times the original 2008 budget.
### The Reaction
Parliamentary alarm. Public criticism. Questions about why the canton keeps failing at the same task.
### The Procurement
The contract was awarded "freihändig"—without competitive bidding. The Justizdirektion argued urgency: they couldn't wait for a full procurement process while running 30-year-old software.
This argument might be more compelling if they hadn't spent 16 years getting to this point.
## The Maintenance Trap
While Gina is developed, the legacy system must continue operating. The canton approved CHF 4.8 million just to keep the old software running and maintained.
{{< irony title="The Sunk Cost Spiral" >}}
Total spending on replacing a system that still isn't replaced:
- First project: CHF 24 million (cancelled)
- Juris X: CHF 15.6 million (failed)
- Gina: CHF 36.5 million (in progress)
- Legacy maintenance: CHF 4.8 million/year
**Running total: CHF 76+ million**
For comparison: the original 2008 budget was CHF 8 million.
{{< /irony >}}
## The Pattern
Zürich's Juris X saga exemplifies Swiss public IT dysfunction:
### Optimistic Planning
Initial budgets assume everything goes right. Nothing ever goes right.
### Scope Creep
Requirements expand. Complexity grows. Timelines slip.
### Contractor Dependency
The canton lacks internal IT capability. They depend entirely on external vendors who have misaligned incentives.
### Political Paralysis
Cancelling a project is politically painful. Continuing a failing project is politically easier—until it isn't.
### No Learning
Each failed project is treated as unique. The same mistakes repeat.
## The Legacy System Paradox
The 30-year-old software keeps running because:
- Nobody fully understands it
- The people who built it are retired or dead
- Documentation is incomplete or missing
- Modern developers don't want to touch it
- It somehow still works
{{< conclusion >}}
The Canton of Zürich has spent 16 years and over CHF 76 million trying to replace case management software. The software remains unreplaced. The justice system runs on code older than many of its employees.
This is not a story about technology failing. The technology to build case management systems is well understood. Thousands of organizations worldwide have done it successfully.
This is a story about institutional failure—about governance structures that cannot deliver, oversight that doesn't oversee, and a political system that finds it easier to continue failing than to fundamentally reform how it approaches IT.
The 30-year-old system will keep running. The committees will keep meeting. The millions will keep flowing. And someday—perhaps—Gina will finally work.
Or perhaps we'll be writing about Juris Z in 2030.
{{< /conclusion >}}
<div class="sources">
### Sources
- [NZZ: IT-Flop in Zürich](https://www.nzz.ch/meinung/it-flop-in-zuerich-wenn-behoerden-digitalisieren-geht-es-zu-oft-schief-ld.1772142) ([archive.org](https://web.archive.org/web/20231230011015/https://www.nzz.ch/meinung/it-flop-in-zuerich-wenn-behoerden-digitalisieren-geht-es-zu-oft-schief-ld.1772142) &#124; [archive.is](https://archive.ph/20231228163615/https://www.nzz.ch/meinung/it-flop-in-zuerich-wenn-behoerden-digitalisieren-geht-es-zu-oft-schief-ld.1772142))
- [Inside-IT: Scheitern mit Ansage](https://www.inside-it.ch/scheitern-mit-ansage-heftige-kritik-aus-der-politik-fuer-zuercher-it-projekt-juris-x-20240308) ([archive.org](https://web.archive.org/web/20240327071646/https://www.inside-it.ch/scheitern-mit-ansage-heftige-kritik-aus-der-politik-fuer-zuercher-it-projekt-juris-x-20240308))
- [Tages-Anzeiger: Debakel für Zürcher Justizdirektion](https://www.tagesanzeiger.ch/debakel-fuer-zuercher-justizdirektion-it-projekt-gescheitert-ueber-30-jahre-alte-software-wird-nicht-erneuert-884320881718)
- [NZZ: IT-Debakel in Justizdirektion - Kanton Zürich entscheidet sich für neue Software](https://www.nzz.ch/zuerich/it-debakel-in-justizdirektion-kanton-zuerich-entscheidet-sich-fuer-neue-software-ld.1845484)
- [NZZ: Freihändige Vergabe und explodierende Kosten](https://www.nzz.ch/zuerich/zwei-flops-scharfe-kritik-und-ein-positiver-pruefbericht-die-odyssee-eines-it-projekts-das-die-zuercher-behoerden-schier-zur-verzweiflung-gebracht-hat-ld.1891714)
</div>

View File

@@ -0,0 +1,137 @@
---
title: "SECO IT Corruption: CHF 99 Million in Contracts, CHF 1.7 Million in Bribes"
subtitle: "When a single civil servant awards contracts without bidding and nobody notices for a decade"
category: "Investigation"
date: 2021-02-18
tags: ["SECO", "Corruption", "Federal Government", "IT Procurement", "Bribery"]
---
## The Numbers
| Metric | Value |
|--------|-------|
| IT contracts awarded | CHF 99 million |
| Bribes received | CHF 1.7 million |
| Duration of scheme | ~10 years |
| Contracts awarded without public bidding | Hundreds |
| Internal controls that caught this | 0 |
| Discovered by | Investigative journalists |
## The Setup
The State Secretariat for Economic Affairs (SECO) is one of Switzerland's most important federal agencies. It handles economic policy, labor market issues, and international trade relations. Like all federal agencies, it needs IT systems.
For years, one employee was responsible for a significant portion of SECO's IT procurement. He had authority. He had relationships with contractors. He had, apparently, no meaningful oversight.
## The Scheme
The arrangement was straightforward:
1. SECO employee identifies IT needs
2. Employee awards contracts to preferred vendors—without public bidding
3. Vendors provide "benefits" to employee
4. Repeat for approximately a decade
{{< irony >}}
The "benefits" included:
- Cash payments
- Event sponsorships
- Invitations to functions
- Football match tickets
- Various other gifts
Total value: CHF 1.7 million. Average annual bribe: approximately CHF 170,000—more than most Swiss civil servant salaries.
{{< /irony >}}
## The Scale
Over the years, the employee directed hundreds of IT contracts to preferred vendors. The total value: **CHF 99 million**.
Not all of these contracts were necessarily overpriced or unnecessary. But they were awarded outside proper procurement processes. Other vendors never had a chance to compete. The federal government never knew if it was getting value for money.
## The Discovery
How was this decade-long scheme uncovered?
Not by internal audit. Not by supervisors. Not by the Federal Finance Control. Not by any of the oversight mechanisms that supposedly exist to prevent exactly this kind of corruption.
**Investigative journalists at Tages-Anzeiger and Der Bund broke the story in 2014.**
Reporters did the work that institutional controls failed to do. They found the patterns. They asked the questions. They exposed the corruption.
## The Trial
The case eventually reached the Federal Criminal Court:
- The SECO employee faced charges of corruption and accepting bribes
- Three entrepreneurs faced charges of bribery and criminal mismanagement
- The trial revealed the full extent of the arrangement
{{< irony title="The Defense" >}}
Various parties offered explanations. The contracts were legitimate. The relationships were professional. The gifts were customary business courtesies.
CHF 1.7 million in customary business courtesies.
{{< /irony >}}
## The System Failure
The SECO case raises uncomfortable questions about Swiss federal IT procurement:
### No Segregation of Duties
One person could identify needs, select vendors, and award contracts. The most basic principle of financial controls—separating these functions—was apparently absent.
### No Competitive Bidding
Hundreds of contracts awarded without public tender. In a system that supposedly requires competitive bidding for significant expenditures.
### No Pattern Detection
Year after year, contracts flowed to the same vendors. Nobody noticed. Nobody asked why.
### No Whistleblowers
In a decade, nobody inside SECO raised concerns. Either nobody knew, nobody cared, or nobody dared.
## The Broader Context
SECO wasn't alone. The same period saw:
- **INSIEME** at the Federal Tax Administration (CHF 116 million, corruption charges)
- **Various other scandals** across federal agencies
- **A pattern** of IT procurement failures
The federal government's IT procurement was, by all evidence, systemically broken.
## What Changed?
After SECO, after INSIEME, after scandal after scandal, the federal government promised reforms:
- Stricter oversight
- Better segregation of duties
- More competitive bidding
- Enhanced whistleblower protections
Whether these reforms have teeth remains to be seen. New scandals continue to emerge. The structural incentives that enabled SECO—concentrated authority, inadequate oversight, a culture that doesn't question—persist in various forms.
## The Accountability Gap
The individuals involved faced prosecution. This is appropriate.
But what about the institution that allowed this to happen for a decade? What about the supervisors who didn't supervise? The auditors who didn't audit? The colleagues who didn't question?
{{< conclusion >}}
The SECO IT corruption scandal demonstrates that Swiss federal administration can harbor decade-long procurement fraud without internal detection. It took journalists—not auditors, not supervisors, not whistleblowers—to expose the scheme.
CHF 99 million in contracts. CHF 1.7 million in bribes. Zero internal controls that worked.
The individuals were eventually prosecuted. The system that created them remains largely intact. Somewhere in Bern, other procurement officers have similar authority, similar vendor relationships, and similar lack of oversight.
Will they resist temptation? Perhaps. But the SECO case proved that the system won't catch them if they don't.
{{< /conclusion >}}
<div class="sources">
### Sources
- [SWI: Swiss public sector scandal reaches court room](https://www.swissinfo.ch/eng/business/swiss-public-sector-scandal-reaches-court-room/46835944)
- [SWI: Four indicted in federal IT corruption case](https://www.swissinfo.ch/eng/politics/bribery-and-misconduct_four-indicted-in-federal-it-corruption-case/45267664)
- [Watson: Korruption beim BAFU: Die lange Liste der IT-Millionengräber des Bundes](https://www.watson.ch/schweiz/articles/651863749-korruption-beim-bafu-die-lange-liste-der-it-millionengraeber-des-bundes)
</div>

View File

@@ -0,0 +1,143 @@
---
title: "Swiss E-Voting: The Hackers Were Right"
subtitle: "How security researchers killed Switzerland's 'third way' of voting in weeks"
category: "Investigation"
date: 2020-08-22
tags: ["E-Voting", "Security", "Swiss Post", "Democracy", "Cryptography"]
---
## The Numbers
| Metric | Value |
|--------|-------|
| Years of pilot programs | 15+ (since 2004) |
| Cantons offering e-voting (peak) | 9 |
| Cantons offering e-voting (2020) | 0 |
| Time to find critical flaw | Weeks (public testing) |
| Citizens who could vote online (2019) | ~300,000 Swiss abroad |
| Citizens who can vote online (2020) | 0 |
## The Promise
Switzerland, land of direct democracy, wanted to modernize. Citizens vote on everything—federal initiatives, cantonal measures, municipal decisions. Postal voting already worked well. Why not add a digital option?
E-voting would be the "third way"—alongside polling stations and postal ballots. Swiss abroad could participate easily. Young voters might engage more. Switzerland would lead the world in digital democracy.
## The Two Systems
By 2019, Switzerland had narrowed to two e-voting systems:
### Swiss Post System
Developed with Scytl, a Spanish company specializing in election technology. Used cryptographic protocols for vote verification. Deployed in multiple cantons.
### Geneva System
Developed by the Canton of Geneva. Open-source approach. Used in Geneva and available to other cantons.
## The Public Intrusion Test
In early 2019, Swiss Post opened their system to public security testing. Researchers worldwide were invited to find vulnerabilities. Cash bounties awaited those who succeeded.
They succeeded.
## The Melbourne Discovery
Researchers from the University of Melbourne examined the cryptographic protocols. What they found was devastating:
{{< irony >}}
A flaw in the system's commitment scheme could allow **undetectable vote manipulation** during the shuffling phase.
Not a minor vulnerability. Not a theoretical attack. A fundamental cryptographic error that meant votes could be changed without anyone—voters, auditors, or officials—knowing.
{{< /irony >}}
The researchers described the system as having:
- Poor design
- High complexity
- Possibility of altering votes during shuffling without detection
## The Collapse
### March 2019
Swiss Post pulls the plug on their system just before a nationwide vote scheduled for May 19. Security concerns make deployment impossible.
### June 2019
The federal government abandons plans to recognize e-voting as an official "third way" to vote.
### July 2019
Swiss Post scraps the entire system. They announce plans to develop a new one from scratch.
### Meanwhile in Geneva
The Canton of Geneva abandons their system too—not for security reasons, but because they can't afford to maintain it alone.
**Result:** Nine cantons that had been offering e-voting had to stop. The entire Swiss e-voting infrastructure collapsed within months.
## The Political Backlash
Parliament wasn't pleased:
> Politicians in the larger parliamentary chamber voted (100 to 75, with 7 abstentions) in favour of a proposal to halt trials of the technology altogether.
A citizens' initiative was launched to ban online voting for at least five years, until the system could be proven secure.
## The Deeper Problem
The Swiss Post system wasn't built by amateurs. Scytl was a specialist company. Cryptographic experts were consulted. Testing protocols were followed.
And yet:
{{< irony title="The Security Testing Irony" >}}
The critical flaw was found within weeks of opening the code to public scrutiny.
For years, the system had been deployed in actual elections while this vulnerability existed. Voters in multiple cantons had cast ballots through a system that could theoretically have been compromised without detection.
Nobody knows if it ever was. That's the point.
{{< /irony >}}
## The Scytl Factor
Swiss Post's partner Scytl had a troubled history:
- Deployed systems in elections worldwide
- Faced criticism from security researchers repeatedly
- Filed for bankruptcy in 2020
- Assets acquired by another company
Switzerland had entrusted its democratic infrastructure to a company that would shortly cease to exist.
## What Was Never Answered
- How many votes were cast through the vulnerable system over the years?
- Were any elections affected?
- Who approved the cryptographic design?
- What review process failed to catch the flaw before public testing?
These questions remain largely unanswered. The system is gone. The cantons have moved on. The voters who used it will never know if their votes were counted correctly.
## The Restart
By December 2020, the Confederation launched a "redesigned" e-voting trial. Swiss Post fixed their protocol and reimplemented much of the system.
But the damage was done. Trust was broken. The "third way" of voting remained a pilot project rather than an official channel.
As of 2025, most Swiss abroad still cannot vote online. The country that pioneered direct democracy fell behind nations with far less democratic tradition in providing digital voting access.
## The Verdict
{{< conclusion >}}
Swiss e-voting failed not because the technology was impossible, but because the implementation was rushed, the oversight was inadequate, and the response to criticism was defensive rather than constructive.
Security researchers—outside the system, unpaid beyond bug bounties—found in weeks what years of official development had missed. This is not an indictment of the researchers. It's an indictment of the process that made their work necessary.
Switzerland spent 15 years building e-voting infrastructure. It took one public test to prove it wasn't ready. The hackers were right.
{{< /conclusion >}}
<div class="sources">
### Sources
- [SWI: These are the arguments that sank e-voting in Switzerland](https://www.swissinfo.ch/eng/politics/e-voting_these-are-the-arguments-that-sank-e-voting-in-switzerland/45136608) ([archive.org](https://web.archive.org/web/20190802132328/https://www.swissinfo.ch/eng/politics/e-voting_these-are-the-arguments-that-sank-e-voting-in-switzerland/45136608))
- [SWI: E-voting dealt another political blow](https://www.swissinfo.ch/eng/politics/parliament_e-voting-dealt-another-political-blow/45425298)
- [SWI: E-voting suffers another setback amid expat Swiss concerns](https://www.swissinfo.ch/eng/politics/digital-democracy_e-voting-suffers-another-setback-amid-expat-swiss-concerns/45059918)
- [Wikipedia: Electronic voting in Switzerland](https://en.wikipedia.org/wiki/Electronic_voting_in_Switzerland)
- [Library of Congress: Switzerland New Legislation on E-Voting](https://www.loc.gov/item/global-legal-monitor/2022-08-04/switzerland-new-legislation-on-e-voting-trials-enters-into-force/)
</div>

View File

@@ -0,0 +1,148 @@
---
title: "Swisscom: 8 Hours Without Emergency Calls"
subtitle: "When Switzerland's telecom monopoly took the emergency numbers offline during a flood"
category: "Investigation"
date: 2024-07-15
tags: ["Swisscom", "Infrastructure", "Telecom", "Emergency Services", "Outage"]
---
## The Numbers
| Metric | Value |
|--------|-------|
| Duration of outage | 8 hours |
| Emergency numbers affected | 112, 117, 118, 144 |
| Weather conditions | Torrential rain, flood warnings |
| Cause | Software update "domino effect" |
| Previous major outage | January 2020 |
| CEO response | "The failure shook me a lot" |
## The Day Emergency Calls Stopped Working
In 2024, during severe weather that was increasing flood risks across Switzerland, Swisscom's network failed. For **eight hours**, Swiss callers could not reach emergency services:
- **112** — European emergency number
- **117** — Police
- **118** — Fire brigade
- **144** — Ambulance
People experiencing emergencies—fires, medical crises, crimes in progress—could not call for help through normal channels.
This happened while torrential rain was raising flood risks. The timing could hardly have been worse.
## The Cause
Swisscom's explanation:
> "A software update led to a malfunction that triggered a domino effect."
The company was performing maintenance on its telephone platform for business customers. Something went wrong. The failure cascaded. Emergency services went dark.
{{< irony >}}
Switzerland's critical telecommunications infrastructure was taken offline by a maintenance update.
Not a cyberattack. Not a natural disaster. Not sabotage. A software update—the kind of routine operation that happens thousands of times daily in telecom networks worldwide.
{{< /irony >}}
## The Apology
Swisscom CEO Urs Schaeppi responded:
> "I apologise to the firefighters and everyone involved. The failure shook me a lot. That is absolutely not what we expect from ourselves at Swisscom."
He dismissed accusations that spending cuts or organizational restructuring were to blame:
> "Our networks are among the best in the world."
## The Pattern
This wasn't Swisscom's first major outage:
### January 2020
A defective component caused the Swisscom landline network to crash, affecting most of the country.
### September 2023
Thousands of Swisscom customers couldn't access the internet during morning rush hour. The outage lasted almost an hour. Swisscom received 8,000 complaints.
### 2024
The emergency services outage—eight hours, during a flood warning.
## The Monopoly Problem
Swisscom isn't just any telecom provider. It's:
- Majority-owned by the Swiss Confederation (51%)
- The dominant fixed-line and mobile provider
- The carrier of last resort for many services
- Effectively irreplaceable for emergency telecommunications
When Swisscom fails, Switzerland doesn't have a backup. There's no failover to an alternative national network. The redundancy that exists in other countries—multiple carriers, multiple paths—is limited in Switzerland's concentrated telecom market.
{{< irony title="The 'Best Networks in the World'" >}}
CEO Schaeppi's claim that Swisscom's networks are "among the best in the world" is difficult to reconcile with:
- 8 hours without emergency calls
- Multiple major outages in 4 years
- A software update taking down critical infrastructure
"Best in the world" networks typically don't lose emergency services for an entire workday.
{{< /irony >}}
## What Should Have Happened
Telecom networks serving emergency services are supposed to have:
### Redundancy
Multiple paths for critical calls. If one system fails, another takes over.
### Staged Rollouts
Software updates deployed gradually, with ability to roll back if problems emerge.
### Circuit Breakers
Automatic isolation of failing components before they cause cascading failures.
### Real-Time Monitoring
Immediate detection of degraded service, with automatic alerts and failover.
Something in this chain failed catastrophically. A software update affected emergency services for eight hours before resolution.
## The Accountability Question
When emergency services fail, questions arise:
- Who authorized the maintenance during severe weather?
- Why didn't failover systems engage?
- Why did recovery take eight hours?
- What happens to people who couldn't reach emergency services?
The CEO apologized. The company investigated. Reports were written.
But Swisscom remains the dominant carrier. Its monopoly position is unchanged. The structural factors that made this outage possible—concentration, limited redundancy, aging infrastructure—persist.
## The Infrastructure Reality
Switzerland prides itself on reliability. Swiss trains run on time. Swiss watches are precise. Swiss engineering is legendary.
But Swiss telecommunications infrastructure—the system that carries emergency calls—failed when people needed it most.
{{< conclusion >}}
Swisscom's eight-hour emergency services outage during flood conditions demonstrated that Switzerland's critical telecommunications infrastructure can fail catastrophically from routine maintenance.
The company apologized. The CEO was "shook." The networks are supposedly "among the best in the world."
And yet: a software update took down emergency services for eight hours.
Switzerland's telecom infrastructure is a monopoly with limited redundancy, operated by a company that has had multiple major outages in recent years. The 2024 emergency services failure wasn't an aberration—it was a predictable consequence of structural factors that remain unaddressed.
When the next outage comes—and it will—the same questions will be asked. The same apologies will be issued. And people who can't reach emergency services will hope someone noticed their situation through other means.
{{< /conclusion >}}
<div class="sources">
### Sources
- [SWI: Swisscom boss says sorry for network failure](https://www.swissinfo.ch/eng/politics/swisscom-boss-says-sorry-for-network-failure/46784822)
- [World Radio Switzerland: Swisscom users lose internet](https://www.worldradio.ch/news/bitesize-news/swisscom-users-lose-internet/)
- [Le News: Switzerland's PostBus scandal - entire management team suspended](https://lenews.ch/2018/06/12/switzerlands-postbus-scandal-entire-management-team-suspended/)
</div>

View File

@@ -0,0 +1,212 @@
/* ============================================
Article Card Component
Homepage article list cards
============================================ */
.article-card {
margin-bottom: var(--space-8);
background-color: var(--color-bg-elevated);
border-radius: var(--radius-md);
box-shadow: var(--shadow-sm);
transition: box-shadow var(--duration-normal) var(--ease-default),
transform var(--duration-normal) var(--ease-out);
overflow: hidden;
}
.article-card:hover {
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
.article-card--featured {
border-left: var(--border-width-heavy) solid var(--color-accent-cardinal);
}
.article-card__link {
display: block;
padding: var(--space-6);
text-decoration: none;
color: inherit;
}
.article-card__link:focus-visible {
outline: var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color);
outline-offset: calc(var(--focus-outline-offset) * -1);
border-radius: var(--radius-md);
}
/* Header with category and date */
.article-card__header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--space-3);
}
.article-card__category {
font-family: var(--font-ui);
font-size: var(--font-size-xs);
font-weight: var(--font-weight-bold);
text-transform: uppercase;
letter-spacing: var(--letter-spacing-widest);
color: var(--color-accent-cardinal);
}
.article-card__date {
font-family: var(--font-ui);
font-size: var(--font-size-xs);
color: var(--color-text-tertiary);
}
/* Title */
.article-card__title {
font-size: var(--font-size-xl);
font-weight: var(--font-weight-bold);
line-height: var(--line-height-snug);
color: var(--color-text-primary);
margin: 0 0 var(--space-2);
transition: color var(--duration-fast) var(--ease-default);
}
.article-card:hover .article-card__title {
color: var(--color-accent-cardinal);
}
/* Subtitle */
.article-card__subtitle {
font-family: var(--font-serif);
font-size: var(--font-size-base);
font-style: italic;
color: var(--color-text-secondary);
line-height: var(--line-height-relaxed);
margin: 0 0 var(--space-4);
}
/* Highlights list */
.article-card__highlights {
font-family: var(--font-ui);
font-size: var(--font-size-sm);
color: var(--color-text-tertiary);
}
.article-card__highlights ul {
margin: 0;
padding-left: var(--space-5);
}
.article-card__highlights li {
margin-bottom: var(--space-1);
line-height: var(--line-height-normal);
}
.article-card__highlights li::marker {
color: var(--color-accent-navy);
}
/* CTA */
.article-card__cta {
display: inline-block;
margin-top: var(--space-4);
font-family: var(--font-ui);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
color: var(--color-accent-navy);
transition: color var(--duration-fast) var(--ease-default);
}
.article-card:hover .article-card__cta {
color: var(--color-accent-cardinal);
}
/* ========================================
Dark Mode
======================================== */
[data-theme="dark"] .article-card {
background-color: var(--color-bg-elevated);
box-shadow: var(--shadow-sm), 0 0 0 1px rgba(255, 255, 255, 0.05);
}
[data-theme="dark"] .article-card--featured {
border-left-color: var(--color-accent-cardinal);
}
/* ========================================
High Contrast Mode
======================================== */
[data-theme="high-contrast"] .article-card {
border: 2px solid var(--color-border-strong);
}
[data-theme="high-contrast"] .article-card--featured {
border-left-width: 5px;
}
/* ========================================
Responsive
======================================== */
@media (max-width: 768px) {
.article-card__link {
padding: var(--space-4);
}
.article-card__title {
font-size: var(--font-size-lg);
}
.article-card__header {
flex-direction: column;
align-items: flex-start;
gap: var(--space-1);
}
}
/* ============================================
Homepage Layout
============================================ */
.homepage {
max-width: var(--container-max);
margin: 0 auto;
padding: var(--space-8) var(--container-padding) var(--space-16);
}
.homepage-header {
text-align: center;
margin-bottom: var(--space-12);
padding-bottom: var(--space-8);
border-bottom: var(--border-width) solid var(--color-border);
}
.homepage-title {
font-size: clamp(var(--font-size-3xl), 6vw, var(--font-size-5xl));
font-weight: var(--font-weight-black);
letter-spacing: var(--letter-spacing-tighter);
color: var(--color-text-primary);
margin: 0 0 var(--space-4);
}
.homepage-subtitle {
font-family: var(--font-serif);
font-size: var(--font-size-lg);
font-style: italic;
color: var(--color-text-secondary);
margin: 0;
}
.article-list {
max-width: 800px;
margin: 0 auto;
}
@media (max-width: 768px) {
.homepage {
padding: var(--space-6) var(--space-4) var(--space-12);
}
.homepage-header {
margin-bottom: var(--space-8);
}
}

View File

@@ -35,6 +35,7 @@
@import "components/_header.css"; @import "components/_header.css";
@import "components/_footer.css"; @import "components/_footer.css";
@import "components/_article.css"; @import "components/_article.css";
@import "components/_article-card.css";
@import "components/_accessibility-panel.css"; @import "components/_accessibility-panel.css";
/* ======================================== /* ========================================

View File

@@ -1,36 +1,14 @@
{{ define "main" }} {{ define "main" }}
<article class="article"> <div class="homepage">
{{/* Article Header */}} <header class="homepage-header">
<header class="article-header"> <h1 class="homepage-title">{{ .Title }}</h1>
{{ with .Params.category }}
<span class="article-category">{{ . }}</span>
{{ end }}
<h1 class="article-title">{{ .Title }}</h1>
{{ with .Params.subtitle }} {{ with .Params.subtitle }}
<p class="article-subtitle">{{ . }}</p> <p class="homepage-subtitle">{{ . }}</p>
{{ end }} {{ end }}
<div class="article-meta">
{{ with .Params.source }}
<span class="article-meta-item">
<svg class="article-meta-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
<path d="M14 2v6h6"></path>
<path d="M16 13H8"></path>
<path d="M16 17H8"></path>
<path d="M10 9H8"></path>
</svg>
{{ . }}
</span>
{{ end }}
</div>
</header> </header>
{{/* Article Body */}} <section class="article-list" aria-label="Investigations">
<div class="article-body">
{{ .Content }} {{ .Content }}
</section>
</div> </div>
</article>
{{ end }} {{ end }}

View File

@@ -0,0 +1,30 @@
{{/* Article Card Shortcode
Usage: {{< article-card
title="Article Title"
subtitle="Article subtitle"
category="Investigation"
date="December 2025"
link="/articles/slug/"
featured="true"
>}}
- Bullet point 1
- Bullet point 2
{{< /article-card >}}
*/}}
{{ $featured := eq (.Get "featured") "true" }}
<article class="article-card{{ if $featured }} article-card--featured{{ end }}" aria-labelledby="card-{{ .Get "link" | urlize }}">
<a href="{{ .Get "link" }}" class="article-card__link">
<header class="article-card__header">
<span class="article-card__category">{{ .Get "category" }}</span>
<time class="article-card__date" datetime="{{ .Get "date" }}">{{ .Get "date" }}</time>
</header>
<h2 class="article-card__title" id="card-{{ .Get "link" | urlize }}">{{ .Get "title" }}</h2>
<p class="article-card__subtitle">{{ .Get "subtitle" }}</p>
{{ with .Inner }}
<div class="article-card__highlights">
{{ . | markdownify }}
</div>
{{ end }}
<span class="article-card__cta" aria-hidden="true">Read Investigation →</span>
</a>
</article>