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
In the classroom
What a student meets in class, and what reaches the teacher.
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>
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.
A harder one, or a second try
A student who is ahead is offered a harder question. One who is behind earns lost points back by practicing, or retakes a quiz. Nothing rides on a No.
level 1 · topic 0.2, Number Systems
What is 00011010 in decimal?
26
13
58
11010
right on the first try
What is 00011010 in decimal?
26
13
58
11010
an offer beside it
What is 00011010 in decimal?
26
13
58
11010
level 2 · the same topic
Which of these bytes is the decimal number 100?
01100100
00110010
10000100
01010101
not now
What is 00011010 in decimal?
26
13
58
11010
The card goes, and nothing rides on it.
When
A right answer on the first try, at level 1 or 2.The offer appears beside the question. With effects off, the same card waits in the corner pill.
What
A question one level up, on the same topic.Never a quiz, a hand-in, one already answered, or one a class has assigned. In Computer Science in Java, 564 of 565 level 1 and 2 questions have one waiting.
How often
Once a day per course, whatever the answer.Yes opens the question where it is asked, on its own page or its unit’s. Not now just puts the card away.
a question lost on Tuesday’s meeting
Tuesday’s meeting0 / 1
0.2.A Convert values between decimal, binary and hexadecimal.
evidence 0 · earned back 0
practice on 0.2.A
Tuesday’s meeting0 / 1
0.2.A Convert values between decimal, binary and hexadecimal.
✗
evidence −1 · earned back 0
practice on 0.2.A
Tuesday’s meeting0 / 1
0.2.A Convert values between decimal, binary and hexadecimal.
✗
✓
evidence 0 · earned back 0
practice on 0.2.A
Tuesday’s meeting0.5 / 1
0.2.A Convert values between decimal, binary and hexadecimal.
✗
✓
✓
evidence +1 · earned back 0.5
added
Tuesday’s meeting0.5 / 1
+0.5 earned back by practice
not now
Tuesday’s meeting0 / 1
Nothing is written, and the points keep. The Scores page offers them on every visit.
Earned by
Practice on the lost question’s learning objective.Since the lost answer, a right first try counts +1 and anything else −1, so a miss digs the hole deeper first.
Worth
Half the lost point for one right; all of it for two.Practice is any question no class of the student’s has assigned.
Applied
Only when the student says Yes.Then the teacher gets a note naming each column to copy again into the school’s gradebook.
Never
Over a teacher’s own score.And a later right answer to the lost question itself still counts in full.
the teacher hands the quiz back
Quiz · Fog
6 / 10
under 70% · retake
Total
6 / 10
60%
the student’s Assignments page
Make-uplocked
Quiz make-up · Fog
Quiz · Fog · 60%
You earned a retake. Meet with your teacher to take it for points.
in the room, the teacher opens it
Make-upopen now
Quiz make-up · Fog
Quiz · Fog · 60%
Your teacher opened it for you.
the gradebook
Quiz · Fog
6 / 10
kept, replaced in the total
Quiz make-up · Fog
9 / 10
Total
9 / 10
90%
Earned by
A quiz under 70%, once the grade comes back.The student’s card stays locked, and says to meet with the teacher.
Taken
In the room, opened for one student.The teacher releases it from that student’s Desk drawer, so a student who missed the quiz takes it the same way.
Points
For one month from the grade; mastery always.The teacher can extend the month for one student.
Counted
In its own column, beside the quiz’s.In the total it replaces the quiz, and the teacher gets a note to replace the grade in the school’s gradebook too.
At the writing desk
How a writer's words stay their own, and how the book leaves polished.
Proof a person wrote it
AI agents
owner's access key
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.
fingerprint
SELECT chapterINSERT historybackdate a draftread page 3edit the recordUPDATE chapterdownload the bookUPDATE record+ words+ words+ words+ words+ words+ words
No AI agent has access to the table of stories.
No AI agent has access to the table of stories.
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.
Each night, two outside clocks sign the day.
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. The plan and the writer's notes are kept the same way, and the record counts them as days of planning, never as words written.
Anyone can check the record. Every book has a record of its history, private until its writer's own sign-in makes it public: each day's words, saves and minutes, the words added and cut, and each paragraph's length, with chapters by number, never a title or a word of the text. Words already there when the history began, or brought in by one save, as an import or a paste is, are marked and never counted as written. It draws the book as growth rings, a ring a day, and as a time-lapse of every paragraph, followed from day to day as it grows, splits or goes, and tallies each week's drafting, revising and planning. The database works it out from the history each time it opens, so no copy can differ. On the Writer's shelf, an Authorship pill opens it, green while it is public, and the book's Options hold the switch.
Two clocks outside the site sign each day. Every night, for every book, a fingerprint (SHA-256) of each chapter's draft, never the words, is listed, and the list is signed by Sigstore, the Linux Foundation's open-source signing project, and by DigiCert. A signature proves the drafts existed by then, and nobody here can sign for an earlier time, the database's owner included. Each day's list also names the fingerprint of the stamped day before it, so an earlier stamp cannot be swapped for another unseen. The record shows each stamp, checks it in the reader's own browser against each clock's own root, shows how to check it with openssl, and hands its writer a stamped day's exact chapters in one folder, to prove any of them existed that day.
One link per reader. A writer can send an agent a book card: a link that opens only what they tick (the logline, the synopsis, the opening chapters, the record), withdrawn whenever they like. With the record comes an image for the query email, the growth rings beside a code that opens the card; with the chapters, each paragraph marked by the days that wrote or changed it, never what changed. The writer's browser makes the link and the database keeps only its fingerprint, so nobody here holds one, and nobody is told whether it was opened.
The Guild's number beside the evidence. The Authors Guild certifies a book as Human Authored on its writer's word: it checks who the author is, never the text, and says it knows no reliable test for one. A writer types their registration number in the book's Details, and the record, every book card and the EPUB's copyright page show it, linked to the Guild's public database. The number is the promise; the record is the evidence.
Where we're going. Whoever owns a database can switch its rules off; that is how Postgres works. A stamped day stays honest regardless, but the rules guarding today's words do not, so the owner's login is the one that matters, and it is no longer kept where our coding agents run. They sign in with a login made for them, refused every column that holds a writer's words. One admin key that can reach a writer's character portraits is still kept there, and retiring it 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) # on every read; no words,
# no copy keptto anyone but the writer: chapters by number, never a title
each night, for every book:
manifest = sha256(each chapter's draft)
sign(sha256(manifest)) by Sigstore, DigiCert
# proves the drafts existed by then;
# nobody here can sign an earlier time# the database owner can still switch
# this off: see where we're going
Polished on the way out
Export a book to Word, PDF or EPUB and it comes out with its typography right. The chapters you wrote stay exactly as you typed them.
a made-up draft · as typed
"Don't touch that," she said. He touched it anyway -- of course he did. The panel hummed... then went dark…
"Give ‘em a minute," she said . "They'll wake. Probably…"
"“Don'’t touch that,"” she said. He touched it anyway -- of course he did. The panel hummed... then went dark…
"“Give ‘em a minute,"” she said . "“They'’ll wake. Probably…"”
“Don’t touch that,” she said. He touched it anyway -- of course he did. The panel hummed... then went dark…
“Give ‘’em a minute,” she said . “They’ll wake. Probably…”
“Don’t touch that,” she said. He touched it anyway -- —of course he did. The panel hummed... then went dark…
“Give ’em a minute,” she said . “They’ll wake. Probably…”
“Don’t touch that,” she said. He touched it anyway—of course he did. The panel hummed...… then went dark…
“Give ’em a minute,” she said . “They’ll wake. Probably…”
“Don’t touch that,” she said. He touched it anyway—of course he did. The panel hummed… then went dark…
“Give ’em a minute,” she said . “They’ll wake. Probably…”
“Don’t touch that,” she said. He touched it anyway—of course he did. The panel hummed… then went dark…
“Give ’em a minute,” she said. “They’ll wake. Probably…”
“Don’t touch that,” she said. He touched it anyway—of course he did. The panel hummed… then went dark…
¶ “Give ’em a minute,” she said. “They’ll wake. Probably…”
“Don’t touch that,” she said. He touched it anyway—of course he did. The panel hummed… then went dark…
“Give ’em a minute,” she said. “They’ll wake. Probably…”
Quotes curled×8
An apostrophe turned: ’em
Hyphens made a dash
Ellipses made alike, the book’s way
A double space closed
A space before a period closed
An extra empty line cut
As typed:
"Don't touch that," she said. He touched it anyway -- of course he did. The panel hummed... then went dark…
"Give ‘em a minute," she said . "They'll wake. Probably…"
As exported:
“Don’t touch that,” she said. He touched it anyway—of course he did. The panel hummed… then went dark…
“Give ’em a minute,” she said. “They’ll wake. Probably…”
For everyone
What every reader is promised, and the courses themselves.
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, only a page counted, and your progress stays in your own browser. Signing in is when we start keeping things:
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
All answer attempts, code you hand in, feedback, drafts, and help requests.
To develop content mastery.
Behavior
Seconds a unit was on screen, how often you left a quiz's page, the share of a code answer that was pasted.
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.
Who can see it
A page never gets the chance to show you someone else's work, because the database never sends 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. Every chapter and note sent to the Exchange.
The rest of 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.
A course you take on your own, with no school on your account, stays between you and Dan. No classmates, no teacher, no school.
Who
Sees
Never
Other readers
Nothing of yours.
Your answers, your progress, your name.
Dan, who marks it
Your progress and hand-ins, to mark them. Accounts and the security log, to fix what breaks. Every chapter and note sent to the Exchange.
The rest of your novel, from any page or sign-in.
A parent you invite
Your courses, the units you've worked through, how your answers are going, work in progress. You can remove them.
An answer or a post as you.
Claude, the AI that helps run the site
Code names instead of names wherever a job doesn't need one.
Your novel.
No AI agent has access to the table of stories. Only the writer's own sign-in reads or changes a chapter, or sends one to a reader by a book card.
An account with a school is different: that school's overseer can still read a course you bought, and the terms say who else at your school can see one you didn't.
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 for the teacher to change or keep.
And Dan works with Claude to build the courses, fix what breaks and prepare his classes.
An AI that only ever sees code names. Every account is dealt one at sign-up, a word such as raven, and the tools print it where a name would go. Claude signs in to the database with a login that cannot read a name or an email address at all, so the rule holds because nothing else is possible, not because a tool remembered it. One admin key that can still read them is kept where Claude works, and retiring it is the step left.
We think every school should build this filter. An AI that helps a teacher has no need to know whose work it is reading.
# 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
# the agents' login
read(name), read(email): refuse# where we're going: retire the one admin
# key still kept where agents run
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.
# 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
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.
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.
Tutoring for the team: the robot's code from the ground up, so you get in the game.
What's in it
8 unitsWith 332 questions.
Graded
Yes. Every point traces to one of 63 learning objectivesunder 25 topics and 12 skills.
How it runs
Independent studyTutoring for the team, outside any class.
The way in
The team’s link, which files you under your school’s independent study.Not sold.
From Unit 1: press A to stop the robot while a loop is busy.
One loop, one question
Your teammate is parked in the lane. Press Drive test, then press A to stop before you hit them.
motor.setPower(0.5);while (motor.getCurrentPosition() < 2000) { // wait for the wheel to get there}motor.setPower(0);if (gamepad1.a) stop(); // the first look at A
Checked the wheel
0
Checked A
0
Brakes
0
Take a course
for writers with a book underway
Novelist
10 lessons on craft, one free to read now
the Planner, a story circle for your plot
the Writer, where only you can change your chapters
One payment, yours for good. No account needed to buy — you can sign in afterwards.
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