DevFox Labs
HomeLearningToolsAboutContact

Legal

Cookie Policy

Last updated: 7 October 2026

1. The short version

Some storage is needed to run the site — to keep you signed in, to stop abuse, and to remember the choices you make. That is on, and the site cannot work without it.

One thing is on unless you switch it off: while you read without an account, this browser remembers your progress, so a course can show what you finished and an account you create can keep it. It never leaves your device until you sign in. Everything else is off until you turn it on. We do not use advertising or cross-site tracking of any kind. Refusing costs you nothing: every lesson, every tool and every feature works exactly the same.

— change your choices at any time. The same link is in the footer of every page.

2. Strictly necessary

These are exempt from consent because without them the site cannot do what you asked it to. That is a narrow test and we apply it narrowly — note the theme row: a theme you switch to yourself is remembered because remembering it is the thing you asked for, while a theme we merely guess from your operating system is applied and never written down.

Strictly necessary cookies and storage
NameProviderCategoryStored asLastsWhat it is for
dfl_consentDevFox LabsStrictly necessaryCookie (first-party)12 monthsRemembers the choices you made here, so we do not have to ask again on every page — and so a refusal is actually honoured.
refresh_tokenDevFox LabsStrictly necessaryCookie (first-party, HttpOnly)7 daysKeeps you signed in between visits. Only set once you sign in.
oauth_stateDevFox LabsStrictly necessaryCookie (first-party, HttpOnly)10 minutesOnly set when you sign in with GitHub or Google. Makes sure the sign-in that comes back from them is the one you started in this browser.
__cf_bm, cf_clearanceCloudflareStrictly necessaryCookie (first-party)30 minutes to 1 yearBot and abuse protection on forms you submit, via Cloudflare Turnstile.
themeDevFox LabsStrictly necessarylocalStorageUntil you clear itRemembers the light or dark theme — but only once you switch it yourself. If we simply follow your operating system setting, nothing is stored.
playground-autocompleteDevFox LabsStrictly necessarylocalStorageUntil you clear itRemembers whether you turned on inline autocomplete in the code playground. Only written after you change it.
timestamp-converter-zonesDevFox LabsStrictly necessarylocalStorageUntil you clear itRemembers the time zones you keep in the Unix Timestamp Converter. Only written after you add or remove one; never holds a timestamp you entered.
course-outline:{course}:{level}DevFox LabsStrictly necessarysessionStorageUntil you close the tabRemembers which modules of a course outline you opened or closed, so reloading the page keeps them as you left them. One per course and level. Only written after you open or close a module.
lesson-tab-choiceDevFox LabsStrictly necessarylocalStorageUntil you clear itRemembers the tabs you picked in a lesson — your operating system, your package manager — and the system a keyboard shortcut is shown for, so the next lesson opens on the same ones. Only written after you pick a tab.
lesson-skip-practice-warningDevFox LabsStrictly necessarylocalStorageUntil you clear itRemembers that you asked not to be warned again before skipping a lesson’s practice while not signed in. Only written when you tick “Don’t show this again”.
lesson-exercises:{account}:{lesson}DevFox LabsStrictly necessarylocalStorageUntil you clear itWhile you are signed in, a copy of the exercises your account has passed in a lesson, so the page can show them before our server answers. The record that counts is kept with your account.
lesson-exercise-code:{lesson}:{exercise}DevFox LabsStrictly necessarylocalStorageUntil you clear it, or start the exercise overKeeps the code you are writing in an exercise, so leaving the page does not lose it. Only written after you type, and removed when you go back to the starting code.
lesson-editor-sync-scrollDevFox LabsStrictly necessarylocalStorageUntil you clear itOnly ever set for an administrator writing lessons: remembers whether the lesson editor scrolls the source and the preview together. Only written after it is switched off or back on.
lesson-editor-jump-to-blockDevFox LabsStrictly necessarylocalStorageUntil you clear itOnly ever set for an administrator writing lessons: remembers whether clicking a block in the lesson preview moves the cursor to its source line. Only written after it is switched off or back on.
lesson-editor-new-lessonDevFox LabsStrictly necessarylocalStorageUntil the lesson is saved, or the copy is discardedOnly ever set for an administrator writing a new lesson: a copy of it kept in the browser until its first save, so a closed tab does not lose it. Removed once the lesson is saved.
dfl_exclude_trafficDevFox LabsStrictly necessaryCookie (first-party)400 days, renewed on each visitOnly ever set on our own devices — for a signed-in administrator, or by a private link only the site owner has — and only so that our own visits are left out of the visitor counts. It holds no identifier, and its entire effect is that less is recorded.

One row deserves a word of explanation, because it looks like the opposite of what it is. dfl_exclude_traffic is written only on our own devices, and only to keep our own reading out of the visitor figures. It is listed here anyway: the test for disclosure is whether something was written to your device, not whether it was harmless.

