System map
System map
What the Lab website is made of, what is public and what is private, and every address it answers.
This map shows the Lab website as it runs: a static site, one small API for the forms and the answer checker, and the email that a visitor can ask for. There are no accounts, no sign-in and no cookies on this site. The periods in the tables below are the ones of the privacy notice.
Map
The internet on the left, the public zone in the middle, the private zone on the right, one boundary between the zones.
Scroll the map sideways. The numbered list below describes every line.
Every line, in words
The same map as a list, for screen readers and for printing. Numbers match the circles on the map.
- 1Visitor browser to CloudFront. Every request goes through one front door over HTTPS: pages, search, the forms and the answer checker. The firewall and the security headers apply to all of them.
- 2SectraTEK.com and the Lab. The main site links to the Lab and the Lab footer links back. Links only, no data.
- 3Visitor browser to other sites. Some pages link to public projects on GitHub and other sites. The visitor leaves this site, and the Lab sees nothing of what happens there.
- 4CloudFront to the static site. Pages, assets, the search index, the feeds and the site map are static files in a private bucket that only CloudFront can read.
- 5CloudFront to the Lab API. Calls to /lab-api/v1 on the same address as the pages. Nothing is cached. The form and checker calls are accepted only from the Lab’s own pages and only as JSON, and the API limits how many calls a network can make.
- 6Lab API to the Lab tables. Crosses the boundary. The API stores a participant form entry, a question or a newsletter request, and deletes an entry when its id is sent. It stores no IP address and no user agent.
- 7Lab API to the answer keys. Crosses the boundary. The checker reads the key of one challenge and returns which answers are right, the score and a hint for a wrong answer. It never returns an answer and does not keep the answers it checks.
- 8Lab tables to the background service. The service picks up mail waiting to be sent and deletes data when its period ends.
- 9Background service to the email service. Each message is handed to Amazon SES.
- 10Email service to the visitor’s mailbox. Crosses the boundary. Only when a visitor ticks the newsletter box and gives an address: one confirmation message, and a welcome message after the confirmation. Both come from the SectraTEK newsletter address and carry an unsubscribe link.
- 11Email service to the research mailbox. One notice for each question sent through Ask the Lab, from the SectraTEK notice address. Nothing is sent to the visitor. Staff answer by hand from their own mailbox.
- 12Visitor’s mailbox to the browser. The confirm and unsubscribe links open a page with a button. Opening a link changes nothing; pressing the button does.
- 13Site build to the static site. Crosses the boundary. The only thing that goes from the private zone to the public one is the built site. Nothing on the site can write to the bucket.
- 14CloudFront and the Lab API to the logs. Crosses the boundary. The access and firewall logs hold the full IP address; the Lab API’s own log holds the kind of request, the result and the IP address cut to a prefix, never the content.
Addresses
Every address the Lab site answers. All of them are anonymous: there is no account and no sign-in. Staff tools are on a separate host and are not part of this site.
| Method | Path | Access | Data | Called by | Notes |
|---|---|---|---|---|---|
| Static site (CloudFront to the bucket) | |||||
| GET | / and /* | Anyone | HTML, CSS, JS, images, fonts | Visitor browser | No cookies are set. Pages are checked for a new version on every visit. |
| GET | /assets/search-index.js | Anyone | Titles and descriptions | Search box | Built with the site. Searching happens in the browser. |
| GET | /feed.xml, /atom.xml, /feed.json | Anyone | Research articles and open-source posts | Feed readers | Built with the site. |
| GET | /assets/research/<id>/* | Anyone | Appendix data of an article | Article pages | Public by design. |
| GET | /sitemap.xml, /robots.txt | Anyone | Page list | Search engines | |
| Lab API (CloudFront to the API, never cached) | |||||
| POST | /lab-api/v1/participants | The Lab’s own pages. Rate limited | Role, experience; optional country, interests and how you heard of us; newsletter choice; an email only with the newsletter box; consent version; the challenge you were on | About you form, form after a challenge | Returns the entry id once. Stores no name and no network data. The email goes only to the newsletter list. |
| POST | /lab-api/v1/participants/delete | The Lab’s own pages. Rate limited | The entry id | Delete my answers button | Deletes the entry. The answer is the same whether the id existed or not. |
| POST | /lab-api/v1/challenges/<id>/check | The Lab’s own pages. Rate limited | The answers for one challenge | Challenge pages | Returns right or wrong, the score and a hint for a wrong answer. Never returns an answer. Answers are not stored. |
| POST | /lab-api/v1/ask | The Lab’s own pages. Hidden field, fill time, rate limit | Topic, question, optional name and email, public or private answer, the confirmation box | Ask the Lab form | Words only: no files. Stores the question and sends one notice to the research mailbox. Returns a reference. |
| GET | /lab-api/v1/newsletter/confirm | Link token | The token in the link | Link in the confirmation message | Shows a page with a button. Opening the link confirms nothing. |
| POST | /lab-api/v1/newsletter/confirm | Link token | The token | The button on that page | Confirms the subscription, then shows the confirmed page. The welcome message follows. |
| GET | /lab-api/v1/newsletter/unsubscribe | Link token | The token in the link | Link in every Lab message | Shows a page with a button. |
| POST | /lab-api/v1/newsletter/unsubscribe | Link token | The token | The button, or the one-click unsubscribe of a mail program | Removes the address from the list, then shows the unsubscribed page. |
| Any | /lab-api/*, any other | Anyone | None | Answers “not found”. | |
What is public, what is private
| Item | Zone | Note |
|---|---|---|
| Research articles, technical reports, figures, appendix data | Public | Static files, CC BY 4.0 unless a page says otherwise. |
| Dataset pages, reference answers and checksums | Public | The pages and the files are on this site, as static files. |
| Challenge pages and questions | Public | The answer keys stay with the API and are never in a page. |
| Answered-questions archive | Public | Only questions the sender agreed to publish, edited. |
| Questions to the Lab, with the optional name and email | Private | Kept in a private table and sent to the research mailbox. Never on the site. |
| Participant form entries | Private | No name, no address, no network data. |
| Newsletter addresses and the do-not-mail list | Private | Used only to send the Lab newsletter. |
| Answer keys | Private | Read only by the answer checker. |
| Rate-limit hashes and logs | Private | For running the site and stopping abuse. |
Data we keep, and for how long
| Data | Why | Kept for |
|---|---|---|
| Challenge progress, typed answers, hints opened, entry id | Your own progress | In your browser only, until you clear it |
| Ask the Lab question, optional name and email | To answer, and to publish if agreed | Text, name and email 12 months after we answer, or after we receive the question if no answer is recorded. The record of the request, without the text, 24 months. |
| Participant form entry (no name, no address, no network data) | To learn who uses the challenges | 24 months, or until the person deletes it |
| Unconfirmed newsletter request | Double opt-in | 7 days |
| Confirmed newsletter address | To send the newsletter | Until the person unsubscribes, then a minimal record so we do not write again |
| Challenge answers you check | Checking the answer | Not kept. The server checks and discards them. |
| Rate-limit hashes (salted, changed daily) | Abuse control | 1 day |
| Access logs (CloudFront, storage, load balancer): full IP address and full web address | Running the site, stopping abuse | 30 days |
| Security logs (firewall): full IP address, no query string | Stopping abuse | 3 months |
| The Lab’s own server log: request kind, result, IP address cut to a prefix | Running the site | 3 months |
| Backups of the database | Recovery | 35 days |
These periods are the ones of the privacy notice, version 0.4, which is not in force yet.