Privacy policy
Effective October 24, 2026
Preceptor is a CCRN study tool made by Owen Kurth. This page says what the site and the study app collect about you, why, who handles it, and what you can do about it. It is written to match the code as it runs today, not a template. If something here turns out not to match, that's a bug, and I'd like to hear about it.
Preceptor is operated by RVLZ LLC, a Washington limited liability company doing business as Preceptor Prep.
Please keep patients out of it
Preceptor is for exam study, not patient care. Don't type a patient's name, dates, room number, MRN, or anything else that could identify a real patient into the tutor, a problem report, or anywhere else in the app. The tutor only needs the question in front of you. Questions you type to the tutor are sent to outside AI services (see The AI tutor), and Preceptor is a study product, not a HIPAA-covered health care service, so it isn't built or contracted to hold protected health information. If you describe a situation from work, keep it general.
The short version
- The home page runs no analytics and loads no third-party scripts, fonts or trackers. There are no cookies on it.
- The waitlist stores your email address and when you joined. Nothing else.
- Pre-orders happen on Stripe's checkout page. I never see your card number. Stripe tells me who paid, and I keep that record so I can send your sign-in link and honor the refund promise.
- The study app (invite-only beta) stores your name, your email, your study progress, how often you use the tutor and what it cost, and any problem reports you send. It sets one cookie to keep you signed in.
- When you ask the tutor something, the question on your screen and what you typed go to an AI model through OpenRouter. Nothing you ask or the tutor says is stored on my side.
- Nothing is sold, and nothing is used to train AI models.
- You can download everything the app holds about you from this page while you have access. Data isn't deleted on request.
What's on this page
- The waitlist
- Pre-orders and Stripe
- Your study app account
- Your study progress
- The AI tutor
- Problem reports
- What I can see
- Who handles the data
- Cookies and storage on your device
- How long things are kept
- Security, honestly
- Your choices
- Age
- Changes
- Contact
The waitlist
If you leave your email on the home page, I store the address (lowercased) and the time you sent it, in a Cloudflare KV store that only this site's code and I can read. No third party sees the list.
It's used for exactly what the form says: one message when Preceptor ships, and one progress note on the way if there's something worth showing. The form has a hidden field that catches bots; anything that fills it is dropped, not stored.
There's no automatic expiry. You can ask to stop getting these emails at any time (see Your choices).
Pre-orders and Stripe
The pre-order button sends you to Stripe Checkout, on Stripe's own pages. Stripe collects your name, email, card and billing details, takes the payment, and emails you the receipt. Stripe creates a customer record for you in my Stripe account. Your card number never reaches my servers; Stripe's handling of it is covered by Stripe's privacy policy.
After you pay, Stripe sends my server a notice. From it I keep one record per order: your email (lowercased) and name as you gave them to Stripe, Stripe's ids for you and the payment, the amount and currency, when you paid, and whether the order was later refunded. It's stored in the same Cloudflare KV store as the waitlist, keyed by the checkout session. I keep it so I can count pre-orders, send your sign-in link to the address you paid with when Preceptor ships, and process refunds.
The receipt email is also how refunds work: you reply to it, and I refund you through Stripe. Stripe keeps its own records of every payment and refund under its own policies, which I can't delete.
Your study app account
The study app at /app is invite-only while it's a prototype. You sign in the first time with an invite code from me, choose a password, and after that sign in with your email and password, or with a short-lived code made by a device you're already signed in on. Here is what an account holds:
- Your name, as I typed it when I invited you.
- Your email, which the app asks for the first time you sign in. It's stored as you typed it, and one account per email. It's how you sign in and how I'd reach you; nothing is emailed from the app itself today.
- Your password, never as typed: only a salted hash (PBKDF2-SHA256, 100,000 rounds), the salt, and when it was last changed. I can't read your password or recover it; if you forget it, I give you a new invite code and you choose another. You can change it from the app's footer.
- An account id: "owner" for me, or a random string for everyone else. It's never derived from your name or email.
- When the account was made and when you were last here (updated at most once an hour while you use the app), and whether your access has been removed.
- Sign-in codes. An invite code (for a first sign-in or a password reset) works once within 7 days. A sign-up code (a QR the owner puts up, say in a break room) can make a set number of accounts until a date or until it's turned off; your account records which one you joined with. Only a SHA-256 hash of each code is stored, with when it was made, when it expires, and when it was used or cancelled.
- Failed sign-ins. A wrong password adds to a counter under your IP address and one under the email you typed; a wrong code, under your IP address only. The counters live in KV for 15 minutes, and ten failures lock that address or email out for 15 minutes. The IP address isn't stored otherwise.
Signing in sets one cookie (see Cookies). I can remove anyone's access from my side; that signs out every device you have and stops new sign-ins, but it doesn't delete your data (see How long things are kept).
Your study progress
The app keeps one progress document per person, so a phone and a laptop stay in step. It holds, for each question and flashcard you've seen: how many times you've seen it, how many you got right, whether the last answer was right, the review interval and the date it's due, and when that record last changed. It also holds a daily log of what each of your devices did (questions answered, cards rated, time spent, per blueprint area), your settings (exam date, daily goals, session size and length), the round you're in the middle of, and any problem reports you've kept on the device.
Each device keeps its own copy in the browser (see storage) and syncs it to the server, which merges the copies so nothing is lost. The server copy lives in a Cloudflare D1 database. It's used only to run the app for you: scheduling what comes back, showing your progress and streak, and (for me) seeing whether the beta is being used.
The AI tutor
The tutor answers only when you tap a suggestion or type a question under a question, a flashcard, or a round's misses. Each time you do, my server builds a request and sends it to OpenRouter, which passes it to the AI model's provider. Today that's a Claude model made by Anthropic (Anthropic's privacy policy); I may change models. The request contains:
- the question or flashcard on your screen, with its keyed answer, the choice you picked, its rationale and practice notes, and a handful of related flashcards; for a round summary, the questions you missed and what you picked on each;
- the tutor's instructions and the verified guideline notes that ship with the question bank;
- the text you typed, up to 1,000 characters, and the last few exchanges you've had with the tutor on that same item;
- your account id (the random string, not your name or email), so OpenRouter can show me usage per person.
The request tells OpenRouter to use only model providers that don't retain prompts (its "data collection: deny" setting). I rely on OpenRouter and the provider to honor that and their own policies; I can't see what they log.
On my side, nothing you ask and nothing the tutor says is stored or logged. What is recorded, per person per day: how many times you asked, how many tokens the answers used, and what they cost in dollars as OpenRouter reports it. That's how the daily and monthly limits work. The conversation itself lives only in your browser's memory while you're on that item and is dropped when you move on.
If an answer fails, the server logs only the error code OpenRouter returned, never the prompt.
Problem reports
"Report a problem" under a question or card saves the item's id, your note (up to 2,000 characters) and the time, in the database with your account id, and also in your progress on the device. I read every report on my People page, next to your name. Reporting the same item again replaces the earlier open note. When I've dealt with a report I mark it resolved; it isn't deleted. Please keep patient details out of reports.
What I can see
Because this is a small beta run by one person, it's fair to say plainly what my side shows me. For each person: your name, email, when you were last here, whether you have access; your study totals (days studied, time in the last 7 days, questions answered, cards rated, the last day you studied); what the tutor cost for you today, this month and in all; and your open problem reports. I can also read the database directly, which includes your full progress document. I don't share any of it.
Who handles the data
- Cloudflare hosts the site and runs the code, the KV store and the D1 database (Cloudflare's privacy policy). Every request to the site passes through Cloudflare, so like any host it sees your IP address and the request as part of serving it. When something fails on the server, a short error line (no card details, no tutor text) is written to Cloudflare's function logs.
- Stripe takes payments and sends receipts, as above.
- OpenRouter, and through it the model's provider (currently Anthropic), answer tutor questions, as above.
That's the whole list. The pages load no analytics, advertising or social scripts, and the fonts are served from this site, not from a font service. The code can load Cloudflare Web Analytics (a privacy-focused, cookie-free page counter) if I switch it on; it's off today, and if I turn it on I'll say so here.
Nothing is sold, rented or shared for marketing. Nothing is used to train AI models, mine or anyone else's.
Cookies and storage on your device
The home page and this page set no cookies.
The study app sets one cookie, named preceptor_app, when you sign in. It carries your account id, a sign-in generation number, an expiry, and a signature, so the server can tell the request is yours. It's HttpOnly (scripts can't read it), sent only to the app's own /api/app addresses, and lasts one year. Removing your access, or my rotating the signing key, makes every such cookie stop working.
The study app also uses your browser's storage, under keys that start with preceptor: your light/dark choice, your progress document, which account last used this device, a random name for this device (so two devices' daily counts add up), whether you've seen the welcome screen, and which panels you left open. Its service worker keeps an offline copy of the app, its build files and your question bank in the browser's cache so it works without a connection. If you sign in on a device someone else used, their progress and cached bank are wiped from it first. If you're signed out, the cached bank is dropped.
Clearing the site's data in your browser removes all of it. Your synced progress on the server is unaffected.
How long things are kept
- Waitlist addresses: indefinitely. No automatic expiry.
- Pre-order records: for as long as I need them to handle refunds, and after that for as long as tax and accounting rules require.
- Passwords: the hash is kept while your account exists, and replaced when you change it.
- Sign-in codes: the hash stays in the database after the code expires or is used; the code itself is never stored and can't be recovered from the hash.
- Failed sign-in counters: 15 minutes.
- Account, progress, tutor usage and reports: while your account exists. Beta accounts carry over when Preceptor launches, so there's no end date. I can remove an account's access at any time; the data is kept so access can be restored. Marking a report resolved doesn't delete it. Nothing is deleted automatically.
- Tutor conversations: not kept at all on my side.
- Backups: I take a copy of the database by hand before changing its structure and keep it on my own computer.
I don't delete data on request.
Security, honestly
Everything travels over HTTPS. Passwords are stored only as salted PBKDF2 hashes. Sign-in codes are random, hashed before storage, single-use, short-lived, and rate limited. The session cookie is signed with a secret kept only on the server and can't be read by scripts. Every record is reached only through the account the verified cookie names, never through anything the browser claims. Stripe's notices are checked against their signature before anything is stored. Card details never touch my servers.
Still: this is a one-person project in beta, and no system is perfectly secure. There's no row-level security in the database beyond the checks in the code, backups are manual, and the AI services are outside my control. Don't put anything in the app you'd be harmed by if it leaked, and don't put patients in it at all.
Your choices
- See and download your data. While you have access, download your data (sign in to the app first, in this browser). It's a JSON file with your account, your full progress document, your reports and your tutor usage. That's everything the app holds about you.
- Stop waitlist emails. Email me, or reply to any message from me, and I'll stop sending them.
- Deleting data. Accounts and data aren't deleted on request. Stripe keeps its own payment records under its policies.
- Change your password: "Change password" in the app's footer. Forgotten it: email me for a new invite code.
- Correct your email: email me.
- Sign out a device: there's no sign-out button yet. Clearing the site's data in that browser removes the cookie; or email me and I'll end every session you have.
Age
Preceptor is for licensed nurses preparing for a certification exam. It isn't for anyone under 18, and I don't knowingly collect information from anyone under 18. If you think a minor has given me information, email me and I'll remove it.
Changes
When this page changes, the date at the top changes with it. If a change affects what's collected about you or who handles it, I'll say so on this page, and if I have your email I'll tell you.
Contact
Anything about your data, or anything here that doesn't match what the app does: hello@preceptorprep.com. I read and answer the email myself.