3. Your progress on this device

If you read lessons without an account, we remember on this device which sections you read, which lessons you finished and which exercises you passed. It is not strictly necessary — the lessons work without it — so it is yours to switch off: under the title of any lesson, turn off Remember my progress on this device. That deletes what was kept and keeps nothing more.

Nothing here is sent to us while you are a guest. When you sign in on this browser, it is added to your account (we check each lesson and section against the lesson itself, and keep the dates you finished them) and removed from here.

Your progress on this device
NameProviderCategoryStored asLastsWhat it is for
guest-progress:v1DevFox LabsYour progresslocalStorageUntil you sign in, switch it off, or clear itWhile you are not signed in: the sections you read and the lessons you finished, so a course outline can mark them, and whether you switched this off. Nothing in it is sent to us until you sign in on this browser; then it is added to your account and removed from here. Written after you read your first section.
lesson-exercises:{lesson}DevFox LabsYour progresslocalStorageUntil you sign in, switch it off, or clear itRemembers the exercises you passed in a lesson while not signed in, so you need not solve them again. The next time you sign in on this browser they are added to your account and removed from here. Only written after you pass one.
lesson-quiz-locks:{lesson}DevFox LabsYour progresslocalStorage30 minutes per question, or until you clear itWhile you are not signed in: the quiz questions you answered wrong in a lesson, each until it can be answered again half an hour later. Only written after a wrong answer, and never sent to us.

4. Counting visits, with no cookie at all

We count how many people read the site, which country they are in, and which pages they open. None of it involves your device: it is worked out from what your browser sends with any request, so there is no storage to consent to and nothing is written or read here.

We never keep your IP address. It is turned into a one-way hash under a secret that changes daily, purely so one reader is counted once a day instead of once a page, and that hash is deleted within 48 hours. What survives is a row like “12 August, Ukraine, 431”. The Privacy Policy sets out the lawful basis and how to object — including the Global Privacy Control signal, which we honour before anything is recorded.

5. Optional — only after you allow them

None of the following exists in your browser until you say so, and all of it is removed or stops when you withdraw.

Optional cookies and storage
NameProviderCategoryStored asLastsWhat it is for
player, vuid, __cf_bmVimeoEmbedded contentCookie (third-party)Up to 2 yearsSet by Vimeo when you load one of its players inside a lesson. Nothing is set until you do.
VISITOR_INFO1_LIVE, YSCYouTube (Google)Embedded contentCookie (third-party)Session to 6 monthsSet by YouTube when you load one of its players inside a lesson. Nothing is set until you do.
_ga, _ga_*Google AnalyticsAnalyticsCookie (first-party)Up to 2 yearsCounts visits and distinguishes one browser from another so a return visit is not counted twice. Set only after you allow analytics.

6. Embedded videos

Lessons sometimes embed a video hosted by YouTube or Vimeo. Until you allow embedded content, the player is not placed on the page at all — you see a placeholder instead, and the provider is never contacted, so it never learns your IP address or which lesson you are reading.

Clicking Load video on that placeholder is your consent for embedded content across the site. Every placeholder also offers a direct link, so you can watch without turning anything on.

7. Browser signals we honour

Global Privacy Control. If your browser sends a GPC signal, we treat it as a refusal of everything optional, we do not show you the banner, and we record the refusal. You can still opt in afterwards from Cookie settings.

Do Not Track. We do not act on it. The specification was withdrawn, browsers send it inconsistently, and treating an ambiguous signal as a decision would be its own kind of dishonesty. We would rather tell you that than imply a protection you do not have. Use GPC instead — it is supported by Firefox, Brave and DuckDuckGo, among others.

8. How long your choice lasts

Twelve months, then we ask again. A refusal lasts exactly as long as an acceptance — asking someone who has already said no more often than someone who said yes would be a way of wearing them down, not a way of asking.

We also ask again if this policy changes in a way your previous answer could not have covered — a new provider, a new purpose, a new category. Wording and typo fixes do not re-ask.

9. What we keep as proof

Data protection law requires us to be able to demonstrate that consent was given, so each decision is recorded on our servers: which categories you chose, which version of this notice you were shown, when, and a random identifier from the cookie above that links your decisions together without identifying you.

We do not store your IP address with it. We store a one-way cryptographic hash of it, which shows two decisions came from the same device without recording which device that was. Records are deleted after three years.

10. Contact

Questions about this policy, or a request to see or delete what we hold: privacy@devfoxlabs.com

DevFox Labs

Structured lessons and courses for developers who care about craft.

Platform

HomeLearningAll lessonsCoursesAboutContact

Legal

Terms of ServicePrivacy PolicyCookie Policy

© 2026 DevFox Labs. All rights reserved.