phillylate.st

Get the record by email

One email when Philadelphia's records change in a way that matters — new dangerous-building cases, tax balances that moved, and what it adds up to. Free.

Once a week, one email. It carries what actually changed in the city's own records since the last one: new unsafe and imminently dangerous building cases, parcels where the outstanding tax balance moved, and the handful of properties where both are true at once.

What you are signing up to

I keep an email address and nothing else — no tracking pixels, no click logging, no idea which links you opened. Ask for it to be deleted and it is deleted.

<form class="subscribe" id="sub" novalidate> <label for="email">Your email address</label> <div class="subrow"> <input type="email" id="email" name="email" required autocomplete="email" placeholder="you@example.com"> <button type="submit">Send me the weekly record</button> </div> <input type="text" name="website" id="website" tabindex="-1" autocomplete="off" aria-hidden="true" class="hp"> <p class="subnote" id="subnote" role="status"></p> </form>

<script> (function () { var f = document.getElementById('sub'); if (!f) return; var note = document.getElementById('subnote'); f.addEventListener('submit', function (e) { e.preventDefault(); var email = document.getElementById('email').value.trim(); note.textContent = 'Sending…'; fetch('/api/subscribe', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ email: email, source: 'subscribe-page', website: document.getElementById('website').value }) }).then(function (r) { return r.json().then(function (d) { return {ok: r.ok, d: d}; }); }) .then(function (res) { if (!res.ok) { note.textContent = res.d.error || 'That did not work — try again?'; return; } if (res.d.status === 'confirmed') { note.textContent = 'You are already on the list. Nothing more to do.'; } else { note.textContent = 'Check your inbox — there is a link to confirm, and the list only starts after you click it.'; f.reset(); } }) .catch(function () { note.textContent = 'Network trouble. Try again in a moment.'; }); }); })(); </script>

Why confirm

The confirmation step exists so nobody can sign up an address that is not theirs. Until the link is clicked, nothing is sent.