Privacy policy

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

What's on this page

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:

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 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

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

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

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.