A free classroom newsletter template you send as a link

Copy the template, let an AI fill in this week's news, and share it as a link in your parent app. Parents tap once and read it on their phone, with no file to download.

A free classroom newsletter template can be one small web page instead of a Word file. Copy the example below, change the text, and send parents a link. They tap it in the app, and the newsletter opens in their phone's browser.

Here is a weekly version. Tick the boxes in "Please bring" to see how it behaves on a phone.

Live exampletry it here, then copy the code
Share it as a link
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Room 12 Weekly</title>
<style>
  * { box-sizing: border-box; }
  body { margin: 0; font-family: system-ui, sans-serif; background: #f3f6fb; color: #1f2937; line-height: 1.5; font-size: 16px; }
  .wrap { max-width: 620px; margin: 0 auto; background: #fff; min-height: 100vh; }
  header { background: #2563eb; color: #fff; padding: 22px 20px 18px; display: flex; gap: 14px; align-items: center; }
  header svg { flex: none; }
  header h1 { margin: 0; font-size: 1.45rem; line-height: 1.2; }
  header p { margin: 2px 0 0; opacity: .9; font-size: .95rem; }
  section { padding: 16px 20px 4px; }
  h2 { margin: 0 0 8px; font-size: 1.1rem; color: #1d4ed8; }
  .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  .box { background: #eff6ff; border-radius: 10px; padding: 10px 12px; font-size: .95rem; }
  .box b { display: block; color: #1e3a8a; }
  ul.dates { list-style: none; margin: 0; padding: 0; }
  ul.dates li { display: flex; gap: 12px; padding: 7px 0; border-bottom: 1px solid #e5e7eb; }
  ul.dates .d { flex: none; width: 74px; font-weight: 700; color: #1e3a8a; }
  .pack label { display: flex; gap: 10px; align-items: center; padding: 6px 0; cursor: pointer; }
  .pack input { width: 20px; height: 20px; }
  .pack input:checked + span { text-decoration: line-through; color: #6b7280; }
  .count { font-size: .9rem; color: #4b5563; margin: 4px 0 0; }
  .note { background: #fef9c3; border-radius: 10px; padding: 12px 14px; margin: 4px 0 0; }
  footer { padding: 16px 20px 26px; font-size: .9rem; color: #6b7280; }
  @media (max-width: 420px) { .grid { grid-template-columns: 1fr; } }
</style>
</head>
<body>
<div class="wrap">
  <header>
    <svg width="46" height="46" viewBox="0 0 46 46" aria-hidden="true"><circle cx="23" cy="23" r="22" fill="#fff"/><path d="M12 33l3-9 14-14 6 6-14 14z" fill="#f59e0b"/><path d="M12 33l3-9 6 6z" fill="#fde68a"/><path d="M29 10l6 6 3-3-6-6z" fill="#ef4444"/></svg>
    <div>
      <h1>Room 12 Weekly</h1>
      <p>Week of 5 October · from Ms. Hartley</p>
    </div>
  </header>

  <section>
    <h2>This week</h2>
    <div class="grid">
      <div class="box"><b>Reading</b>Short stories about animals. We practise finding the main idea.</div>
      <div class="box"><b>Math</b>Adding and subtracting within 100. A quick quiz on Friday.</div>
      <div class="box"><b>Science</b>Plants: we start growing beans in cups.</div>
      <div class="box"><b>Art</b>Autumn leaf rubbings. Old clothes are a good idea.</div>
    </div>
  </section>

  <section>
    <h2>Dates to remember</h2>
    <ul class="dates">
      <li><span class="d">Wed 7 Oct</span><span>Library day. Return your book.</span></li>
      <li><span class="d">Fri 9 Oct</span><span>Math quiz. Pajama reading hour in the afternoon.</span></li>
      <li><span class="d">Mon 12 Oct</span><span>No school.</span></li>
    </ul>
  </section>

  <section class="pack">
    <h2>Please bring</h2>
    <label><input type="checkbox"><span>Library book</span></label>
    <label><input type="checkbox"><span>Old shirt for art</span></label>
    <label><input type="checkbox"><span>Reading log, signed</span></label>
    <label><input type="checkbox"><span>Water bottle</span></label>
    <p class="count" id="count">0 of 4 packed</p>
  </section>

  <section>
    <h2>Reading at home</h2>
    <p>Fifteen minutes a night is plenty. Ask: "What was the best part, and why?"</p>
  </section>

  <section>
    <h2>A note from Ms. Hartley</h2>
    <p class="note">Thank you for the quick replies about the field trip forms. Questions are welcome in the class app.</p>
  </section>

  <footer>Room 12 · Maple Grove School (example page)</footer>
</div>

<script>
  const boxes = document.querySelectorAll('.pack input');
  const count = document.getElementById('count');

  function update() {
    const done = [...boxes].filter((b) => b.checked).length;
    count.textContent = done + ' of ' + boxes.length + ' packed';
  }
  boxes.forEach((b) => b.addEventListener('change', update));
</script>
</body>
</html>
A weekly newsletter: highlights, dates, a pack list and a note. Edit the code and the example reruns.

The text is made up, so replace it with your own. Every part is plain HTML and CSS, so an AI can rewrite it for you in one go.

What the page needs

A newsletter that parents read on a phone is short and easy to scan. The example above has five blocks, and each one earns its place:

  • This week: one line per subject.
  • Dates to remember: the date first, then what happens.
  • Please bring: the things a child needs, as a tick list.
  • Reading at home: one small, doable thing.
  • A note from you: two sentences, in your own voice.

Keep the page to one column and a normal reading size. The example uses a 16-pixel base font and a layout that stacks on a narrow screen, so no one has to pinch and zoom.

Make it with AI

You do not need to write HTML. Paste this prompt into ChatGPT, Claude or Gemini, then add your own notes where it says so.

Make a classroom newsletter for parents as ONE HTML file.
Use plain HTML and CSS only. No external images, fonts or scripts.
Design for a phone first: one column, readable text, a
viewport meta tag. Sections: This week (one line per subject),
Dates to remember, Please bring (a checkbox list), Reading at
home, A note from the teacher. Use my notes below. Do not
invent dates, names or events; if something is missing, leave
a clear [placeholder]. Output only the HTML.

My notes:
[paste your week here]

Then check the result before you send it:

  • Dates and days: is every date on the right weekday?
  • Invented details: did the AI add an event you never mentioned?
  • Names and photos: remove full student names and any photo.
  • Images: outside images are blocked in NOS, so a picture linked from another site will show as empty.
  • On a phone: look at the preview at a narrow width. Text should not run off the edge.

If something is off, reply in the same chat with the fix, such as "move the quiz to Friday". You keep the page and change one thing at a time.

Sending the file is where newsletters get lost. A link skips that step.

From AI chat to a link in the parent app, in four steps.
From AI chat to a link in the parent app, in four steps.
  1. Copy the HTML the AI gave you.
  2. Open HTML to link and paste it into a NOS document. The page renders as written and its scripts run.
  3. Choose Create share link and copy the address.
  4. Paste the address into a message or post in your parent app.

Whoever has the link can open the page in a browser, a phone included, without an account. They can read it but cannot edit it.

If your school asks you to keep some details private, leave them out of the page. The link works for anyone who receives it.

What a parent sees: a message with a link, then the newsletter after one tap.
What a parent sees: a message with a link, then the newsletter after one tap.

Google Classroom, email and paper

In Google Classroom, an announcement can include a link: choose Add, then Link, as described in Google's help page. You can post to one or more classes.

Those announcements go to students in the class, so use your parent app or email for parents. Menus can change, so check Google's page for the current steps (as of October 2026).

In email, paste the link into the message body. For paper, a QR code can carry the same address; QR code link covers that.

Weekly or monthly

Pick the rhythm that matches how fast your plans change. A monthly page works well as a calendar. Parents tap a green date and see that day's note.

Live exampletry it here, then copy the code
Share it as a link
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Room 12 October</title>
<style>
  * { box-sizing: border-box; }
  body { margin: 0; font-family: system-ui, sans-serif; background: #f4f7f3; color: #1f2937; line-height: 1.5; font-size: 16px; }
  .wrap { max-width: 620px; margin: 0 auto; background: #fff; min-height: 100vh; padding-bottom: 20px; }
  header { background: #15803d; color: #fff; padding: 20px; }
  header h1 { margin: 0; font-size: 1.45rem; }
  header p { margin: 2px 0 0; opacity: .92; font-size: .95rem; }
  section { padding: 16px 20px 0; }
  h2 { margin: 0 0 8px; font-size: 1.1rem; color: #166534; }
  .cal { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; text-align: center; }
  .cal .dow { font-size: .78rem; color: #6b7280; font-weight: 700; }
  .cal button { font: inherit; font-size: .95rem; border: 0; border-radius: 8px; background: #f3f4f6; color: #374151; height: 40px; cursor: pointer; position: relative; }
  .cal button.empty { background: none; cursor: default; }
  .cal button.event { background: #dcfce7; color: #14532d; font-weight: 700; }
  .cal button.event::after { content: ""; position: absolute; left: 50%; bottom: 5px; width: 5px; height: 5px; margin-left: -2.5px; border-radius: 50%; background: #16a34a; }
  .cal button.sel { outline: 3px solid #15803d; outline-offset: 1px; }
  .detail { margin-top: 10px; background: #f0fdf4; border-radius: 10px; padding: 12px 14px; min-height: 64px; }
  .detail b { color: #14532d; }
  .themes { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  .themes div { background: #f0fdf4; border-radius: 10px; padding: 10px 12px; font-size: .95rem; }
  .themes b { display: block; color: #14532d; }
  @media (max-width: 420px) { .themes { grid-template-columns: 1fr; } }
</style>
</head>
<body>
<div class="wrap">
  <header>
    <h1>Room 12: October</h1>
    <p>Month at a glance · from Ms. Hartley</p>
  </header>

  <section>
    <h2>Tap a green date</h2>
    <div class="cal" id="cal"></div>
    <div class="detail" id="detail">Pick a date with a dot to see what is happening.</div>
  </section>

  <section>
    <h2>What we are learning this month</h2>
    <div class="themes">
      <div><b>Reading</b>Main idea and details in short non-fiction texts.</div>
      <div><b>Math</b>Place value, then adding and subtracting within 100.</div>
      <div><b>Science</b>How plants grow. Bean cups on the windowsill.</div>
      <div><b>Social studies</b>Our neighborhood: maps and helpers.</div>
    </div>
  </section>

  <section>
    <h2>Helpful to know</h2>
    <p>Library day is every Wednesday. The reading log goes home on Mondays and comes back signed on Fridays.</p>
  </section>
</div>

<script>
  // Edit this list: day of month -> what to show
  const events = {
    7:  'Library day. Please return your book.',
    9:  'Math quiz in the morning. Pajama reading hour in the afternoon.',
    12: 'No school.',
    16: 'Picture day. Wear something you feel good in.',
    21: 'Parent-teacher conferences, afternoon. Sign-up is in the class app.',
    23: 'Field trip to the community garden. Closed shoes, please.',
    30: 'Fall party at 2:00. Costumes optional and school-friendly.'
  };
  const firstWeekday = 4;  // 1 October 2026 is a Thursday (Sunday = 0)
  const daysInMonth = 31;

  const cal = document.getElementById('cal');
  const detail = document.getElementById('detail');

  ['S', 'M', 'T', 'W', 'T', 'F', 'S'].forEach((d) => {
    const el = document.createElement('div');
    el.className = 'dow';
    el.textContent = d;
    cal.appendChild(el);
  });
  for (let i = 0; i < firstWeekday; i++) {
    const el = document.createElement('button');
    el.className = 'empty';
    el.disabled = true;
    cal.appendChild(el);
  }
  for (let day = 1; day <= daysInMonth; day++) {
    const b = document.createElement('button');
    b.textContent = day;
    if (events[day]) {
      b.className = 'event';
      b.addEventListener('click', () => {
        cal.querySelectorAll('.sel').forEach((x) => x.classList.remove('sel'));
        b.classList.add('sel');
        detail.innerHTML = '<b>October ' + day + '</b><br>' + events[day];
      });
    }
    cal.appendChild(b);
  }
</script>
</body>
</html>
A monthly calendar page. Tap a date with a dot. Change the events list in the code to match your month.

To update it, edit the events list in the code, and adjust the first weekday and number of days for a new month. An AI can do that too: paste the page and say "change this to November 2026, starting on a Sunday".

An attached file is a copy you send. A link is one address that shows the current page.
An attached file is a copy you send. A link is one address that shows the current page.
Attached file Text pasted in a message NOS share link
What parents do Tap, download, open in another app Read it in the app Tap, read in the browser
Layout and colors Whatever the file holds Plain text only Your page as designed
Fixing a typo Send a new file Send a correction message Edit it, same link

Pasted text is the quickest way to send three lines. The link is better when you want dates, a checklist or a calendar that is easy to scan.

For more on this choice, see email vs link for documents, and opening an HTML file on a phone explains why a bare file often fails there.

Because editing keeps the same link, you can reuse one address all year. Edit the page each Friday and tell parents "same link, new news". The old issue is replaced, so nobody can look back.

If you want an archive, make a separate page for each issue and send its own link. A short post such as "Week 6 is here" with the new link works well. Digital newsletter covers giving every issue its own web address.

You, the owner, can tick items in View mode and your changes are saved. A parent's ticks are not saved, so they reset on reload. Treat the pack list as a reminder to look at, not a form that comes back to you.

When it does not work

What you see Cause Fix
A picture is missing The image is linked from another site, and outside images are blocked Use a drawing made in HTML or CSS, or leave the image out
Parents see last week's issue You made a new page for the new issue, so the old link still shows the old one Edit the original page to keep one link, or send the new link
A sign-up form sends nothing Sending form data to a server is blocked Ask parents to reply in your parent app or by email
Text runs off the edge on a phone The AI used fixed widths Ask it for one column and a viewport meta tag
The AI added an event you did not mention It filled gaps from guesswork Add "do not invent dates or events" and check every date
Parents' ticks disappear Only the owner's changes in View mode are saved Use the list as a reminder, not a form

Questions people ask

Can I use this classroom newsletter template for free?

The two example pages above are plain HTML. Copy the code, change the text and use it for your own class. Nothing in them depends on a subscription, an outside image or an outside script.

Can parents reply or sign up from the newsletter?

Not from the page itself. A form inside the page works on screen, but sending its answers to a server is blocked. Ask parents to reply in your parent app or by email, and use the newsletter for reading.

Weekly or monthly, which should I send?

Weekly suits a class with changing plans, such as quizzes, library days and things to bring. Monthly suits steady routines and a calendar. You can also send both: a short weekly page and one monthly calendar page.

Can I put student photos or names in it?

Anyone who has the link can open the page, so check your school's rules first. Leaving out full names and photos is the safe default. Photos linked from other websites will not show in NOS anyway.

If I fix a typo, do parents need a new link?

No. Editing the code keeps the same link, and it shows the new version the next time someone opens it. Parents who already have the link do not need a new message.

Keep reading