Every module of the DISPO shop-site system, judged from one visitor: a tourist or local in Bangkok deciding on a phone where to buy, then walking in. What we have, what we lack, and how close each piece is to world class by Shaan's own verdicts. Tap any row for its pages, shots, specs, code and his words.
The five steps every module climbs; each row's five bars show where it is. "Best version" only counts once Shaan calls it world class; "variations" means 10 or more judged presets after that.
Ranked by value to a shop: more of the right people walk in, with less fear, at no running cost. Tap one to open it.
Can a tourist buy at all, and how do I get a prescription, are the top two questions. One sourced, dated law file answers them on every site at once and is watched weekly, because the draft Act will change the rules again.
Fear of the unknown stops the walk-in: ID, the consult, the counter, paying, where you may smoke. Five photos and five lines remove it.
Is this shop licensed, and is a practitioner really there: fears 4 and 9. Print the DTAM sticker colour, expiry and code, and the practitioner's name and licence number. That is the level beyond Shaan asked for: proof, not badges.
7,297 shops closed in 2025, so 'is it still open?' is a real fear. A weekly sync keeps hours, rating and photos true with no staff time, and feeds trust, visit and the footer.
Bridges phone to counter across the language gap: save picks, then show staff one big Thai-English card. Turns browsing into a sale.
Fear 11: where is it from? Flower must come from a GACP-certified grower and imports are banned; naming the grower and certificate proves both.
Visitors now ask ChatGPT and Gemini 'best weed shop near Nana'. llms.txt, facts.json and FAQ data make AI assistants name the shop correctly.
Card or cash, the consult fee, which languages, Wi-Fi, ATM nearby: the small doubts that decide between two shops. All from Maps attributes and the profile.
Visit is already good. The level beyond is the last 200 metres: a photo walk from the BTS exit, the door itself, a Grab link and a Thai card for the driver.
A few honest pages for the hotels, stations and landmarks around the shop win the 'near me' searches with no ad spend.
Chinese visitors are the largest group in Bangkok and Google Maps is blocked for them. Amap links, WeChat and Alipay notes and Chinese copy open that market.
At many sites nobody can look: a weekly self-check (dead links, stale facts, law-file change, licence sticker expiry, speed) keeps them all true with no one watching.
Theme, brand and art; every other module draws from these.
Gate, header, footer, agent: the frame around every page.
Before the visit: Google, Maps, AI assistants, other languages.
The first screen and the proof: legal, real, safe, good.
What they have, what it does, what it costs.
Every question answered before they walk in.
Open now, how far, which door.
The counter, the visit, coming back, telling friends.
Keeps every site true with no staff time.
From map/THEORIES.md: Shaan's or anyone's.
Reasoned from the visitor's whole trip (find, trust, choose, ask, get there, walk in, come back) and from four scans: 15 shop sites (64 rows), Bangkok tourist questions and the 2025-2026 law (34 rows), static-site techniques (36 rows) and the trust teardown, plus Shaan's 257 points. Each fits the rules (static, built by script, no running cost) unless its Rules line says otherwise.
JobOne dated, sourced card: tourists need a Thai prescription (PT33) for flower, foreign ones are not recognised, 30-day supply, passport, no smoking in the shop or in public, never take it home or on a flight, dose and aftercare.
WhyCan a tourist buy at all, and how do I get a PT33, are the top two questions in about 20 sources read (TAT 26 Jun 2025; Tilleke 3 Sep 2025). A wrong answer is the biggest risk to the visitor and to the shop's licence, and the draft Cannabis Control Act (cabinet, 22 Sep 2026) will change it again.
DataOne shared law file for all shops: each rule with its official source, the date checked and a hash; a weekly script watches TAT, the Royal Gazette and the draft Act and flags any change. Conflicting sources are shown as conflicts, never guessed.
Rulesyes. One file serves every site; the composer already reserves learn.law. Wording checked by Thai counsel before it ships
JobFive photos and five lines: passport at the door, the consult with the on-site practitioner (PT33), choosing up to a 30-day supply at the counter, paying, and where you may and may not smoke after.
WhyIs a doctor really on site, what does the consult cost, will I be turned away: fears 2, 9 and 14 of 15 in the tourist scan. No Bangkok shop shows the steps; Boerejongens publishes house rules.
DataThe shop's own photos (or Maps photos), the law file for the consult step, the profile for payment and lounge.
Rulesyes. The composer already reserves learn.steps
JobA scheduled script refreshes rating, review count, hours, photos and attributes from Google Maps and lists what changed for the owner.
Why7,297 of 18,433 licensed shops closed by the end of 2025 (ANN, 6 Jan 2026): 'is it still open?' is a real fear, and the site and Maps disagreeing loses the visitor. The sync also feeds trust, visit, footer and gallery.
DataGoogle Places API (1,000 calls a month free, then $25 per 1,000), run weekly per shop; numbers stay private, out of git.
Rulesyes, within free limits. One weekly call per shop stays inside the free tier for hundreds of shops
JobSave picks on the phone, then show staff one big Thai and English card: names, grams, questions.
WhyBridges browsing and buying across the language gap; the visitor walks in knowing what to ask for. The composer already has a 'pick' page.
DataThe menu and strain library; the list lives in the phone's local storage, never on a server.
Rulesyes. Client-side only
JobFor each product: the GACP-certified grower with certificate number and expiry, batch, harvest date, Thai-grown, and a lab result where one exists (voluntary, labelled so).
WhyWhere is the flower from, is it imported, is it tested: fear 11 in the tourist scan. Flower must come from a GACP-certified site and imports are banned (Tilleke; Theo-Courant), so a shop that shows its grower proves both.
DataOwner fills at claim (M56) or in the menu export; lab PDFs linked, not hosted.
Rulesyes. Hidden per field when empty; no claims without a document
JobMakes ChatGPT, Gemini and Perplexity name the shop correctly: llms.txt, a facts.json, FAQ and LocalBusiness data.
WhyTravellers now ask an AI assistant 'best weed shop near Nana' before Google. If the facts are not machine-readable, the assistant guesses or names a rival.
DataShop profile, branch hours, the shared law file, the FAQ; all already in the composer.
Rulesyes. Static files written at build
JobOne strip of small facts: card or cash, the consult fee and how long it takes, languages spoken, Wi-Fi, ATM and 7-Eleven nearby.
WhyThese small doubts decide between two shops on the same street.
DataGoogle Maps attributes (via M41), the shop profile, OpenStreetMap for ATMs.
Rulesyes
JobThree to five honest pages: 'near Asok BTS', 'near Terminal 21', 'from the Grande Centre Point', each with the real walk.
Why'Near me' and 'near my hotel' searches decide most first visits; a page per real landmark wins them with no ad spend.
DataThe Bangkok city pack (landmarks, stations, hotels) and a walking graph from OpenStreetMap; walk times by script.
Rulesyes. Generated per shop at build; only true landmarks within walking distance
JobAmap and Baidu links with the right coordinates (GCJ-02), WeChat and Alipay notes, Chinese copy, a Xiaohongshu-ready share image.
WhyChinese visitors are the largest group in Bangkok and Google Maps does not work for them.
DataBranch coordinates converted at build, translations, payment flags from the profile.
Rulesyes
JobA weekly script per site: dead links, stale facts, law-file change, speed budget, licence expiry date.
WhyAt hundreds of sites nobody can look; the site must tell us when it is wrong.
DataThe built site, the law file hashes, the profile dates.
Rulesyes. Runs on the free scheduled build
JobShows a price range per gram for the area and today's price in the visitor's currency.
WhyTourists fear being overcharged; a shop that shows the going rate and the conversion earns the walk-in.
DataTHB rates daily from an open exchange API (CC0), the shop's menu prices, an area range from the city pack.
Rulespartly. Static and free, but price display must pass the ad-law list first
JobA small map of what is near: food, coffee, the night market, the hotel strip.
WhyVisitors plan an evening, not a purchase; a shop that helps plan it gets chosen and remembered.
DataOpenStreetMap points of interest, refreshed monthly by script.
Rulesyes
JobSave the shop for later: contact card, calendar entry, offline trip card, Wallet pass.
WhyMost visitors find the shop hours before they go; what they save, they visit.
DataProfile and hours; vCard and .ics are files at build.
Rulespartly. vCard, .ics and the offline card are static; a Wallet pass needs one shared signing certificate
JobThai holidays, special hours, events and closures, as a page, as structured data and as .ics.
WhyTurning up to a closed shutter on a Buddhist holiday loses the visitor for good.
DataA shared Thai holiday file plus the owner's events; Event and specialOpeningHours data at build.
Rulesyes
JobOne switch on Home: browsing from home leads with the menu and the way here; in the shop now leads with your list and today's games. It flips by itself at the door, only if the visitor allows location.
WhyA first-timer at 11pm needs 'open now, how to buy'; a regular at noon needs today's menu.
DataBrowser only: time and local storage; location only after a tap (a 120 m geofence round the door), never stored or sent.
Rulesyes. Client-side, no tracking; language comes only from the switch or ?lang=
JobA /screen page for the TV behind the counter: today's menu, strain cards, the QR to the site.
WhyTurns the site into the shop's menu board with no extra hardware cost; the composer already lists a 'screen' page.
DataThe menu sync and the strain library.
Rulesyes
JobFiles to print: QR posters, counter stand, stickers, the menu PDF, the taxi card.
WhyBridges the street and the site; the window QR is how a walker-by becomes a visitor.
DataBrand kit and menu; PDFs generated at build.
Rulesyes
JobA good-looking card per page and a share button, so a friend can send the shop in one tap.
WhyTravellers decide in groups; the shop gets chosen in the group chat.
DataBrand kit, rating and hours; images generated at build.
Rulesyes
JobThe owner claims the site and edits facts, photos and menu through a simple form that commits to their own repo.
WhyThe owner knows the truth (lab results, events, prices); a git-based editor lets them fix it without us.
DataThe owner's GitHub repo (M38) and a git-based CMS.
Rulesonly via git. No server of ours; edits are commits on the owner's repo
JobShows the owner their current site beside ours, with the numbers that differ.
WhyThe fastest sale is the shop seeing itself better (IDEAS-OPUS idea 1).
DataThe import of their current site and a built preview.
Rulesyes
JobThe shop's latest Instagram or TikTok posts on the site.
WhyShows the shop is alive this week.
DataOfficial embeds refreshed by schedule.
Rulespartly. Embeds load third-party scripts and Instagram needs an app token; prefer the photos from M41
Broader (more of the visitor's job) and deeper (real data and proof behind every claim), not prettier.
Broader: answer every fear with proof, not badges. Licensed: the DTAM sticker colour, expiry and 8-digit code printed so the buyer can match it at the door (Thairath, 27 May 2026). A named practitioner on site with their licence number. Thai-grown from a named GACP grower (M44). Restraint shown: no ads, no online orders, no smoking on site. Alive now: open and licensed until 2027, photos and reviews this month (7,297 shops closed in 2025). Deeper: ratings from Google plus other platforms, review themes counted by script, and the official reporting route shown.
The last 200 metres: a photo walk from the BTS or MRT exit (Mapillary, CC BY-SA), the real door, a Grab deep link, and a Thai card to show the driver.
Theme from the shop's real photos and sign, not only its logo; four families (clean, street, night, luxe) already pick comps per family.
Real photos of the shop's own door, counter and street, refreshed from Maps; licensed pools only as a fallback.
The profile refreshes itself (Maps sync M41) and the owner corrects it in their own repo (M56); data switches comps, not hand-written rules.
Structured data per branch with opening hours and special hours, hreflang across five languages, and the AI answer kit (M39).
The gate is also the branch picker (Sweet Flower) and carries one dated law line from M42, watched weekly.
Offline trip card (address, map, phrases) that works in a dead zone, and the in-store screen (M53).
The monthly note says what changed in the shop's search and Maps numbers, written by script.
Search over menu, guides and answers built at deploy (Pagefind), and the language picked from the browser.
Live facts in the footer (open now, closes in, last menu update, this week's rating) from the scheduled syncs, not static text.
Answers grounded only in the shop's own facts and the shared law file, with the source shown; hands off to LINE or WhatsApp with the question prefilled. Owned by BUDTENDER.
View transitions between pages with the shop's logo as the thread; nothing that slows the first paint.
Fed only by the calendar (M51) and the menu sync, so it is never stale and needs no one to post.
A decision screen, not a poster: open now and closes at, minutes from here, legal for you (one line from M42), what's good today, the real door. It changes with time of day and first visit (M52).
A three-tap finder (feeling, strength, form) that ends at the counter card (M46) with real menu items, not a category page.
Today's real menu from a scheduled sync, with the date it was last updated (the Allbud stale badge) and prices in the visitor's currency where the law allows.
Woven into the visit, within ad law: scan the counter QR to check in, a stamp per visit, Tonight's pick. The reward is the moment, never a discount advert.
Questions ranked by what visitors actually ask (Maps Q&A, reviews, chat logs counted by script), each answer dated and sourced, published as FAQ data for Google and AI assistants.
Photos refreshed from Maps and the owner's uploads by the sync, dated, so the gallery shows the shop as it is this month.
One tap opens LINE or WhatsApp with the question already written in the visitor's language (LINE oaMessage links); LINE is on 65 of 118 Bangkok shops.
The menu as the shop's truth: synced on a schedule, last-updated date shown, batch facts (M44), add to my list (M46), terpene and effect filters.
Lab and batch facts, smell, taste and effect words (Dampkring), and 'show this at the counter'.
One shared strain library for every shop, filtered by terpene, effect and grower (MedMen Thailand), linked to who has it in stock today.
Each branch page is a near-here page (M40) in itself: its station, its landmarks, its own photos and rating.
Real faces, a dated timeline (opened, licence, awards) and the owner's own letter; every line a fact the owner confirmed.
Prefilled chat in the visitor's language, save the contact (vCard), and the reply time the shop really keeps.
Posts written by script from data that changes (law updates from M42, new strains, area guides from M40), shared across shops so one update reaches all.
The learn page carries the law card (M42) and the first-visit steps (M43); the composer already reserves those two slots.
The prescription guide done right (Siam Green: in-shop practitioner, the form, 30-day supply, foreign prescriptions refused), in the visitor's language, dated.
Only what the lawyer's list allows; fed by the calendar, gone when it ends.
Generated from the shared law file and the asset credits at build, so it is never out of date.
The 404 offers the nearest real page, directions and the budtender, not a dead end.
The shop owns the repo; scheduled rebuilds run on their free Cloudflare account through a deploy hook, so we hold no running cost.
Straight from composer/packet.json: every page the composer builds, its slots in order, the comps that can fill each one (dashed: planned, not built), each family's default pick and the data the slot needs. Core pages are on every site; the shop's own data switches the rest on. Tap a comp to open its module.
One strain the shop recommends tonight, picked by a daily script from what is in stock, shown on the first screen and in the footer. Gives a first-timer one easy answer and gives regulars a reason to look again.
Shows what a fly-by-night shop could not fake: years at the address, licence history, the same staff in photos across years. Visitors trust what is expensive to fake more than any badge.
A free sticker set of the shop's budtender face, offered when someone adds the shop on LINE. Puts the shop's face in Thai group chats every day.
Add one: a block in map/THEORIES.md ("## Name", then "- job:", "- why:", "- data:", "- by:"), or say it to the MODULE-MAP seat. The page rebuilds itself after each landing.