Cannabis Freedom Index

Changelog 558bb19tree, with Claude Opus 5.5

Country contexts and penalty tables: new sections, statuses, maps and links

Context sections - New sections in the profile YAML: recreational use, hemp and CBD, culture and traditions, genetics and heritage, research, and country spotlights (a titled list). `products` is being folded into them; production is shown as "Cannabis industry". - Every section has an info tooltip; Recreational and Medical show their status chip. - Hemp, Cannabis industry and Research carry an optional status with chips, world maps (/map/hemp/, /map/production/, /map/research/) and rankings columns. The map data, scores.json and map hover notes now take every status section automatically. - Chips inside context sections link to their full-page world map. - Profile texts may contain Markdown links; external links get a ↗ marker, and the build fails on a link to a history or culture page that does not exist. Penalty tables - Possession and cultivation may carry penalty steps (src/lib/penalties.js): amount, treatment, the law's term, punishment (minimum and maximum prison, caning, death penalty) and fine, plus comparable summary figures in /api/<country>.json. Countries filled as models: the Netherlands, Czechia, Germany, Uruguay, Singapore and Jamaica. Five history entries added (Dutch and Czech HHC bans, end of the Dutch medical grower contract, Germany's HHC ban and second Cannabis Act evaluation). Nigeria's 1994 entry cites Wikipedia for the 1999 peak again. Writing rules are in docs/DATA-MAINTENANCE.md ("Writing context sections well", "Penalty steps").

5 history entries added1 history entry edited6 country profiles edited19 files of code, design or docs +1,820 −159 lines

History changes.yaml

Added 5

Edited 1

Nigeria launches Operation Burn the Weeds

description

Launched in 1994, Operation Burn the Weeds became the title of Nigeria's ongoing eradicati … ced only after the Second World War.[@2] The area cleared peaked at 3,500 hectares in 1999; after.[@1,2] After that peak, and contrary to some international reports, relatively little was eradicated i … @2] Cannabis of Nigerian origin was trafficked onward to other West African countries.[@2]

Countries and states 6 files

Czechia countries/cz.yaml

context › production › text

There is no legal commercial market for recreational cannabis: growing for others and selling are crimes.[@z40] Medical cannabis growers needmay be grown only under a [five-year licence](/history/czechia-medical-cultivation-opened-2022/) from the State Institute for Drug Control, which inspectsgranted after it has inspected the cultivationgrowing site before granting it.[@z167] Personal growers aged 21+Hemp farming and the CBD trade are legal businesses within the 1% THC limit.[@z167] Since November 2025 licensed businesses may grow up to three plants for themselvesalso sell kratom under the new law on psychomodulatory substances; that permission doescannabis is not allow them to supply other peopleon that list.[@z167pm25, z40hhc26]

context › production › sources

z40, z167, z40pm25, hhc26

context › products › text

The personal-use rules cover home-grown cannabis and its processing within the plant and possession limits.[@z167] A legal commentary distinguishes ordinary drying or making ointments from manufacture using chemical extraction to concentrate cannabinoids, which remains a criminal offence.[@advd] Medical patients can obtain prescribed flower and extracts through pharmacies.[@sukl]

context › products › sources

z167, advd, sukl

context › medical › text

Patients receive medical flower or extracts on an electronic prescription, dispensed through pharmacies.[@sukl] Approved prescribers include general practitioners as well as the listed specialists; [since April 2025](/history/czechia-general-practitioners-2025/) GPs may prescribe for long-term pain that nothing else relieves, and by early 2026 more than 800 doctors were prescribing, over 250 of them GPs.[@sukl,ct26] Pharmacies dispensed a record amount in 2025, almost half as much again as in 2024.[@ct26] Public health insurance [covers 90%](/history/czechia-medical-insurance-2020/) of the cost of up to 30 g a month; reimbursement above that quantity needs the insurer's approval.[@sukl] The [State Institute for Drug Control](https://sukl.gov.cz/) licenses growers and publishes the list of prescribers.[@z167,ct26]

context › medical › sources

sukl, ct26, z167

sources

UNODC — World Drug Report 2026, annual prevalence of cannabis use (datasets/unodc-cannabis-use.csv) Radio Prague International — Recidivist large-scale marijuana grower, medical cannabis advocate Dušan Dvořák gets 3-year sentence (5 December 2019) e15 — Konopný byznys skokově roste, točí se v něm miliardy (photo gallery, Cannafest) ČT24 — Lékárny vydaly loni rekordní množství léčebného konopí (26 January 2026) FAOSTAT — hemp area harvested, Czechia (datasets/faostat-hemp.csv) ČT24 — Psychomodulační látky (topic page; ČTK reports of 23 May 2023 and 23 January 2024) Advokátní deník (ČTK) — Vláda zařadila konopný HHC na seznam zakázaných látek, držení bude trestné (17 March 2026) Advokátní deník (ČTK) — Navrhovaná změna protidrogové politiky představuje návrat před rok 1989 (10 June 2026) Právní prostor — Nařízení vlády č. 456/2025 Sb., o seznamu psychomodulačních látek (27 November 2025) Wikipedia — Lumír Ondřej Hanuš Devane, Hanuš, Breuer et al. — Isolation and structure of a brain constituent that binds to the cannabinoid receptor OpenAlex — works mentioning cannabis or cannabinoids, by author country (datasets/openalex-cannabis-papers.csv) ClinicalTrials.gov — registered studies with a cannabis or cannabinoid intervention, as of 26 October 2026 (datasets/clinicaltrials-cannabis.csv) 10 unchanged

segments › possession › currency

CZK

segments › possession › penalties

upto 25 g · treatment legal · note Amounts outside the home; at home every limit is four times higher (100 g, 200 g, 2 kg, 20 kg), over 25 g · upto 50 g · treatment civil · term Administrative offence (přestupek) · fine 50000, over 50 g · upto 500 g · treatment criminal · term Crime (trestný čin) · prison 6 months, over 500 g · upto 5 kg · treatment criminal · term Crime (trestný čin) · prison 3 years, over 5 kg · treatment criminal · term Crime (trestný čin) · prison min 6 months · prison 5 years

segments › cultivation › currency

CZK

segments › cultivation › penalties

upto 3 plants · treatment legal · note Adults aged 21 and over, on property they may use, over 3 plants · upto 5 plants · treatment civil · term Administrative offence (přestupek) · fine 50000, over 5 plants · upto 50 plants · treatment criminal · term Crime (trestný čin) · prison 6 months, over 50 plants · upto 500 plants · treatment criminal · term Crime (trestný čin) · prison 3 years, over 500 plants · treatment criminal · term Crime (trestný čin) · prison min 6 months · prison 5 years

context › recreational › text

There is still nowhere to buy cannabis legally, so adults who use it either grow their own, up to three plants, or buy from dealers.[@z167,z40] The national monitoring centre reports that home growing covers personal and community demand, and that dealers increasingly sell through social networks, darknet markets and couriers.[@nms25] Herbal cannabis seized by police in 2024 averaged 11% THC.[@nms25] Home growers may dry their harvest and make ointments, but concentrating cannabinoids by chemical extraction is still treated as illegal manufacture.[@advd] Giving any of it to a friend is a crime.[@z40]

context › recreational › sources

z167, z40, nms25, advd

context › hemp › status

high

context › hemp › text

[Since 2022](/history/czechia-hemp-one-percent-2022/) the law counts as technical hemp any plant from which no more than 1% THC can be obtained, or one grown from an EU-listed variety; it is not treated as cannabis, and the 1% line also runs through the criminal and administrative rules.[@z167,z40] Farmers growing more than 100 m² must report it.[@z167] Hemp is a small crop, about 140 hectares in 2024.[@fao] CBD products are sold openly.[@tight26] HHC, a semi-synthetic cannabinoid that had been sold in shops to anyone, minors included, was [moved onto the list of banned addictive substances](/history/czechia-hhc-banned-2026/) by the government on 16 March 2026, so holding it is now a crime.[@ct23,hhc26] In June 2026 the new government [announced plans](/history/czechia-tightening-plan-2026/) to cut the hemp limit to 0.3% and ban CBD products; none of this had been adopted.[@tight26]

context › hemp › sources

z167, z40, fao, ct23, hhc26, tight26

context › production › status

medical

context › culture › text

Czech cannabis culture is above all a culture of growing at home. Long before the 2026 law, the national monitoring centre found that home growers covered much of what people used, sharing with friends and their community.[@nms25] Use is common: UNODC puts past-year use at 9.4% of people aged 15 to 64 in 2023.[@unodc] Medicine is a thread running through it: the psychotherapist Dušan Dvořák and his association Konopí je lék ('cannabis is medicine') openly grew and handed out cannabis for patients for decades, until a three-year prison sentence in 2019 made him a cause célèbre.[@rp19] The chemist [Lumír Hanuš](/culture/people/lumir-hanus/) became one of the best-known voices for medical cannabis, and the drug coordinator [Jindřich Vobořil](/culture/people/jindrich-voboril/) of the push to regulate it.[@hanus,ct23] Every year Prague's exhibition grounds host Cannafest, a cannabis trade fair billed as one of the largest in the world.[@e15cf]

context › culture › sources

nms25, unodc, rp19, hanus, ct23, e15cf

context › research › text

Czech cannabis science goes back to Palacký University in Olomouc, where Zdeněk Krejčí's department reported antibacterial effects of cannabis in 1955, and where the chemist [Lumír Hanuš](/culture/people/lumir-hanus/) grew and analysed cannabis from the 1970s.[@hanus] In Jerusalem in 1992 he was first author of the paper describing [anandamide](/history/anandamide-discovered-1992/), the first cannabinoid found in the human brain.[@science92] Czech researchers publish around fifty papers on cannabis a year, 57 in 2025, and 14 clinical trials with a cannabis treatment had been registered in the country by October 2026.[@openalex,ctgov] The government's [National Monitoring Centre for Drugs and Addiction](https://www.drogy-info.cz/) reports every year on use, seizures, potency and the drug market.[@nms25]

context › research › sources

hanus, science92, openalex, ctgov, nms25

context › spotlights

Grow it, but don't share it, Twenty-one, not eighteen, A legal market for kratom first

Germany countries/de.yaml

segments › possession › text

Any adult may carry up to 25 g of dried cannabis.[@kcang3, bmg] Someone who has lived in G … g away from home, or more than 50 g and up to 60 g at home, is an administrative offence with a fine of up to €30,000; above that it is a crime with up to three years in prison or a fine.[@kcangkcang36, kcang34, bmg] Bringing cannabis into the country, or taking it out, is a crime.[@kcang2]

segments › possession › sources

bmg, kcang, kcang1, kcang2, kcang3, kcang34, kcang36

segments › cultivation › text

Someone who has lived in Germany for six months may grow up to three plants at that home, … mg] Cannabis above the 50 g home limit must be destroyed.[@bmg] A fourth plant is a crime with up to three years in prison or a fine, and growing to make a living from it up to five years.[@kcangkcang34]

segments › cultivation › sources

bmg, kcang, kcang1, kcang9, kcang34

context › production › text

