Before you start, we need to know what year you were born. It's the only thing we'll ask, and we don't keep the answer — just whether you're old enough to have an account here.
We're asking everyone this once, including readers who were here before the question was. What year were you born? We don't keep the answer, only whether you're old enough to have an account here.
Signed in as .
You typed . We only ask this once, so it's worth a second look before you send it.
Thanks for telling us. This site keeps schoolwork, so accounts here are for students aged 13 and over — yours can't be used yet, and nothing you do will be saved.
If that's wrong, or a parent or teacher set this up for you, say so here and a person will sort it out. Nothing is lost by waiting.
Thanks for telling us. This site keeps schoolwork, so accounts here are for students aged 13 and over. We've deleted the account you signed in with, and everything that came with it.
If you typed the wrong year, or a parent or teacher set this up for you, say so here and a person will reply. We answer once, then delete your message.
Papers flapped, their rustling lost in the dusty wind.
She wiped the glass with her damp hand.
Rather than improving the view, the moisture smeared dust.
They'd all be punished.
Ortega's cooking left a lingering taste of old pennies.
Then, he laid the towel down at the corner.
Once saturated, the towel quickly stopped cleaning.
Scrambling over the cafeteria bench, Marcus fell.
The bucket sloshed but managed not to tip.
The man never could hide a smile.
The dust stung his eyes.
Still, he kept watch.
Running meant breathing through the mouth.
public class Gradebook {
private final List<Answer> answers;
public double score(String codeName) {
int right = 0;
for (Answer a : answers) {
if (a.isCorrect()) {
right++;
}
}
return right * 100.0 / answers.size();
}
}
while (bell.notRung()) {
student.tryAgain();
}
public class Gradebook {
private final List<Answer> answers;
public double score(String codeName) {
int right = 0;
for (Answer a : answers) {
if (a.isCorrect()) {
right++;
}
}
return right * 100.0 / answers.size();
}
}
while (bell.notRung()) {
student.tryAgain();
}
A writer and a teacher
Battlesuit LLC
two years into a novel called Battlesuit
Why this exists
Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero.
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Marcus dismissed that option as worse than death. Papers flapped, their rustling lost in the dusty wind. Sutter's responding insult died in a coughing fit. She wiped the glass with her damp hand. “Our turrets are holding.” Rather than improving the view, the moisture smeared dust. He grumbled, “infuriating,” into his mask. They'd all be punished. “But what if we get our refinery back?” Ortega's cooking left a lingering taste of old pennies. A date had been set. Then, he laid the towel down at the corner. Then, another idea hit him. Once saturated, the towel quickly stopped cleaning. Still, invoking his name made Marcus stand straighter. Scrambling over the cafeteria bench, Marcus fell. He’d be in space when it happened. The bucket sloshed but managed not to tip. If anything, his heroism was overdue for adequate recognition. The man never could hide a smile. The dust stung his eyes. Still, he kept watch. Running meant breathing through the mouth. The dust stretched deep, coating his throat. He glanced over his shoulder at the watchtower. Signaling the old man might have the opposite effect. He blew out a sigh. Best not drag it out. “Thank the stars that’s not my concern.” “It is too late for you.” He smacked the papers with his air filter. Get out of here or die. “We’ve got nowhere else to go.” Marcus spoke like he was rattling prison bars. It wasn't entirely true. Pepper's Gulch needed a hero.
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
// every account, at sign-up
code_name = deal(word_list);
// every tool the coding agent reads
show(student.code_name); // never a name or email
// every save to a writer's chapter
if (session.user != chapter.owner) refuse();
if (!session.signedInWithOAuth()) refuse();
history[chapter][today] = words;
// every write to student data
require(age_ok());
// every table
row_level_security = ON;
rows.where(student == you);
// a page view
counts[today][page] += 1; // no cookie, no IP
// on your request
erase(you);
prove(count(you) == 0);
Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you. Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you. Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you. Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you. Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you. Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you. Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you. Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you. Certainly! Here is your essay. As an AI language model, I can finish this assignment for you. Here's a complete answer you can submit: I've rewritten your chapter to be more engaging. Great question! The answer is B. Below is the finished code. Here are ten tips to make your story pop: In conclusion, the theme of the novel is I hope this helps! Here is a summary, so you don't have to read it. Sure! Here's the whole project, commented. Absolutely. I'll write the next chapter for you.
an aspiring novelist
with AI getting in the way
so what if…
an aspiring novelist,
whose sentences make a book,
and a high school computer science teacher,
with AI getting in the way.
So what if…
we use AI code
to hold back AI answers, and AI art.
we use AI code
to hold back AI answers‸& art
Here's the story
student
<section class="unit" data-unit="loops">
<h2 id="while-loops">While loops</h2>
<p>A loop repeats until its condition is false.</p>
<figure class="island" data-check="q-3-2">
<pre><code>int n = 0;
while (n < 3) {
n++;
}</code></pre>
<fieldset data-answer>
<legend>What is n after the loop?</legend>
<label><input type="radio" name="a"> 2</label>
<label><input type="radio" name="a"> 3</label>
</fieldset>
</figure>
<aside class="tip" data-tip>
Trace it by hand first.
</aside>
</section>
<section class="unit" data-unit="loops">
<h2 id="while-loops">While loops</h2>
<p>A loop repeats until its condition is false.</p>
<figure class="island" data-check="q-3-2">
<pre><code>int n = 0;
while (n < 3) {
n++;
}</code></pre>
<fieldset data-answer>
<legend>What is n after the loop?</legend>
<label><input type="radio" name="a"> 2</label>
<label><input type="radio" name="a"> 3</label>
</fieldset>
</figure>
<aside class="tip" data-tip>
Trace it by hand first.
</aside>
</section>
coding agent
teacher
Avery Chentakes Thursday's quiz
Q1 · What does this print?
int n = 0;
while (n < 3) n++;
System.out.println(n);
✓ traces the loop
✓ right output
· says why
2/3
3/3
Nice trace. Show the last pass.
class · what to review
2.1
2.2
2.3
make-up · meet by Friday
TypeError: cannot read
properties of null
at quiz.js:42
- if (n =< 3)
+ if (n <= 3)
200 OK
Stuck on #3. Why is it 3, not 2?
Count the passes: n is 0, then 1, then 2…
Re: #3
Count the passes…
Monster.java
public class Monster {
private String name;
2/3
draft
2 3/3
Your constructor is clean. Keep it.
or drag the card
A draft score is only a draft. Nothing is a grade until the teacher saves it.
student: Avery Chen takes Thursday's quiz.
coding agent: raven pre-grades it from the rubric.
teacher: Avery Chen saves the score, adds feedback.
coding agent: raven notes what the class should review next.
student: Avery Chen make-up quiz?.
student: Bo Park reports a broken page.
coding agent: lambda checks for the mistake.
student: Bo Park the page works again.
student: Jules Ortiz asks for help on homework.
teacher: Jules Ortiz writes back with a hint.
student: Jules Ortiz reads the reply.
student: Mina Ruiz hands in Project 1.
coding agent: juniper drafts a score: 2 of 3.
teacher: Mina Ruiz disagrees: 3 of 3.
student: Mina Ruiz reads the comment.
Privacy and security
What we keep, who can read it, and what stops everyone else.
What we keep
Reading signed out leaves nothing about you in our database. A page view adds one to a counter, with no cookie and no IP address, and your progress stays in your own browser. Signing in is when we start keeping things, and this is all of it.
What
What it holds
Why
Your account
Email, display name and picture from Google, Discord or GitHub; a code name; your school. Never a password.
So your work follows you, and reaches your teacher.
Coursework
Your answers (what you chose, whether it was right, attempts, when), code you hand in and the feedback on it, work in progress, help requests.
It is the course.
How you worked
Seconds a unit was on screen, how often you left a quiz's page, the share of a code answer that was pasted. Never what you pasted or where you went.
A reason for a teacher to ask, never evidence.
Live lessons
Your answers in a class meeting, and check-ins: a 1–10 slider or a short answer.
Points, and a teacher who notices.
Your novel
Your Story Circle document, and each chapter as it stood at the end of each day you saved it.
So you can show how your book grew.
When things break
Feedback you send, and a page error with your browser and that it was you. Never what you had typed.
To fix it.
Security log
When you signed in or out, or redeemed a key. A wrong key's IP address, for two hours.
To notice a break-in, and stop guessing.
Never kept: a password, your birth year, a cookie or an IP address with a page view. Nothing is sold, and there are no ads. The full list, in plain words: the terms.
Who can see it
The database hands each person the rows they are entitled to and nothing else. A page never gets the chance to show you someone else's work, because it never receives it.
Who
Sees
Never
Classmates
Nothing of yours. A check-in shows the room a spread of answers with no names on them.
Your answers, your marks, your name beside a check-in.
Your teacher
Their own class: your name, email and code name, answers, hand-ins, work in progress, time on task, meetings, and check-ins with your name.
Another teacher's class. Your novel.
Your school's overseer
Every class at your school, read only, check-ins and the feedback you sent included. Your account page says who it is.
A change to anything in a class. Your novel.
A parent you invite
Your classes, the units you've worked through, how your answers are going, work in progress, help requests. You can remove them.
An answer or a post as you.
Dan, the administrator
Accounts and the security log across courses, to fix what breaks.
Your novel, from any page or sign-in.
Claude, the AI that helps run the site
Code names instead of names wherever a job doesn't need one. For a suggested mark: the question, the rubric and the work.
Your name or email in a suggested mark.
One gap, said plainly. Whoever owns a database can switch its rules off. The owner's login is still kept where our coding agents run, so the promise about your novel waits on one step: moving the agents to their own login, which is refused a writer's words. It is built; Verifying and protecting human writing has the rest.
Code names and AI
Claude, an AI made by Anthropic, helps in two ways. When a teacher asks for a suggested mark, it reads the question, the rubric and the work, and drafts a score and a comment. The teacher changes what they disagree with. Nothing is a grade until the teacher saves it.
And Dan works with Claude to build the courses, fix what breaks and prepare his classes. That work reads what is stored here when a job needs it: feedback, page errors, check-ins, how a class is getting on.
So every account is dealt a code name at sign-up, one word such as raven. Wherever a job doesn't need your name, the tools print the code name instead. You can change it, but never to anything with your name in it.
Both Claude accounts that do this work have Anthropic's Help improve Claude setting turned off, which tells Anthropic not to train on those conversations.
# every account, at sign-up
code_name = deal(word_list) # or one they picknever blank, never a word of their name
# every tool the coding agent reads
feedback, check-ins, lesson prep:
show code_name, never name or email
suggested_mark(work):
the question, the rubric, the work
never the account's name or email
# a GitHub link in the work can
# still carry a usernamenothing is a grade until the teacher saves it
# the teacher's desk
roster: name, email, code_name
# direct SQL could still read a name;
# the tools never print one
How it's protected
Every table has row-level security. The database itself decides who may read each row, rather than the website asking nicely. The key this site gives your browser is public by design, and it reaches only your rows and the ones your teacher is entitled to.
Sign-in is Google, Discord or GitHub. We never see a password.
Nothing is saved for an account until it has answered the age question. Every way a student writes checks first, and our tools flag a new one that doesn't.
A writer's chapters change only from the writer's own sign-in.
A wrong enrollment key is counted against its IP address for two hours, so nobody can sit and guess.
No third-party analytics or advertising, and the fonts are served from this site.
If your data is ever read by someone who shouldn't have seen it, we tell you, by email, no later than 30 days after we find out, and your teacher and school hear from us too.
No system is perfect, so don't type anything here that would harm you if it were seen.
# every table
row_level_security: on
the key in your browser: your rows only
# every write to a student's datarequire age_ok()
# every save to a writer's chapterallow only the writer, signed in
# if your data is exposed
tell you: by email, within 30 days
tell your school: if you're in a class
Other companies
This is a static site, so most of what happens is between your browser and these services directly. Each has its own privacy policy.
Company
For
What it gets
Supabase
The database, and sign-in
Everything under What we keep.
Netlify
Hosting
Standard server logs, which include IP addresses.
Anthropic
Suggested marks, and help running the site
What Code names and AI describes. Training is off on both accounts.
Google, Discord or GitHub
Sign-in, only the one you choose
Your sign-in. Discord's list of your servers is read once: we look for two and keep nothing else.
Stripe
Payment, only if you buy a course
Your card, which we never see.
YouTube, Vimeo, Loom
Video, only when you press play
A YouTube thumbnail loads with the page.
Not used: third-party analytics, advertising of any kind, or fonts from anyone else's servers.
Keeping and deleting
Coursework is kept while the course runs, so grades survive a term. There is no automatic deletion schedule yet.
Your copy, any time. The Your data card on your account page downloads everything we keep on you as one file, without asking anyone.
Your erasure, on request. Ask through the form on the terms page. Your files go first, then your account and every row that names you, and then we count again, table by table, to prove nothing is left.
A school record may stay. If the work is part of a grade at your school, your school may need to keep it, and we'll explain what can go and what can't.
One line survives. The security log keeps that something happened and when, with your name taken off it.
Under 13
COPPA is the US law that protects children under 13 online. Accounts here are for students 13 and over, and this is how that holds.
The first time you sign in, we ask the year you were born, without saying where the line is. We keep only whether you're old enough, never the year.
Nothing is saved for a new account until it has answered.
An answer under 13 deletes the account at once, with everything Google, Discord or GitHub sent at sign-in. That is what the FTC's rule requires of a site that learns a visitor is a child, without a parent's consent.
The browser remembers, so a second account signed in there is deleted the same way rather than asked again.
Staff can ask a student again. They can never answer for one.
Student accounts made before the question existed were checked by hand against school records in October 2026.
# a new account
saves: no until it answers
ask: birth year # never names the line
keep: 13 or over? # never the year# under 13
erase the account and all it holds, now
this browser: erase the next one too
# staff
may ask again, never answer
Verifying and protecting human writing
AI agents
SQL as owner
service key
magic link
the writer, signed in
sample
Record of authorship
Oct 3812 words41 saves
Oct 41,140 words63 saves
Oct 61,930 words88 saves
Oct 72,410 words52 saves
Oct 93,050 words97 saves
Oct 103,688 words74 saves
only the writer's sign-in
Chapter 3
Pepper's Gulch needed a hero. Papers flapped, their rustling lost in the dusty wind.
The Writer's own editor. Click in and type: nothing leaves this page.
SELECT chapterINSERT historybackdate a draftread page 3edit the recordUPDATE chapterdownload the bookUPDATE record+ words+ words+ words+ words+ words+ words
Agents ask to read or change the story. The database refuses.
Agents ask to read or change the story. The database refuses.
Only the writer's own sign-in adds words.
Each day's draft is kept. None can be backdated.
Anyone can check how the book grew.
How it holds
The database checks every save. A trigger on the table that holds every chapter runs before a save lands, and lets it through only from the chapter's owner, signed in with Google, Discord or GitHub. A session's token records how it signed in, and nothing adds to that later, so an agent's session (a magic link, a key, plain SQL with no sign-in at all) is told apart and refused. Reading a chapter asks the same question.
The save writes the trail. Once a save passes, a second trigger keeps the chapter as it stood at that day's last save, with how many saves there were and the minutes from the first to the last. Nothing else may write that history, the database owner's own SQL included, so no draft can be backdated.
Anyone can check the record. A writer can publish a summary of the history: each chapter's words, saves and minutes, day by day, never a word of the text. The database works the summary out again from the history and refuses one that differs. Anyone with its link can read it.
Where we're going. Whoever owns a database can switch its rules off; that is how Postgres works. So the owner's login is the one that matters, and today it is kept where our coding agents run, as are two admin keys that can reach a writer's book. A login made for the agents, refused every column that holds a writer's words, is built and tested. Moving the agents onto it and retiring those two keys is the step left.
# every save to a writer's chapterallow only if
session.user == chapter.owner
and session.signed_in_with == oauth
else refuse"only the writer's own sign-in may change their words"# refused: SQL as database owner, the
# service key, a magic-link session# every read of a writer's chaptershow only if the same two hold
# a magic-link session sees nothing,
# the service key has no grantafter each allowed save:
history[chapter][today] = words
any other write to history: refuse
record = summary(history) # no wordsstore it only if record == summary(history)
# the database owner can still switch
# this off: see where we're going
Every course, in detail
Four courses: what each one is, who it's for, how it's graded and how you get in.
Writers with a book underway
Novelist
What I actually believe about writing fiction — stated plainly enough to argue with.
What's in it
10 lessons on craftWith 45 quick checks. The Study lesson is free to read, signed out.
Graded
Never.Its units are convictions, and a conviction is not a competency. Progress is the units you read and the quick checks you answer, never a score.
How it runs
On your own, at your own pace.
Tools
The Planner and the WriterA story circle for your plot, and an editor where only you can change your chapters.
The way in
A key, membership in the Literary Cleveland writers’ Discord, or buying it.The price is under Take a course.
In one of our classes? Your class link opens it for free.
Oh, let's not forget…
lambda 3/5
redfern 2/5
you 5/5
orbit 4/5
Classmates can't see your work
The database hands each person their own rows, on every table. A teacher gets their own class.
How it holds
# every table
row_level_security: on
select * from responses
# the database adds:where student = you
your teacher: their own class
signed out: nothing
1,204views of a page today
cookies set: 0
We count pages, not people
A page view adds one to a number. No cookie, no IP address, nothing that says whose.
How it holds
# a page view
counts[today][page] += 1
counts[today][referring site] += 1
counts[today][phone | tablet | desktop] += 1
never stored: a cookie, an IP address,
an account, a visitor id
COPPAunder 13 · never kept✓
COPPA compliant
The US law protecting children under 13 online. Accounts here are 13 and over: we ask a birth year before saving anything, keep only the yes or no, and erase an account at once if the answer is under 13.
How it holds
# a new account
saves: no until it answers
ask: birth year # never names the line
keep: 13 or over? # never the year# under 13 (FTC COPPA FAQ H.6)
erase the account and all it holds, now
this browser: erase the next one too
# accounts here before the question
checked against school records, Oct 2026
# every write a student makesrequire age_ok()
answers
hand-ins
drafts
check-ins
feedback
my-data.json
Everything we keep on you, in one click
A button on your account page downloads all of it as one file.
How it holds
my_data():
for table in every table that holds you:
rows where it names you
+ a list of the files you uploaded
-> one file, now
# the same list drives the deletion
answers 412 → 0
hand-ins 18 → 0
check-ins 31 → 0
0 rows left
Gone means gone, with a receipt
Ask, and we erase you table by table, then count again to prove it.
How it holds
# on your request
before = count(you, every table)
delete your files, then your rows,
then your account
receipt: each table, erased or anonymizedprove: count(you, every table) == 0
MRPrincipal, your school
reads · never edits
Principals can rest easy
A school's Principal can read every class there, check-ins included, and change nothing in them. Students see who it is on their account page.
How it holds
principal = named for one school
sees: that school's students only
in a class: look, never mark or edit
marks: only a course you took on your own
you: their name and face on your account page
Your teacher is presenting. Your name shows on their screen as connected — nothing about what you're doing. Answer a check-in and they see that with your name too. What's stored