Commercial recreational production is not permitted at all; associations must grow for their own members with member labour. Medical cultivation[@kcang] The [second step the government promised in 2023](/history/germany-two-pillar-plan-2023/), regional pilot projects with licensed shops, never became law, and importthe federal agriculture office refused applications for such pilots on that ground.[@tsp25] The legal cannabis business is medical. Growing and importing medical cannabis need a licence from the federal medicines agency, [BfArM](https://www.bfarm.de/).[@medcang] Imports of medical flower almost tripled, from about 73 tonnes in 2024 to 201 tonnes in 2025, mostly from Canada and Portugal; the pharmacists' association [ABDA](https://www.abda.de/) puts the jump down to the growing number of private prescriptions.[@abda26]

context › production › sources

kcang, tsp25, medcang, abda26

context › products › text

Associations may hand out only flower and hashish. Edibles such as THC gummies or cookies remain banned, as do extracts for the adult-use channel.

context › products › sources

bmg

context › medical › text

Cannabis is no longer a narcotic in law: any doctor can prescribe it on an ordinary prescr … navailable or unsuitable and there is a realistic chance of a noticeable benefit.[@sgb31] [From 30 July 2026](/history/germany-flower-reimbursement-ended-2026/), the date the insurers' doctors' association gives for the change, that cover no longer i … from approval.[@kbv] A private prescription is separate from this insured cover.[@bmg] A [government bill](/history/germany-medical-restrictions-bill-2025/) to require an in-person consultation before prescribing, aimed at telemedicine platforms, … e before the summer recess and had not been passed as of September 2026.[@juravendis, boc]

context › clubs › text

Non-commercial cultivation associations have been [legal since 1 July 2024](/history/germany-cultivation-associations-2024/), each needing a permit from its state. A member must have lived in Germany for six months … tate. Even at full production they would cover only about 3.5 to 4.3% of estimated demand.

context › driving › text

Driving with at least [3.5 ng of THC per millilitre of blood serum](/history/germany-driving-limit-2024/) is an administrative offence under section 24a, with a statutory fine ceiling of €3,000; c … th up to one year in prison or a fine, even without reaching the administrative threshold.

sources

The Golden Bough: The Magic Art and the Evolution of Kings, Part I, Volume I (third edition) Duden — Hasch DDR im Blick — Störung und Missbrauch des Reise- und Güterverkehrs Berlin–BRD (state security report, 1970) Gesetz über den Verkehr mit Suchtmitteln (Suchtmittelgesetz), Gesetzblatt der DDR, Teil I (1973) Wikipedia — Hanfparade Deutsche Welle via TNI/UNGASS on Drugs — German SPD health expert calls on next government to legalize cannabis (13 October 2021) Pew Research Center — In 25-country survey, Americans especially likely to view fellow citizens as morally bad (5 March 2026), survey of 2025 ABDA — Die Apotheke: Zahlen, Daten, Fakten 2026, pp. 90–91, Medizinisches Cannabis top agrar — Nische Nutzhanf: Das ist beim Anbau zu beachten (1 March 2024) top agrar — Nutzhanfanbau: Die Nische schrumpft (1 October 2025), on BLE figures BfR — Psychoaktive Wirkungen durch den Konsum von Hexahydrocannabinol (HHC)-haltigen Erzeugnissen zu erwarten, opinion 019/2025 (4 June 2025) Tagesspiegel Background — Konsumcannabis-Modellprojekte: BLE lehnt Modellvorhaben wegen fehlender zweiter Säule ab beck-aktuell — Bayern beschließt Cannabis-Verbot für Volksfeste und Biergärten (16 April 2024) OpenAlex — works mentioning cannabis or cannabinoids, by author country (datasets/openalex-cannabis-papers.csv) ClinicalTrials.gov — registered studies with a cannabis or cannabinoid intervention, as of 26 October 2026 (datasets/clinicaltrials-cannabis.csv) Universität Tübingen — Neue Zwischenergebnisse zur Evaluation des Konsumcannabisgesetzes (KCanG) (1 April 2026) Konsumcannabisgesetz § 34 — Strafvorschriften Konsumcannabisgesetz § 36 — Bußgeldvorschriften 19 unchanged

segments › possession › currency

EUR

segments › possession › penalties

upto 25 g · treatment legal · note Away from home; at home a resident may keep up to 50 g in total, over 25 g · upto 30 g · treatment civil · term Administrative offence (Ordnungswidrigkeit) · fine 30000 · note At home, over 50 g and up to 60 g, over 30 g · treatment criminal · term Crime (Straftat) · prison 3 years · note At home, over 60 g; a criminal fine instead of prison is possible, label A 'not small amount' (nicht geringe Menge), as set by the courts · treatment criminal · term Crime, especially serious case · prison min 3 months · prison 5 years

segments › cultivation › currency

EUR

segments › cultivation › penalties

upto 3 plants · treatment legal · note Residents of six months, at their home, over 3 plants · treatment criminal · term Crime (Straftat) · prison 3 years · note A criminal fine instead of prison is possible, label Growing commercially (gewerbsmäßig) · treatment criminal · term Crime, especially serious case · prison min 3 months · prison 5 years

context › recreational › text

Adults may [carry and use cannabis](/history/germany-cannabis-act-2024/), but there is still no shop to buy it in. The legal routes are growing three plants at home or joining a non-profit [growing association](/history/germany-cultivation-associations-2024/), and both are open only to people who have lived in Germany for six months.[@bmg,kcang1] Associations may hand out only flower and hashish; edibles such as THC gummies, and extracts, stay banned.[@bmg] The government's evaluation found that in 2024 associations supplied less than 0.1% of the cannabis adults used and pharmacies 12 to 14%, much of it on private prescriptions. Most still came from the illegal market, typically through friends and acquaintances rather than street dealers.[@dhv25,abda26] Researchers at the economic institute DIW found no structural change in how much people use in the short term.[@diw26]

context › recreational › sources

bmg, kcang1, dhv25, abda26, diw26

context › hemp › status

standard

context › hemp › text

Only farms may grow hemp, from certified EU varieties with at most 0.3% THC. Sowing must be reported to the [Federal Office for Agriculture and Food](https://www.ble.de/) by 1 July, which also tests plants during flowering.[@nh24] After a record in 2024, the area fell in 2025 to 5,274 hectares on 496 farms, with Lower Saxony growing the most.[@nh25] HHC, a semi-synthetic cannabinoid that had been sold as a legal alternative, has been [banned under the law on new psychoactive substances](/history/germany-hhc-banned-2024/) since 21 June 2024, including its possession. The Federal Institute for Risk Assessment still found HHC gummies on sale in 2025, and makers switching to untested relatives of it.[@bfr25]

context › hemp › sources

nh24, nh25, bfr25

context › production › status

medical

context › culture › text

Hemp was once a farm crop with customs of its own. In Swabia and Baden young couples jumped the Midsummer fire hand in hand so that the hemp would grow 'three ells high', one of the rites James Frazer collected in The Golden Bough; it is described in [the hemp dance](/culture/traditions/the-hemp-dance/).[@frazer] The modern story begins with [Hasch](/culture/traditions/hasch-in-the-gdr/), the word and the drug of West Germany's student movement of the late 1960s.[@duden] Across the border, East German state security reported hashish smuggled along the transit routes to West Berlin in 1970, and the GDR wrote its own narcotics law in 1973.[@ddr70,ddr73] Campaigners have marched in the [Hanfparade in Berlin](/history/germany-hanfparade-1997/) every August since 1997.[@hanfp] The 2024 law is closely tied to [Karl Lauterbach](/culture/people/karl-lauterbach/), a doctor who opposed legalisation for years, changed his mind in 2021 and steered it through as health minister.[@dw21] Germans remain divided: in a 2025 Pew survey 31% called using marijuana morally acceptable, 25% unacceptable and 42% not a moral question.[@pew26]

context › culture › sources

frazer, duden, ddr70, ddr73, hanfp, dw21, pew26

context › research › status

licensed

context › research › text

German researchers published 260 papers on cannabis in 2025, and 41 clinical trials with a cannabis treatment had been registered in Germany by October 2026.[@openalex,ctgov] The Cannabis Act itself is being studied: the law requires an evaluation, run by the [EKOCAN project](https://www.uke.de/ekocan) at the universities of Hamburg, Düsseldorf and Tübingen. Its first interim report, in October 2025, estimated adult demand at about 743 tonnes a year and traced where the cannabis came from.[@dhv25] The [second, in April 2026](/history/germany-second-evaluation-2026/), found a growing share coming from home growing and pharmacies, no rise in use that could be put down to the reform, and fewer young people sent to early-intervention programmes; it also said routine prescribing of high-THC medical cannabis was not justified by studies.[@eko26] Researchers may hold, grow or import cannabis for science only with a permit, and doing so without one is a crime.[@kcang34]

context › research › sources

openalex, ctgov, dhv25, eko26, kcang34

context › spotlights

Legal to have, almost nowhere to get, The prescription boom, Bavaria's own rules

Jamaica countries/jm.yaml

segments › possession › sources

moj15, fact

segments › cultivation › sources

moj15, fact

context › production › text

The Cannabis Licensing Authority issues cultivator, processor, transporter, retail and research licences in tiers by size.[@cla] The legal industry is small but growing: the regulator put its value at US$63.5 million in 2025, up from US$38.9 million in 2024, on 15.4 hectares of licensed land, and the first four exports of ganja products, oils, balms and lotions, left the island that year.[@gl26] Fees, security rules and banking problems kept many traditional small growers outside the legal industry; in 2026 the authority [widened fee-free routes in for them](/history/jamaica-small-grower-routes-2026/), with two-year transition periods and collective cultivation of up to ten acres for community groups.[@cla,mh]

context › production › sources

cla, gl26, mh

context › products › text

Licensed retailers offer flower, oils, edibles and other preparations for medical or therapeutic purposes. Hemp is licensed separately.

context › products › sources

cla, fact

sources

Wikipedia — Cannabis in Jamaica Ganja in Jamaica: A Medical Anthropological Study of Chronic Marihuana Use Comitas Institute for Anthropological Study — Lighting the Chalice, JA–RT 004 (5 August 1969) Michael Barnett — The Legacy of Charismatic Leadership in the Rastafari Movement, IDEAZ 15 (2020), pp. 56–79 Wikipedia — Peter Tosh Wikipedia — Manley West 13 unchanged

segments › possession › currency

JMD

segments › possession › penalties

upto 2 oz · treatment civil · term Ticket (fixed penalty notice) · fine 500 · note No arrest, court or criminal record; under-18s and dependent users are also sent for counselling. Rastafari and medical patients are exempt, over 2 oz · treatment criminal · term Criminal offence · note A fine, prison or both, and a criminal record

segments › cultivation › penalties

upto 5 plants · treatment legal · note Per household, on its own premises, over 5 plants · treatment criminal · term Criminal offence · note Unless licensed, or authorised for Rastafari sacramental or research purposes

context › recreational › text

Ganja is part of everyday Jamaican life, but there is still no legal recreational market. Since 2015 an adult with up to 2 ounces gets a J$500 ticket instead of an arrest, and a household may grow five plants.[@moj15] Licensed herb houses sell flower, oils and edibles, but only for medical or therapeutic use, on a doctor's recommendation or, for visitors, a permit.[@cla,fact] Most ganja is still grown and sold outside the licensed system, and tourists and locals alike buy it on the street.[@ap21,gl26]

context › recreational › sources

moj15, cla, fact, ap21, gl26

context › hemp › status

high

context › hemp › text

The law defines hemp as a ganja plant with less than 1% THC and takes it out of the ganja rules; growing, processing and trading it need a licence from the [Cannabis Licensing Authority](https://www.cla.org.jm/).[@moj15] Hemp can be made into cloth, paper and rope, and into medicines, drinks and cosmetics.[@moj15]

context › hemp › sources

moj15

context › production › status

medical

context › culture › text

Ganja came to Jamaica with indentured labourers from India in the mid-19th century, and the Hindi word [ganja](/culture/language/ganja/) came with it.[@cjm] By the early 1970s it was drunk as [tea](/culture/traditions/ganja-tea-in-jamaica/) and tonic in rural households far more than it was smoked, as the anthropologists Vera Rubin and Lambros Comitas found in the national study they [published in 1972](/history/jamaica-ganja-study-published-1972/).[@rubin] For [Rastafari](/culture/traditions/rastafari-sacrament/) it became a sacrament, smoked in shared reasoning; the early preacher [Leonard Howell](/culture/people/leonard-howell/) founded Pinnacle, a community that grew it with its food until colonial police broke it up.[@rasta,howell] Reggae carried the herb to the world through singers such as [Bob Marley](/culture/people/bob-marley/) and [Peter Tosh](/culture/people/peter-tosh/), whose 1976 album Legalize It made legalisation a song.[@tosh]

context › culture › sources

cjm, rubin, rasta, howell, tosh

context › research › status

licensed

context › research › text

Jamaican doctors turned folk knowledge into medicine. The pharmacologist Manley West and the eye surgeon Albert Lockhart of the University of the West Indies noticed that fishermen who drank ganja tea saw better at night, and after years of work produced Canasol, an eye drop for glaucoma, and later Asmasol for asthma; both men received the Order of Merit.[@west] Today accredited universities and bodies approved by the Scientific Research Council may grow ganja for research under a licence.[@moj15]

context › research › sources

west, moj15

context › spotlights

A sacrament in law, Ganja's farmers, outside the ganja industry

Netherlands countries/nl.yaml

segments › possession › text

Cannabis is formally illegal under the Opium Act. Under the toleration policy the Public Prosecution Service does not prosecute possession of up to 5 g of marijuana or hash, though police may still confiscate it.[@gov] Larger amounts can be prosecuted: up to 30 g is a minor offence with at most a month's detention or a €5,500 fine, and more than 30 g is a crime with up to two years in prison or a €110,000 fine.[@ow11,sr23]

segments › possession › sources

gov, ow11, sr23

segments › cultivation › text

Not legal. Up to five plants for personal use are normally not prosecuted, but police will seize them. More than five plants is prosecuted, growers face back-charges for electricity, and tenants risk eviction.[@gov] Growing is a crime with up to two years in prison, or six years when done as a business.[@ow11,sr23]

segments › cultivation › sources

gov, ow11, sr23

context › production › text

Production has always been illegal —For decades coffeeshops could sell cannabis but nobody could legally grow it for them: the 'back door' problem. Since April 2025 an[@gov] An experiment letschanges this in ten municipalities: Almere, Arnhem, Breda, Groningen, Heerlen, Maastricht, Nijmegen, Tilburg, Voorne aan Zee and Zaanstad. Up to ten licensed growers legally supply all coffeeshops in ten participating municipalitiesthem, running through 2029tracked from plant to sale; [since 7 April 2025](/history/netherlands-regulated-supply-only-2025/) the shops there may sell nothing else.[@tri26,exp] The growers report heavy start-up costs, and hashish was short at first.[@tri26] Medicinal cannabis was grown by one company under contract to the state until 2026.[@mc26] Everywhere else, supply remains criminalgrowing for sale is a crime.[@gov]

context › production › sources

gov, exp, govtri26, mc26

context › products › text

Coffeeshops sell flower and hashish, plus edibles such as space cake. Concentrates are in a weaker position, and the experiment's products are tested and labelled.

context › products › sources

exp, gov

context › medical › text

Doctors have been able to prescribe pharmacy-dispensed medicinal cannabis since 2003, produced under contract for. Pharmacies dispense it as dried flower from the government's [Office of Medicinal Cannabis](https://www.cannabisbureau.nl/), which holds a legal monopoly on buying and selling it.[@bmc,mc26] Health insurers usually do not reimbursepay for it.[@bmc] The office's [contract with its only Dutch grower ended on 1 January 2026](/history/netherlands-medical-grower-contract-ends-2026/). It is supplying pharmacies from stock for now, will switch to imported cannabis in the course of 2027, and will stop exporting to patients abroad at the end of 2026. The government plans a law ending the monopoly, so that companies can supply pharmacies directly, in mid-2028.[@mc26]

context › medical › sources

bmc, mc26

context › visitors › text

On paper coffeeshops are for [residents only](/history/netherlands-residents-only-2012/): since 1 January 2013 the national rules say only people aged 18 or over who are register … ipality to the next, which is why visitors can still buy in some cities and not in others.

sources

Wikipedia — Coffeeshop (Netherlands) CEDRO — Peter Cohen, The case of the two Dutch drug policy commissions (1994) Wikipedia — Hash, Marihuana & Hemp Museum Cannabis Cup — Welcome to Amsterdam, Birthplace of the Cannabis Cup Oneindig Noord-Holland — Ruigoord Wiktionary — wiet, Dutch entry Pew Research Center — In 25-country survey, Americans especially likely to view fellow citizens as morally bad (5 March 2026), survey of 2025 Opiumwet — articles 3, 11 and 13 (version in force from 1 January 2026, wetten.overheid.nl) Wetboek van Strafrecht — article 23, fine categories (amounts from 1 January 2026) Tweede Kamer 24077 nr. 558 — Minister of Justice's letter on the report 'Coffeeshops in Nederland 2024' (2 October 2025) Trimbos Institute — THC-monitor 2024–2025 (January 2026) Breuer&Intraval, RAND Europe and Trimbos Institute — Onderzoek Experiment Gesloten Coffeeshopketen, first follow-up measurement 2025 (2026) Tweede Kamer 29477 nr. 986 — Health Minister's letter on medicinal cannabis (3 July 2026) RVO — Hennep, GLB 2026 Blenheim — Cannabis (CBD and THC) and hemp in the Netherlands (29 September 2023) OpenAlex — works mentioning cannabis or cannabinoids, by author country (datasets/openalex-cannabis-papers.csv) ClinicalTrials.gov — registered studies with a cannabis or cannabinoid intervention, as of 26 October 2026 (datasets/clinicaltrials-cannabis.csv) Maastricht University — Cannabis types have different effects on driving (1 December 2020), on the trial published in JAMA Besluit van 19 januari 2026, Stb. 2026, 11 — HHC and other substances added to Opium Act lists I and II 11 unchanged

segments › possession › currency

EUR

segments › possession › penalties

upto 5 g · treatment tolerated · note Not prosecuted; police may seize it, over 5 g · upto 30 g · treatment criminal · term Minor offence (overtreding) · prison 1 month · fine 5500, over 30 g · treatment criminal · term Crime (misdrijf) · prison 2 years · fine 110000

segments › cultivation › currency

EUR

segments › cultivation › penalties

upto 5 plants · treatment tolerated · note Not prosecuted; police seize the plants, over 5 plants · treatment criminal · term Crime (misdrijf) · prison 2 years · fine 110000, label Growing as a business · treatment criminal · term Crime (misdrijf) · prison 6 years · fine 110000

context › recreational › text

Most adults who buy cannabis legally do so in a coffeeshop. At the end of 2024 there were 563, in 103 municipalities; most towns have none.[@kb24] About two-thirds are places where customers may also smoke; a quarter only sell to take away, a share that grew after smoking rooms were banned in July 2022.[@kb24] Shops sell weed and hashish, and many sell space cake and other edibles.[@gov,exp] In early 2025 a gram of the most popular Dutch-grown weed cost about €11 and held about 16% THC on average; imported hashish cost about €10.[@thc25] Many people also buy outside the shops, mostly from delivery services and dealers they reach by phone, because it is cheaper and they can buy more at once.[@tri26]

context › recreational › sources

kb24, gov, exp, thc25, tri26

context › hemp › status

standard

context › hemp › text

Farmers may grow hemp from certified seed of approved EU varieties with no more than 0.3% THC; inspectors sample the field shortly before harvest, and harvesting needs written permission.[@rvo26] Seeds are outside the Opium Act, so they are sold openly.[@opiumwet] CBD itself is not a listed drug, but a law firm's guide reads the Act's definitions of hemp and hemp oil as covering CBD extracted from the plant.[@blen23] HHC, a semi-synthetic cannabinoid sold in the gaps of the law, was put on List I, the hard-drugs list, by a [decree published in January 2026](/history/netherlands-hhc-banned-2026/).[@stb26]

context › hemp › sources

rvo26, opiumwet, blen23, stb26

context › production › status

pilot

context › culture › text

For many people abroad the Netherlands means the [coffeeshop](/culture/traditions/the-coffeeshop/), a café that sells cannabis over the counter.[@wcs] It grew out of an idea of the early 1970s: a commission chaired by the criminal lawyer [Louk Hulsman](/culture/people/louk-hulsman/) argued that pushing cannabis users into the same criminal world as heroin users exposed them to harder drugs, and recommended taking cannabis use out of criminal law.[@cedro] Amsterdam became a meeting place for growers and breeders: the [Hash, Marihuana & Hemp Museum](/history/netherlands-hemp-museum-1985/) opened in 1985, and the [Cannabis Cup](/culture/traditions/the-cannabis-cup/), a contest where judges smoke and score the year's cannabis, began there in 1988.[@whm,cupsite] Near the harbour, the artists' village of [Ruigoord](/culture/traditions/ruigoord/) has kept a festival culture with its own cannabis rules since the 1970s.[@onh] The everyday word is [wiet](/culture/language/wiet/), borrowed from English weed.[@wikt] Tolerance is not the same as approval: in a 2025 Pew survey 45% of Dutch adults called using marijuana morally acceptable, 32% unacceptable and 20% not a moral question at all.[@pew26]

context › culture › sources

wcs, cedro, whm, cupsite, onh, wikt, pew26

context › research › status

licensed

context › research › text

Dutch researchers publish over a hundred papers on cannabis a year, 140 in 2025, and 21 clinical trials with a cannabis or cannabinoid treatment had been registered in the country by October 2026.[@openalex,ctgov] [Maastricht University](https://www.maastrichtuniversity.nl/) has studied cannabis and driving on real roads since the 1990s. Its 2020 trial, published in JAMA, had 26 users drive about 100 km at a time in a test car after inhaling THC, CBD or a placebo: THC made drivers weave in their lane about as much as a blood alcohol level above 0.05%, for up to about four hours, while CBD alone had little or no effect.[@um20] Since the late 1990s the [Trimbos Institute](https://www.trimbos.nl/) has tested the strength of cannabis bought anonymously in coffeeshops every year.[@thc25] Researchers get their cannabis through the Office of Medicinal Cannabis, which is also the only legal supplier to pharmacies.[@mc26]

context › research › sources

openalex, ctgov, um20, thc25, mc26

context › spotlights

The back door, A different rule in every town, The end of the smoking room

Singapore countries/sg.yaml

segments › possession › text

Cannabis is a Class A controlled drug. Possessing less than 330 g of cannabis, less than 130 g of resin, or less than 660 g of mixture carries up to 10 years, a fine of up to S$20,000, or both.[@mda_sch] Anyone holding more than 15 g is presumed to hold it for trafficking unless they prove otherwise.[@wmda] From 330 g to 500 g of cannabis the sentence is at least 10 years and 5 strokes of the can … n uses 130 g and 200 g for those same steps, and mixture uses 660 g and 1,000 g.[@cnb_can]

segments › possession › sources

wmda, mda_sch, cnb_can

context › production › text

None. No licensed production exists, and growing a single plant is a crime with at least three years in prison or a S$5,000 fine.[@mda_sch]

context › production › sources

wikimda_sch

context › products › text

None. CBD products are also prohibited; a pharmaceutical cannabinoid can be approved for an individual patient.

context › products › sources

wiki

sources

Central Narcotics Bureau — Annual Statistics Report 2025 (10 February 2026) Wikipedia — Misuse of Drugs Act (Singapore), section 17 presumption amounts BiblioAsia (National Library Board) — Andrea Kee, Singapore's Hippie Hysteria and the Ban on Long Hair (April–June 2024) IDPC — Singapore announces medical cannabis research, despite maintaining death penalty for cannabis trafficking (February 2018) 8 unchanged

segments › possession › currency

SGD

segments › possession › penalties

upto 15 g · treatment criminal · term Offence under the Misuse of Drugs Act · prison 10 years · fine 20000 · note Using it is a separate offence, proved by a urine test, with at least a year in prison, over 15 g · upto 330 g · treatment criminal · term Presumed trafficking · prison min 5 years · prison 20 years · caning 5, 15 · note Unless the holder proves it was not for trafficking; possession alone carries up to 10 years or S$20,000, over 330 g · upto 500 g · treatment criminal · term Presumed trafficking · prison min 20 years · prison 30 years · caning 15, 15 · note Or life imprisonment. If the presumption is rebutted, possession carries 10–20 years and 5–10 strokes, over 500 g · treatment criminal · term Presumed trafficking, a capital offence · death true · note If the presumption is rebutted, possession carries 20–30 years and 10–15 strokes

segments › cultivation › currency

SGD

segments › cultivation › penalties

over 0 plants · treatment criminal · term Cultivation · prison 20 years · fine 40000 · note At least three years or a fine of at least S$5,000

context › recreational › text

There is no legal way to get or use cannabis in Singapore, and using it is itself a crime, proved by a urine test the police can require.[@cnb_can] Citizens and permanent residents who use drugs abroad, even where cannabis is legal, face the same penalties as if they had used them at home.[@cnb] Cannabis is the third most common drug among people arrested, after methamphetamine and heroin: in 2025 the [Central Narcotics Bureau](https://www.cnb.gov.sg/) arrested 250 people for using it, 8% of all drug users arrested, and seven in ten of them were caught for the first time.[@cnb25] The bureau says permissive attitudes among young people are its main worry; six in ten new cannabis users arrested were under 30.[@cnb25]

context › recreational › sources

cnb_can, cnb, cnb25

context › hemp › status

none

context › hemp › text

Singapore makes no exception for hemp. The law defines cannabis as any part of a plant of the genus Cannabis, so seeds, low-THC hemp and CBD products are all controlled drugs.[@mda1973] A pharmaceutical cannabinoid can be approved for an individual patient.[@wiki]

context › hemp › sources

mda1973, wiki

context › production › status

none

context › arrests › text

The Central Narcotics Bureau arrested 250 people for using cannabis in 2025, 8% of all drug users arrested; 70% of them were new users, and 52% were under 30.[@cnb25] Cannabis seizures rose by 21.7%, from 101 kg in 2024 to 123 kg in 2025.[@cnb25]

context › arrests › sources

cnb25

context › culture › text

Singapore's stance took shape around 1970, when the government saw the hippie culture spreading along the jet routes as a gateway to drugs and escapism. Long-haired foreigners were turned away, and in 1972 Operation Snip Snip made long-haired men cut their hair before they could enter; civil servants who refused were dismissed.[@nlb24] The idea of a drug-free society has stayed at the centre of policy: the narcotics bureau runs prevention campaigns in schools, and describes legalisation abroad as a cautionary tale.[@cnb25,cnb]

context › culture › sources

nlb24, cnb25, cnb

context › research › status

restricted

context › research › text

Singapore studies cannabis without growing it. In 2018 the [National Research Foundation](https://www.nrf.gov.sg/) put S$25 million into a five-year synthetic biology programme, one strand of which aimed to make cannabis-derived medicines, mostly CBD, from engineered microbes rather than plants.[@idpc18] The plant itself stays illegal for any purpose.[@idpc18]

context › research › sources

idpc18

context › spotlights

Fifteen grams makes a trafficker, The law travels with you

Uruguay countries/uy.yaml

segments › possession › text

The drug law exempts a person who carries or keeps a quantity meant for their own use. The … s. The regulating decree authorises possession for personal use on the same 40 g measure. Possession that a judge finds is not for personal use carries two to twelve years.

segments › possession › sources

art7, d39, uy1494

segments › cultivation › text

Registered residents may grow up to six flowering plants per household with an annual harv … ng home growing excludes you from pharmacies and clubs. Unregistered growing is an offence, with twenty months to ten years in prison, though a judge weighs whether it was for personal use.

segments › cultivation › sources

law, ircca, uy1494

context › production › text

Cannabis for pharmacies is grown by a handful of companies chosen by state tender, on state-controlled land, with the state setting price and genetics.[@law,wiki] Membership clubs (15–45 members, up to 99 plants) are the only other producers of recreational cannabis. There is no[@law] A separate medical and industrial sector, promoted by the state agency [Uruguay XXI](https://www.uruguayxxi.gub.uy/) and open commercial licensingto foreign investors, employs about 700 people. In 2025 it produced 28.2 tonnes of medical cannabis, mostly non-psychoactive, and exported 45 tonnes of cannabis products worth about US$2.6 million: high-THC flower mainly to Germany and Portugal, medicines mainly to Brazil.[@uyxxi]

context › production › sources

law, wiki, uyxxi

context › products › text

Pharmacies sell only a few state-specified flower varieties with capped THC — launched at very low potency and since raised, with the newest variety at up to about 20%. No edibles, concentrates or vapes in the legal market.

context › products › sources

wiki, ircca

sources

Decreto-Ley N° 14.294, articles 30 and 31, as amended (IMPO) Brookings / WOLA — Walsh and Ramsey, Uruguay's Drug Policy: Major Innovations, Major Challenges (2015) 11 unchanged

segments › possession › penalties

upto 40 g · treatment legal · note Presumed to be for personal use, wherever it came from, over 40 g · treatment criminal · term Delito, if a judge finds it is not for personal use · prison min 2 years · prison 12 years · note A larger amount can still be judged personal

segments › cultivation › penalties

upto 6 plants · treatment legal · note Registered home growers, up to 480 g a year, over 6 plants · treatment criminal · term Delito · prison min 20 months · prison 10 years · note A judge weighs whether it was for personal use. Growing without registration is also an offence

context › recreational › text

Uruguay is the only country where the state runs the whole market. A resident who wants cannabis legally signs up with the regulator [IRCCA](https://www.ircca.gub.uy/) for one of three routes: buying in a pharmacy, joining a club, or growing at home.[@law,ircca25] In a pharmacy, a fingerprint check allows up to 10 g a week at a price the state sets.[@law] Only a few state-chosen flower varieties are on sale, launched at very low strength and since raised to about 20% THC, and there are no edibles, concentrates or vapes.[@wiki,ircca] Banks, fearing trouble with the United States, refused to serve the legal trade, so pharmacies cannot take cards; only 40 were selling cannabis in December 2024, too few to cover the country.[@snd26] In 2024 about 46% of people who used cannabis were registered for a legal route; many others get it from friends or unregistered growers.[@sndmar]

context › recreational › sources

law, ircca25, wiki, ircca, snd26, sndmar

context › hemp › status

high

context › hemp › text

Cannabis with no more than 1% THC counts as non-psychoactive hemp, licensed by the agriculture ministry rather than the cannabis regulator.[@uyxxi] In 2024, 31 companies were authorised to grow it, on about 100 hectares in the open and almost 23,000 m² under cover, half of the outdoor area in Canelones.[@uyxxi] Low-THC flowers are Uruguay's most valuable cannabis export, sold mainly to Switzerland and Czechia, and low-THC seed its largest by weight, sent mostly to Argentina.[@uyxxi]

context › hemp › sources

uyxxi

context › production › status

state

context › culture › text

Uruguay legalised cannabis against the opinion of most Uruguayans. The idea entered public debate with the first Global Marijuana March in Montevideo in 2005, and was carried through by President [José Mujica](/culture/people/jose-mujica/), a former guerrilla, in [2013](/history/uruguay-legalisation-2013/).[@snd26,mujica] At the end of 2013, 66% opposed the law, and in 2014 60%.[@snd26] Ten years later opinion had shifted: in 2024 28% were neutral, and among those with a view, supporters slightly outnumbered opponents; people who use cannabis back it overwhelmingly.[@snd26] The [cannabis club](/culture/traditions/cannabis-social-clubs/), borrowed from Spain, became part of the law itself.[@law]

context › culture › sources

snd26, mujica, law

context › genetics › text

Uruguay has no old cannabis tradition of its own; its genetics are new. Licensed growers have been breeding national varieties, and the seed institute [INASE](https://www.inase.uy/) had more than 40 Uruguayan cultivars on its register in 2025, up from 11 a year earlier. About 88% are psychoactive, bred by at least ten companies, licensed producers and membership clubs.[@uyxxi] Seeds and cuttings may only move inside the regulated system.[@d120]

context › genetics › sources

uyxxi, d120

context › research › status

licensed

context › research › text

The cannabis regulator had granted 14 research licences by 2026, eight to private companies and six to public institutions such as the University of the Republic and the Clemente Estable Institute; they work on new varieties, extraction and medical extracts.[@uyxxi] In February 2025 the national research agency, the university, the drugs board and IRCCA set up a cannabis research fund.[@uyxxi] The law itself is studied closely: the government's [second evaluation](/history/uruguay-second-evaluation-2026/), in 2026, measured who uses the legal routes, what remains of the black market and how opinion has changed.[@snd26]

context › research › sources

uyxxi, snd26

context › spotlights

A registered user, by fingerprint, The clubs overtook the pharmacies

Code, design and documents 19 files

docs/COUNTRY-CONTEXTS.md +38 −20
@@ -46,7 +46,8 @@ about the country.
 | 11 | `arrests` | Arrests and prisoners | Unchanged |
 | 12 | `consequences` | Beyond the penalty | Renamed: records, drug registers, lost licences, tests at work, deportation |
+| — | `culture` (new, optional) | Culture and traditions | How cannabis sits in the country's life; links the Culture entries |
 | 13 | `genetics` (new, optional) | Genetics and heritage | Local plants and who keeps them |
-| 14 | `research` (new, optional) | Research | Whether scientists can study cannabis, and what research from here gave the world |
-| 15 | `local` (new, optional) | Local differences | Places where the rules, or life under them, differ from the national picture |
+| 14 | `research` (new, optional) | Research | Scientific research on cannabis in the country |
+| 15 | `spotlights` (new, optional) | Country spotlights | A list: what makes cannabis different here, each with a title |
 
 `products` is removed once its content has moved into `recreational`, `medical` and `hemp`.
@@ -100,33 +101,50 @@ and what bans, eradication or imported hybrids did to them.
 ### `research`: Research
 
-Optional. Write it where there is something to say. It covers two things. First, whether a
-university can get a licence and plants to study (blocked in many countries, a single farm in
-the U.S. for decades). Second, what research from here gave the world: Mechoulam and THC in
-Israel, Hanuš in Czechoslovakia, the Swiss pilot trials, O'Shaughnessy in Calcutta. Discoveries
-link to their History entries and researchers to Culture/People.
+Optional. Scientific research on cannabis done in the country: who studies it, notable studies
+and what they found, landmark discoveries (Mechoulam and THC in Israel, Hanuš in
+Czechoslovakia, O'Shaughnessy in Calcutta), and whether the law lets researchers get cannabis to
+study. The paper and trial counts in `datasets/openalex-cannabis-papers.csv` and
+`datasets/clinicaltrials-cannabis.csv` give a first line. Discoveries link to their History
+entries and researchers to Culture/People. Policy monitoring belongs here only where it is real
+science (lab testing, controlled trials), not routine counting.
 
-### `local`: Local differences
+### `spotlights`: Country spotlights
 
-Optional, and the only new section that is a list, because a country can have several such
-places:
+Optional. The only section that is a list: one to three things that make cannabis different in
+this country, each with a short title. They follow the editorial test from #224: would a reader
+learn something important, specific and surprising that the scores and the other sections do not
+tell them?
 
 ```yaml
-local:
-  - place: Christiania, Copenhagen
+spotlights:
+  - title: The back door
+    text: >-
+      A coffeeshop may sell cannabis … [@gov,tri26]
+    sources: [gov, tri26]
+  - title: A different rule in every town
     text: >-
       …
     sources: [...]
-  - place: …
 ```
 
-Use it for places that are not a legal unit of their own (federal states already have
-`subunits`), or where practice differs from the law. Examples: Pusher Street, Barcelona's clubs,
-the Rif, the Bekaa, Malana, Dutch border towns, Swiss pilot cities, U.S. tribal lands. Each
-entry says how the place differs from the national rule, and never presents one city as the
-country.
+A spotlight can be a place (Christiania, the Rif, the Bekaa, U.S. tribal lands), an institution
+(Uruguay's state registry, Brazil's patient associations) or a contradiction (use is legal but
+buying is not). Never present one city as the country, and link to Culture or History where the
+subject has an entry.
+
+## On the page
+
+- Every section has a small **?** beside its heading. Hovering or focusing it shows what the
+  section covers (`CONTEXT` in `src/lib/countries.js`).
+- The **Recreational** and **Medical** status chips at the top of the page link to their
+  sections, and each section shows its chip again.
+- Spotlights show as titled items inside one *Country spotlights* section.
 
 ## How sections stay distinct
 
 - A section never repeats a scored segment; it explains what the score leaves out.
+- Texts link generously with Markdown, `[name](url)`: dated events to their history entries,
+  people and traditions to Culture, and named organisations to their websites. The rules are in
+  `docs/DATA-MAINTENANCE.md`, "Writing context sections well". A link is not a source.
 - A custom or a word belongs in Culture, and a dated event in `changes.yaml`. The section links
   to them.
@@ -140,9 +158,9 @@ country.
    *Commercial production* → *Cannabis industry*.
    The API lists `context` in this order, and each entry carries its `key`.
-2. **Schema:** add `recreational`, `hemp`, `genetics`, `research` and `local` as optional, and
+2. **Schema:** add `recreational`, `hemp`, `genetics`, `research` and `spotlights` as optional, and
    keep `products` valid while countries move over.
 3. **Data, in batches by region:** move `products` into `recreational`, `medical` and `hemp`,
    and widen `production` into the industry section, keeping every source and citation. Write `genetics`, `research` and
-   `local` where there is something real to say.
+   `spotlights` where there is something real to say.
 4. **Clean-up:** once no country uses `products`, remove it and make
    `recreational` and `hemp` required.

docs/DATA-MAINTENANCE.md +234 −0
@@ -327,4 +327,238 @@ table, the per-country JSON and `scores.csv` (columns `seeds`, `seeds_trade`, `c
 all read from there, together with `PLANTING_TRADE`.
 
+## Writing context sections well
+
+The *More context* tab is where a reader learns how cannabis actually works in a country, beyond
+the six scores. Every section is unscored. This part says what each section holds and how to
+write it; the plain-language rules in `docs/WRITING.md` apply throughout. The Netherlands, Czechia
+and Germany are written this way and can serve as models.
+
+### The sections, in page order
+
+| Key | Shown as | Holds | Required? |
+|---|---|---|---|
+| `death_penalty` | Death penalty | Whether the law allows execution for cannabis, and whether it is carried out | Where the law provides for it |
+| `recreational` | Recreational use | How adults actually get and use cannabis, legally or not: shops, clubs, home growing, dealers, which products, typical price and strength | Yes, for every country (replacing `products`) |
+| `medical` | Medical cannabis | The whole patient story: who qualifies, who prescribes, which forms, cost and insurance, where it is made | Yes |
+| `clubs` | Cannabis clubs | Members' clubs and their footing, with a `status` | When researched |
+| `planting` | Seeds and clones | Seed and cutting law, with four statuses | When researched |
+| `hemp` | Hemp and CBD | The THC limit, who may grow hemp, how much is grown, CBD sales, loophole products such as HHC | Yes, for every country |
+| `production` | Cannabis industry | The legal commercial sector: who may grow, process and sell for profit, licences, size, imports and exports | Yes |
+| `black_market` | Black market | The illegal market: size, origin, prices, how openly it is sold | When researched |
+| `visitors` | Visitors and foreigners | Whether a non-resident can get cannabis legally, and what happens to a foreigner caught | When researched |
+| `driving` | Driving | What the law needs to convict a driver, with a `status` | When researched |
+| `arrests` | Arrests and prisoners | Published counts, with year and who counted | When researched |
+| `consequences` | Beyond the penalty | What follows a person beyond the punishment: records, registers, licences, jobs, deportation | Yes |
+| `culture` | Culture and traditions | How cannabis sits in the country's life: customs, faith, words, music and film, festivals, famous figures, attitudes (polls), and what prohibition did to them | Recommended wherever a tradition or Culture entry exists |
+| `genetics` | Genetics and heritage | Local cannabis plants, who keeps them, what the law did to them | Only where a real account exists |
+| `research` | Research | Scientific research in the country: who studies cannabis, what they found, what the law allows researchers | Where there is something to say |
+| `spotlights` | Country spotlights | One to three things that make cannabis different here, each with a title | Only where something passes the test below |
+
+`products` is being folded into `recreational`, `medical` and `hemp`; when you revise a country,
+move its content and delete the section. The schema accepts both during the move.
+
+### Statuses for hemp, industry and research
+
+`hemp`, `production` and `research` may carry a `status`, like `clubs` or `driving`. It shows as a
+chip on the country page, colours a world-map view and fills a rankings column. It is optional
+while countries are researched; set it only when the section's text states the fact it rests on.
+
+```yaml
+  hemp:
+    status: standard      # high (up to 1% THC) | standard (0.3%) | strict (below 0.3%) | none (no exception for hemp)
+  production:
+    status: medical       # open (licensed adult market) | state (state-run) | pilot (trials only) | medical (medicine, research or export only) | none
+  research:
+    status: licensed      # open | licensed (special licence or permit) | restricted (synthetic or narrow routes only) | blocked
+```
+
+- `hemp` is the THC line in law, not how big the hemp industry is.
+- `production` describes who may produce for sale. A country with both a pilot for adults and a
+  medical industry is `pilot`; one with only medical licences is `medical`.
+- `research` needs a stated route: a permit, a licence, a state agency that supplies researchers.
+  If the text does not say how researchers get cannabis, leave the status out.
+
+### How to write a section
+
+- **Start with what a person meets.** The first sentence answers the section's question for an
+  ordinary adult in that country ("There is still nowhere to buy cannabis legally, so…"). Law
+  numbers and institutions come after, and only when they help.
+- **Three to seven sentences.** Long enough to explain, short enough to read on a phone. If a
+  subject needs more, it probably needs a history article or a Culture entry, linked from here.
+- **The whole country.** Describe the national picture. A city or region goes in `spotlights`,
+  or in the text only as an example, named as such.
+- **One section, one subject.** Don't repeat a scored segment or another section: `recreational`
+  is the user's side, `production` the businesses behind the supply, `black_market` the illegal
+  trade. Point to the other section instead of retelling it.
+- **Numbers with their frame.** Every figure needs its year, its unit and what it counts:
+  "registered users", "approved associations", "tonnes imported". Say "about" when the source
+  rounds. A figure from `datasets/` can be quoted with its year; the page also shows the dataset,
+  so don't build a paragraph on a number that the next refresh will change.
+- **Proposals are not law.** A bill, a government plan or an announcement is described as such,
+  with its date and where it stands ("none of this had been adopted").
+- **Cite every sentence** with inline marks, `[@key]`, as in the segments. Every key in the
+  section's `sources` must be cited in its text, or the build fails.
+- **Prefer primary sources**: the statute, the regulator, the statistics office, the official
+  evaluation. A good newspaper is fine for practice and for what officials said. Wikipedia is a
+  last resort and never the only source for a figure.
+
+### Links
+
+Texts may contain Markdown links, `[name](url)`, and should use them generously: a reader who
+meets a name, a body or a dated change should be one click from more. Link, in this order of
+preference:
+
+- **A dated event that has a history entry**: a law, ruling, report or ban mentioned with its
+  date. Put the link on the words that name the change, for example
+  `[From 30 July 2026](/history/germany-flower-reimbursement-ended-2026/)` or
+  `[legal since 1 July 2024](/history/germany-cultivation-associations-2024/)`. If the event has
+  no entry yet, write one in `changes.yaml` (it is found history anyway) and link it.
+- **A person, tradition or word that has a Culture entry**, for example
+  `[Lumír Hanuš](/culture/people/lumir-hanus/)`.
+- **An organisation, authority or project the text names**: link its own website the first time
+  it appears, for example `[Federal Office for Agriculture and Food](https://www.ble.de/)`,
+  `[EKOCAN project](https://www.uke.de/ekocan)`. Use the official home page or project page, not a
+  news story about it. External links open in a new tab and show a small ↗.
+
+Rules:
+
+- A link is not a source. The sentence still needs its `[@key]`.
+- Link a target once per section, on its first mention, and on a few words, never a whole
+  sentence.
+- Internal links start with `/` and must point at a page that exists: check the history id in
+  `changes.yaml` or the Culture file name.
+- Don't link generic words (police, pharmacy, government) or a source that is already in the
+  references.
+- When you revise any section, look for names, bodies and dated changes that could be linked.
+
+### Country spotlights
+
+`spotlights` is a list. Each item has a short `title`, a `text` written like any section, and its
+own `sources`:
+
+```yaml
+spotlights:
+  - title: Grow it, but don't share it
+    text: >-
+      Since 2026 an adult may grow three plants … [@z167,z40]
+    sources: [z167, z40]
+```
+
+- **The test:** would a reader learn something important, specific and surprising that the
+  scores and the other sections do not tell them? If not, leave it out. Most countries will have
+  none to three, and none is better than filler.
+- **Good subjects:** a contradiction in the system (use is legal but buying is not), a place that
+  differs from the national rule (Christiania, Bavaria, the ten Dutch experiment towns), an
+  institution found nowhere else (Uruguay's registry, Malta's associations), a market the law
+  created by accident (Germany's prescription boom).
+- **Titles** are a few plain words that say the point, not a label: "The back door", "Twenty-one,
+  not eighteen".
+- A spotlight may draw on facts from other sections, but it tells them as one story with its
+  consequence for people.
+
+### Culture and traditions
+
+`culture` gives the context around the Culture entries that belong to the country. Those already
+show as a list of cards on the page; this section tells the story that connects them, and the law
+around them.
+
+- **Link every Culture entry it mentions**, and the culture-category history entries
+  (`/history/<id>/`). Don't retell an entry; give it a sentence or two of context and let the link
+  do the rest.
+- **Mention what has no entry yet**: a festival, a musician, a movement, a word. Each one is a lead
+  for a future Culture entry; note it in the research log or write the entry.
+- **Cover the range**, as far as sources allow: old customs (ritual, folk medicine, hemp crafts and
+  food), modern culture (words, music, film, festivals, marches), well-known figures, and how
+  people see it today. A poll needs its year, its question and who asked.
+- **Show the link to the law** where there is one: what prohibition did to a custom, how a
+  tradition shaped the rules (the coffeeshop, Rastafari, bhang shops).
+- The plant itself belongs in `genetics`, scientific work in `research`, and one striking story in
+  `spotlights`.
+
+### Research
+
+`research` is about science, not policy monitoring: universities and institutes, notable studies
+and what they found, landmark discoveries (link them to their history entries), clinical trials,
+and whether the law lets researchers obtain cannabis. The paper and trial counts in
+`datasets/openalex-cannabis-papers.csv` and `datasets/clinicaltrials-cannabis.csv` give a first
+line; cite them with the dataset as the source. An official evaluation of a cannabis law belongs
+here when it is run as a study, with its findings.
… 80 more lines
src/components/Cited.astro +9 −2
@@ -1,8 +1,15 @@
 ---
 // A text with its citations as superscript numbers linked to a list of references (src/lib/cite.js).
-// `parts` comes from citeParts(); the text itself is plain, so it is written out as it is.
+// `parts` comes from citeParts(). The text is plain apart from Markdown links, [name](url): a full
+// URL opens in a new tab, and one starting with "/" is a page of this site and gets the base path.
+import { linkParts } from "../lib/cite.js";
 const { parts } = Astro.props;
+const base = import.meta.env.BASE_URL.replace(/\/?$/, "/");
 ---
 {parts.map((p) => p.refs
   ? p.refs.map((r) => <sup class="cite"><a href={`#${r.id}`} aria-label={`Source ${r.n}`}>[{r.n}]</a></sup>)
-  : p.t)}
+  : linkParts(p.t).map((x) => x.href
+    ? (x.href.startsWith("/")
+      ? <a href={base + x.href.slice(1)}>{x.t}</a>
+      : <a href={x.href} target="_blank" rel="noopener noreferrer">{x.t}</a>)
+    : x.t))}

src/components/CountryArticle.astro +51 −10
@@ -20,4 +20,6 @@ import { references, citeParts, citedKeys } from "../lib/cite.js";
 import { SHOW_PRICES } from "../lib/config.js";
 import { PLANTING_STATUS, STATUS_SECTIONS, PLANTING_TRADE } from "../lib/segment-ids.js";
+import { TREATMENT, punishmentText, punishmentExtra } from "../lib/penalties.js";
+import { viewByMetric } from "../lib/map-views.js";
 import { answersFor } from "../lib/answers.js";
 import CultureList from "./CultureList.astro";
@@ -56,5 +58,12 @@ const unitParts = sub ? sub.segCite.map((text, i) => citeParts(text, unitRefs,
   citedKeys(text) ?? sub.sources.map((_, i) => String(i + 1)),
   `countries/${c.slug}/${sub.id}.yaml: ${SEGMENTS[i].id}`)) : [];
-const ctxParts = d ? Object.fromEntries(d.context.filter(Boolean).map((x) => [x.key, partsOf(x, ctxRefs, x.key)])) : {};
+const ctxParts = d ? Object.fromEntries(d.context.filter(Boolean).map((x) => [x.key, x.items ? x.items.map((item, i) => partsOf(item, ctxRefs, `${x.key}[${i}]`)) : partsOf(x, ctxRefs, x.key)])) : {};
+// a maximum fine in the profile's currency: "€5,500", "$300"
+const money = (n, currency) => new Intl.NumberFormat("en-GB", { style: "currency", currency, maximumFractionDigits: 0 }).format(n);
+// a chip inside a context section leads to the world map coloured by the same status
+const mapOf = (metric) => (viewByMetric[metric] ? `${base}map/${viewByMetric[metric].slug}/` : undefined);
+const onMap = (help) => `${help} · See the world map`;
+// the recreational and medical status chips lead to their own context sections, where those exist
+const ctxHas = (key) => Boolean(d?.context.some((x) => x?.key === key));
 const INCB = ["International Narcotics Control Board — Travellers carrying medicines containing controlled substances", "https://www.incb.org/incb/en/travellers/index.html", null, "https://www.incb.org/incb/en/travellers/index.html"];
 // 48,000,000 → "48 million", 770,000 → "770,000"
@@ -141,6 +150,10 @@ const culture = cultureOf(c);
     <p class="d-note">{v.note}</p>
     <div class="d-chips">
-      <span class={`chip s-${v.rec}`} title={REC_HELP[v.rec]}>Recreational: {REC_LABEL[v.rec]}</span>
-      <span class={`chip s-${v.med}`} title={MED_HELP[v.med]}>Medical: {MED_LABEL[v.med]}</span>
+      {ctxHas("recreational")
+        ? <a class={`chip s-${v.rec}`} href="#seg-ctx-recreational" data-seg-link="ctx-recreational" title={REC_HELP[v.rec]}>Recreational: {REC_LABEL[v.rec]}</a>
+        : <span class={`chip s-${v.rec}`} title={REC_HELP[v.rec]}>Recreational: {REC_LABEL[v.rec]}</span>}
+      {ctxHas("medical")
+        ? <a class={`chip s-${v.med}`} href="#seg-ctx-medical" data-seg-link="ctx-medical" title={MED_HELP[v.med]}>Medical: {MED_LABEL[v.med]}</a>
+        : <span class={`chip s-${v.med}`} title={MED_HELP[v.med]}>Medical: {MED_LABEL[v.med]}</span>}
     </div>
     {d && d.context.some((x) => x && (x.status || x.seeds)) && (
@@ -334,4 +347,19 @@ const culture = cultureOf(c);
             <div class="why">
               <p><Cited parts={segParts[i]} /></p>
+              {seg.penalties && (
+                <table class="pen">
+                  <thead><tr><td>Amount</td><td>What happens</td><td>Punishment</td><td>Fine, at most</td></tr></thead>
+                  <tbody>
+                    {seg.penalties.rows.map((r) => (
+                      <tr>
+                        <td data-label="Amount">{r.amount}{r.note && <span class="pen-note">{r.note}</span>}</td>
+                        <td data-label="What happens"><span class={`pen-t s-${TREATMENT[r.treatment].tone}`} title={TREATMENT[r.treatment].help}>{TREATMENT[r.treatment].label}</span>{r.term && <span class="pen-note">{r.term}</span>}</td>
+                        <td data-label="Punishment" class:list={{ "pen-death": r.death }}>{punishmentText(r) ?? "—"}{punishmentExtra(r) && <span class="pen-note">{punishmentExtra(r)}</span>}</td>
+                        <td data-label="Fine, at most">{r.fine ? money(r.fine, seg.penalties.currency) : "—"}</td>
+                      </tr>
+                    ))}
+                  </tbody>
+                </table>
+              )}
             </div>
           )}
@@ -348,19 +376,32 @@ const culture = cultureOf(c);
         {d.context.filter(Boolean).map((x) => (
           <div class="segrow" data-seg={`ctx-${x.key}`} id={`seg-ctx-${x.key}`}>
-            <div class="segrow-top"><span>{x.name === "Death penalty" ? "☠️ " : ""}{x.name}</span></div>
+            <div class="segrow-top"><span>{x.name === "Death penalty" ? "☠️ " : ""}{x.name}<SourceTip label="What this covers" inline>{x.help}</SourceTip></span></div>
+            {x.key === "recreational" && (
+              <div class="d-chips"><a class={`chip s-${v.rec}`} href={mapOf("status:rec")} title={onMap(REC_HELP[v.rec])}>Recreational: {REC_LABEL[v.rec]}</a></div>
+            )}
+            {x.key === "medical" && (
+              <div class="d-chips"><a class={`chip s-${v.med}`} href={mapOf("status:med")} title={onMap(MED_HELP[v.med])}>Medical: {MED_LABEL[v.med]}</a></div>
+            )}
             {x.status && (
               <div class="d-chips">
-                <span class={`chip s-${STATUS_SECTIONS[x.kind].statuses[x.status].tone}`} title={STATUS_SECTIONS[x.kind].statuses[x.status].help}>{STATUS_SECTIONS[x.kind].chip}: {STATUS_SECTIONS[x.kind].statuses[x.status].label}</span>
+                <a class={`chip s-${STATUS_SECTIONS[x.kind].statuses[x.status].tone}`} href={mapOf(`status:${x.kind}`)} title={onMap(STATUS_SECTIONS[x.kind].statuses[x.status].help)}>{STATUS_SECTIONS[x.kind].chip}: {STATUS_SECTIONS[x.kind].statuses[x.status].label}</a>
               </div>
             )}
             {x.seeds && (
               <div class="d-chips">
-                <span class={`chip s-${PLANTING_STATUS[x.seeds].tone}`} title={PLANTING_STATUS[x.seeds].help[0]}>Seeds: {PLANTING_STATUS[x.seeds].label}</span>
-                <span class={`chip s-${PLANTING_TRADE[x.seeds_trade].tone}`} title={PLANTING_TRADE[x.seeds_trade].help[0]}>Seed sales: {PLANTING_TRADE[x.seeds_trade].label}</span>
-                <span class={`chip s-${PLANTING_STATUS[x.clones].tone}`} title={PLANTING_STATUS[x.clones].help[1]}>Clones: {PLANTING_STATUS[x.clones].label}</span>
-                <span class={`chip s-${PLANTING_TRADE[x.clones_trade].tone}`} title={PLANTING_TRADE[x.clones_trade].help[1]}>Clone sales: {PLANTING_TRADE[x.clones_trade].label}</span>
+                <a class={`chip s-${PLANTING_STATUS[x.seeds].tone}`} href={mapOf("plant:seeds")} title={onMap(PLANTING_STATUS[x.seeds].help[0])}>Seeds: {PLANTING_STATUS[x.seeds].label}</a>
+                <a class={`chip s-${PLANTING_TRADE[x.seeds_trade].tone}`} href={mapOf("plant:seeds_trade")} title={onMap(PLANTING_TRADE[x.seeds_trade].help[0])}>Seed sales: {PLANTING_TRADE[x.seeds_trade].label}</a>
+                <a class={`chip s-${PLANTING_STATUS[x.clones].tone}`} href={mapOf("plant:clones")} title={onMap(PLANTING_STATUS[x.clones].help[1])}>Clones: {PLANTING_STATUS[x.clones].label}</a>
+                <a class={`chip s-${PLANTING_TRADE[x.clones_trade].tone}`} href={mapOf("plant:clones_trade")} title={onMap(PLANTING_TRADE[x.clones_trade].help[1])}>Clone sales: {PLANTING_TRADE[x.clones_trade].label}</a>
               </div>
             )}
-            <p class="ctx"><Cited parts={ctxParts[x.key]} /></p>
+            {x.items
+              ? x.items.map((item, i) => (
+                  <div class="ctx-spot">
+                    <h3 class="ctx-spot-h">{item.title}</h3>
+                    <p class="ctx"><Cited parts={ctxParts[x.key][i]} /></p>
+                  </div>
+                ))
+              : <p class="ctx"><Cited parts={ctxParts[x.key]} /></p>}
           </div>
         ))}

src/components/HomePage.astro +6 −4
@@ -92,7 +92,9 @@ const MED_ORDER = ["yes", "limited", "no"];
 import { useFreedomRatio } from "../lib/use-freedom-ratio.js";
 const mapData = places.map((c) => {
-  const { id, num, name, flag, raw, score, rank, s, use, planting, clubs, driving, visitors, rec, med } = c;
+  const { id, num, name, flag, raw, score, rank, s, use, planting, rec, med } = c;
   const atlas = cultureOf(c);
-  return { id, num, name, flag, raw, score, rank, s, planting, clubs, driving, visitors, rec, med, fe: estimateNote(c), prices: SHOW_PRICES ? flatLatestPricesFor(id) : {},
+  // one value per section in STATUS_SECTIONS (clubs, driving, visitors, hemp, production, research)
+  const statuses = Object.fromEntries(Object.keys(STATUS_SECTIONS).map((key) => [key, c[key]]));
+  return { id, num, name, flag, raw, score, rank, s, planting, ...statuses, rec, med, fe: estimateNote(c), prices: SHOW_PRICES ? flatLatestPricesFor(id) : {},
     use: { ...use, ages: useAges(use), ratio: useFreedomRatio(use.prevalence, raw), culture: atlas.length },
     atlas: atlas.slice(0, 4).map((e) => e.title), ds: datasetMapValues(c) };
@@ -131,5 +133,5 @@ const PLANTING_COLOR = { legal: 5, conditional: 4, licensed: 4, grey: 3, illegal
 const plantingScale = (statuses) => Object.fromEntries(Object.entries(statuses).map(([k, v]) => [k, { label: v.label, help: v.help, color: `var(--t${PLANTING_COLOR[k]})` }]));
 const PLANTING_SCALES = { status: plantingScale(PLANTING_STATUS), trade: plantingScale(PLANTING_TRADE) };
-// Sections with one status (clubs, driving, visitors) on the map: one option each.
+// Sections with one status (clubs, driving, visitors, hemp, production, research) on the map: one option each.
 // The two headline statuses of every profile, offered on the map the same way. `complete` marks
 // sections every country has, so their legend needs no "not researched" entry.
@@ -557,5 +559,5 @@ const columnGroups = [["Shown by default", BASE_COLUMNS], ...["Score segments",
     const plantOf = (c, field = plantField()) => plantScale(field)[c.planting?.[field]];
     const plantColor = (c) => plantOf(c)?.color ?? "url(#hatch)";
-    const isClubs = () => metric.startsWith("status:"); // coloured by a section's one status: clubs, driving, visitors
+    const isClubs = () => metric.startsWith("status:"); // coloured by a section's one status (STATUS_SECTIONS)
     const statusKey = () => metric.split(":")[1];
     const clubsOf = (c) => PLANTING.sections[statusKey()].scale[c[statusKey()]];

src/components/SourceTip.astro +6 −3
@@ -3,8 +3,11 @@
 // click or tap (for touch screens; the script in Base.astro toggles it and closes it again). The
 // slot is the source text, with its links. The parent needs `position: relative`.
+// `label` names the note ("Source" by default); `inline` sets the "i" in the line of text, beside a
+// heading, instead of in the parent's corner.
 import { Icon } from "astro-icon/components";
+const { label = "Source", inline = false } = Astro.props;
 ---
-<span class="src-tip">
-  <button type="button" class="src-tip-btn" aria-label="Source" aria-expanded="false"><Icon name="iconoir:info-circle" aria-hidden="true" /></button>
-  <span class="src-tip-pop" role="tooltip"><b>Source</b> <slot /></span>
+<span class:list={["src-tip", { "src-tip-inline": inline }]}>
+  <button type="button" class="src-tip-btn" aria-label={label} aria-expanded="false"><Icon name="iconoir:info-circle" aria-hidden="true" /></button>
+  <span class="src-tip-pop" role="tooltip"><b>{label}</b> <slot /></span>
 </span>

src/content.config.ts +36 −10
@@ -5,5 +5,6 @@ import { glob, file } from "astro/loaders";
 import { z } from "astro/zod";
 import { isMixedCannabisPrice } from "./lib/price-selection.js";
-import { SEGMENT_IDS, CONTEXT_IDS, CHANGE_CATEGORIES, CHANGE_TAGS, PLANTING_STATUS, PLANTING_TRADE, STATUS_SECTIONS } from "./lib/segment-ids.js";
+import { TREATMENT, parseAmount, parseDuration } from "./lib/penalties.js";
+import { SEGMENT_IDS, CONTEXT_IDS, OPTIONAL_CONTEXT_IDS, sectionSources, CHANGE_CATEGORIES, CHANGE_TAGS, PLANTING_STATUS, PLANTING_TRADE, STATUS_SECTIONS } from "./lib/segment-ids.js";
 
 const score = z.number().int().min(0).max(10);
@@ -26,4 +27,25 @@ const source = z.object({
 const webSource = source.refine((s) => Boolean(s.url), { message: "price sources need a URL" });
 const cited = z.object({ text: z.string().min(1), sources: z.array(z.string()) }).strict();
+// a penalty step of a segment (src/lib/penalties.js): an amount ("30 g", "1 oz", "5 plants") or a
+// `label` for a step that is not about an amount, what the law does, and its maximum prison and fine
+const amount = z.string().refine((s) => parseAmount(s), { message: 'an amount such as "5 g", "1 oz" or "5 plants"' });
+const penalty = z.object({
+  upto: amount.optional(), over: amount.optional(), label: z.string().min(1).optional(),
+  repeat: z.number().int().min(2).optional(),
+  treatment: z.enum(Object.keys(TREATMENT) as [string, ...string[]]),
+  term: z.string().min(1).optional(),
+  prison: z.string().refine((s) => parseDuration(s), { message: 'a duration such as "5 days" or "2 years"' }).optional(),
+  prison_min: z.string().refine((s) => parseDuration(s), { message: 'a duration such as "6 months"' }).optional(),
+  caning: z.tuple([z.number().int().positive(), z.number().int().positive()]).optional(), // [fewest, most] strokes
+  death: z.literal(true).optional(),
+  fine: z.number().positive().optional(),
+  note: z.string().min(1).optional(),
+}).strict().refine((r) => r.upto || r.over || r.label, { message: "a penalty step needs upto, over or a label" })
+  .refine((r) => !r.prison_min || r.prison, { message: "prison_min needs prison, the maximum" });
+// a segment: its cited text, and for possession and cultivation optionally the penalty steps
+const segment = cited.extend({ currency: z.string().regex(/^[A-Z]{3}$/).optional(), penalties: z.array(penalty).min(1).optional() })
+  .refine((s) => !s.penalties?.some((r) => r.fine) || s.currency, { message: "penalties with a fine need a currency" });
+// a country spotlight: one thing that makes cannabis different there, with a short title
+const spotlight = z.object({ title: z.string().min(1), text: z.string().min(1), sources: z.array(z.string()) }).strict();
 // seeds and clones: the same cited text, plus for each a status for having and planting them
 // (PLANTING_STATUS) and one for selling or handing them on (PLANTING_TRADE)
@@ -32,6 +54,10 @@ const plantingTrade = z.enum(Object.keys(PLANTING_TRADE) as [string, ...string[]
 const planting = z.object({ seeds: plantingStatus, seeds_trade: plantingTrade, clones: plantingStatus, clones_trade: plantingTrade, text: z.string().min(1), sources: z.array(z.string()) }).strict();
 // clubs, driving, visitors: the cited text plus one status from that section's vocabulary (STATUS_SECTIONS)
-const statusSections = Object.fromEntries(Object.entries(STATUS_SECTIONS).map(([key, section]) => [key,
-  z.object({ status: z.enum(Object.keys(section.statuses) as [string, ...string[]]), text: z.string().min(1), sources: z.array(z.string()) }).strict().optional()]));
+// the newer ones (`optional` in STATUS_SECTIONS) may leave the status out; a standard section (production) stays required
+const statusSections = Object.fromEntries(Object.entries(STATUS_SECTIONS).map(([key, section]) => {
+  const status = z.enum(Object.keys(section.statuses) as [string, ...string[]]);
+  const block = z.object({ status: section.optional ? status.optional() : status, text: z.string().min(1), sources: z.array(z.string()) }).strict();
+  return [key, (CONTEXT_IDS as string[]).includes(key) ? block : block.optional()];
+}));
 const status = {
   // "death": illegal, and the law allows the death penalty for cannabis offences, in practice trafficking.
@@ -86,10 +112,10 @@ const countries = defineCollection({
       scores: perSegment(score),
       answers,
-      segments: perSegment(cited),
-      // the four standard sections, plus `death_penalty` where the law provides for one and,
+      segments: perSegment(segment),
+      // the three standard sections, plus `death_penalty` where the law provides for one and,
       // where they have been researched, `planting` (seeds and clones), the sections with a status
-      // (`clubs`, `driving`, `visitors`), `black_market` (the illegal market) and `arrests`
-      // (arrests and prisoners, as far as the country publishes them)
-      context: z.object({ death_penalty: cited.optional(), planting: planting.optional(), ...statusSections, black_market: cited.optional(), arrests: cited.optional(), ...Object.fromEntries(CONTEXT_IDS.map((id) => [id, cited])) }).strict(),
+      // (`clubs`, `driving`, `visitors`), the plain optional ones (OPTIONAL_CONTEXT_IDS) and the
+      // list of `spotlights`
+      context: z.object({ death_penalty: cited.optional(), planting: planting.optional(), ...Object.fromEntries(OPTIONAL_CONTEXT_IDS.map((id) => [id, cited.optional()])), spotlights: z.array(spotlight).min(1).optional(), ...Object.fromEntries(CONTEXT_IDS.map((id) => [id, cited])), ...statusSections }).strict(),
       sources: z.record(z.string(), source),
       subunits: z
@@ -109,7 +135,7 @@ const countries = defineCollection({
         ctx.addIssue({ code: "custom", message: 'a country marked "recreational: death" needs a context.death_penalty section' });
       }
-      const blocks = { ...data.segments, ...data.context } as Record<string, { sources: string[] }>;
+      const blocks = { ...data.segments, ...data.context } as Record<string, unknown>;
       for (const [name, block] of Object.entries(blocks)) {
-        for (const key of block.sources) {
+        for (const key of sectionSources(block)) {
           if (!(key in data.sources)) ctx.addIssue({ code: "custom", message: `"${name}" cites unknown source "${key}"` });
         }

src/lib/citations.js +2 −1
@@ -9,4 +9,5 @@ import { places, changes, SEGMENTS, CONTEXT } from "./countries.js";
 import { cultureEntries, cultureSection } from "./culture.js";
 import { archivedUrl } from "./archive.js";
+import { sectionSources } from "./segment-ids.js";
 
 const placeOf = new Map(places.map((c) => [c.slug, c]));
@@ -24,5 +25,5 @@ for (const { id, data } of await getCollection("countries")) {
   // which sections cite each source key
   const at = new Map();
-  for (const [name, block] of Object.entries({ ...data.segments, ...data.context })) for (const key of block?.sources ?? []) at.set(key, [...(at.get(key) ?? []), SECTION_NAME.get(name) ?? name]);
+  for (const [name, block] of Object.entries({ ...data.segments, ...data.context })) for (const key of sectionSources(block)) at.set(key, [...(at.get(key) ?? []), SECTION_NAME.get(name) ?? name]);
   for (const [key, s] of Object.entries(data.sources)) cites.push({ s, where: slug, owner: c && countryOwner(c), at: at.get(key) ?? [] });
   for (const s of data.subunits?.sources ?? []) cites.push({ s, where: slug, owner: c && countryOwner(c), at: [`${data.subunits.plural.replace(/^./, (x) => x.toUpperCase())} overview`] });

src/lib/cite.js +20 −2
@@ -10,6 +10,24 @@
 export const CITE_MARK = /\s?\[@([^\]]+)\]/g;
 
-// the text without its marks, for every place that shows it as plain text (lists, previews, search)
-export const stripCites = (text) => (text ?? "").replace(CITE_MARK, "");
+// A Markdown link in a text, [name](url), to a full URL or a page of this site ("/culture/…").
+// A citation mark is never one: its brackets start with "@" and are not followed by "(".
+export const LINK_MARK = /\[([^\]@][^\]]*)\]\(((?:https?:\/\/|\/)[^)\s]+)\)/g;
+
+// a plain stretch of text split into text and links: [{ t }, { t, href }, …]
+export function linkParts(text) {
+  const out = [];
+  let last = 0;
+  for (const m of (text ?? "").matchAll(LINK_MARK)) {
+    if (m.index > last) out.push({ t: text.slice(last, m.index) });
+    out.push({ t: m[1], href: m[2] });
+    last = m.index + m[0].length;
+  }
+  if (last < (text ?? "").length) out.push({ t: text.slice(last) });
+  return out;
+}
+
+// the text without its marks, and its links reduced to their names, for every place that shows it
+// as plain text (lists, previews, search)
+export const stripCites = (text) => (text ?? "").replace(CITE_MARK, "").replace(LINK_MARK, "$1");
 
 // the keys a text cites, in order of first appearance; null when it has no marks at all

src/lib/countries.js +33 −4
@@ -7,4 +7,5 @@ import { stripCites } from "./cite.js";
 import { datasetsOf, latestOf } from "./datasets.js";
 import { TIERS, tierIndex } from "./tiers.js";
+import { penaltyRow, penaltySummary } from "./penalties.js";
 export { CHANGE_CATEGORIES, CHANGE_TAGS };
 
@@ -31,6 +32,25 @@ export const MED_HELP = {
 // The order goes from how people get and use cannabis, through the market, to the police
 // (docs/COUNTRY-CONTEXTS.md).
-export const CONTEXT = [["death_penalty", "Death penalty"], ["medical", "Medical cannabis"], ["clubs", "Cannabis clubs"], ["planting", "Seeds and clones"], ["products", "Products"], ["production", "Cannabis industry"], ["black_market", "Black market"], ["visitors", "Visitors and foreigners"], ["driving", "Driving"], ["arrests", "Arrests and prisoners"], ["consequences", "Beyond the penalty"]];
+export const CONTEXT = [
+  ["death_penalty", "Death penalty", "Whether the law allows execution for cannabis offences, and whether it is carried out"],
+  ["recreational", "Recreational use", "How adults actually get and use cannabis here, legally or not"],
+  ["medical", "Medical cannabis", "How patients get cannabis as medicine: who qualifies, who prescribes, what forms there are and what it costs"],
+  ["clubs", "Cannabis clubs", "Whether members' clubs that grow and share cannabis exist, and on what footing"],
+  ["planting", "Seeds and clones", "Whether seeds and cuttings may be bought, kept, planted and sold"],
+  ["products", "Products", "Which cannabis products are on sale; being folded into the recreational, medical and hemp sections"],
+  ["hemp", "Hemp and CBD", "Low-THC hemp for fibre, food and CBD, and loophole products such as HHC"],
+  ["production", "Cannabis industry", "The legal commercial sector: who may grow, process and sell for profit, and on what terms"],
+  ["black_market", "Black market", "The illegal market: how big it is, where the cannabis comes from, prices and how openly it is sold"],
+  ["visitors", "Visitors and foreigners", "Whether someone who does not live here can get cannabis legally, and what happens to a foreigner who is caught"],
+  ["driving", "Driving", "What the law needs to convict a driver who has used cannabis"],
+  ["arrests", "Arrests and prisoners", "Published counts of arrests, offences, convictions and prisoners"],
+  ["consequences", "Beyond the penalty", "What follows a person beyond the punishment itself: records, drug registers, lost licences, jobs, deportation"],
+  ["culture", "Culture and traditions", "How cannabis sits in the country's life: customs, faith, words, music and film, festivals and attitudes, and what prohibition did to them"],
+  ["genetics", "Genetics and heritage", "Local cannabis plants, the people who keep them, and what bans and new laws did to them"],
+  ["research", "Research", "Scientific research on cannabis in the country: who studies it, what they found, and what the law allows"],
+  ["spotlights", "Country spotlights", "What makes cannabis different here: places, institutions and practices the scores do not show"],
+];
 export const CONTEXT_NAMES = CONTEXT.map(([, name]) => name);
+export const CONTEXT_HELP = Object.fromEntries(CONTEXT.map(([key, , help]) => [key, help]));
 
 // File values → short codes used in class names and filters.
@@ -39,4 +59,9 @@ const MED_CODE = { legal: "yes", limited: "limited", none: "no" };
 const isoDate = (d) => d.toISOString().slice(0, 10);
 const pair = sourceTuple;
+// the spotlights as one cited block (for the API, comparisons and plain-text lists) plus each item
+const spotlightsOf = (list, cited) => ({
+  ...cited({ text: list.map((x) => `${x.title}. ${x.text}`).join(" "), sources: [...new Set(list.flatMap((x) => x.sources))] }),
+  items: list.map((x) => ({ title: x.title, ...cited(x) })),
+});
 const plantingOf = ({ seeds, seeds_trade, clones, clones_trade }) => ({ seeds, seeds_trade, clones, clones_trade });
 
@@ -110,10 +135,14 @@ const everyPlace = (await getCollection("countries"))
       details: {
         reviewed: isoDate(data.updated),
-        segments: SEGMENTS.map((seg) => cited(data.segments[seg.id])), // in SEGMENTS order
-        context: CONTEXT.map(([key, name]) => (data.context[key] ? { key, name, ...cited(data.context[key]), ...(key === "planting" && plantingOf(data.context[key])), ...(STATUS_SECTIONS[key] && { kind: key, status: data.context[key].status }) } : null)), // null: no such section
+        // in SEGMENTS order; possession and cultivation may carry penalty steps (penalties.js)
+        segments: SEGMENTS.map((seg) => {
+          const block = data.segments[seg.id], rows = block.penalties?.map(penaltyRow);
+          return { ...cited(block), ...(rows && { penalties: { rows, currency: block.currency ?? null, summary: penaltySummary(rows) } }) };
+        }),
+        context: CONTEXT.map(([key, name, help]) => (data.context[key] ? { key, name, help, ...(key === "spotlights" ? spotlightsOf(data.context.spotlights, cited) : cited(data.context[key])), ...(key === "planting" && plantingOf(data.context[key])), ...(STATUS_SECTIONS[key] && { kind: key, status: data.context[key].status }) } : null)), // null: no such section
         sources: Object.values(data.sources).map(pair),
       },
       planting: data.context.planting ? plantingOf(data.context.planting) : null,
-      // one status per section in STATUS_SECTIONS (clubs, driving, visitors), null until researched
+      // one status per section in STATUS_SECTIONS (clubs, driving, visitors, hemp, production, research), null until researched
       ...Object.fromEntries(Object.keys(STATUS_SECTIONS).map((key) => [key, data.context[key]?.status ?? null])),
       subunitMeta: data.subunits ?? null,

src/lib/culture.js +12 −0
@@ -5,4 +5,5 @@ import { getCollection } from "astro:content";
 import { places, changes } from "./countries.js";
 import { sourceTuple } from "./sources.js";
+import { LINK_MARK } from "./cite.js";
 
 // The parts of the atlas, in menu order. `entries: true` means the section is made of files in
@@ -58,4 +59,15 @@ for (const e of cultureEntries) for (const [, path] of (e.entry.body ?? "").matc
   if (!cultureEntries.some((x) => x.url === path + "/")) throw new Error(`culture/${e.entry.id}.md: the text links to /${path}/, which does not exist`);
 }
+// Links in a country profile's segment and context texts to a history entry or a culture entry
+// must lead somewhere too (docs/DATA-MAINTENANCE.md, Links)
+const historyIds = new Set(changes.map((ch) => ch.id));
+for (const c of places) {
+  const blocks = [...c.details.segments, ...c.details.context.filter(Boolean).flatMap((x) => x.items ?? [x])];
… 9 more lines
src/lib/exports.js +3 −3

Not shown: a picture, a generated file, or past the length shown per change.

src/lib/map-views.js +1 −1

Not shown: a picture, a generated file, or past the length shown per change.

src/lib/penalties.js +85 −0

Not shown: a picture, a generated file, or past the length shown per change.

src/lib/research.js +4 −2

Not shown: a picture, a generated file, or past the length shown per change.

src/lib/segment-ids.js +39 −1

Not shown: a picture, a generated file, or past the length shown per change.

src/pages/api/[id].json.js +1 −1

Not shown: a picture, a generated file, or past the length shown per change.

src/pages/map-notes.json.js +3 −2

Not shown: a picture, a generated file, or past the length shown per change.

src/styles/global.css +32 −0

Not shown: a picture, a generated file, or past the length shown per change.

    ↑↓ to move, ↵ to open.