<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hannah Hazi</title>
    <description>The latest articles on DEV Community by Hannah Hazi (@raspberrycheesecake).</description>
    <link>https://dev.to/raspberrycheesecake</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F489580%2Ff9cd523c-8b80-4575-817d-2c9fbcb25585.jpg</url>
      <title>DEV Community: Hannah Hazi</title>
      <link>https://dev.to/raspberrycheesecake</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raspberrycheesecake"/>
    <language>en</language>
    <item>
      <title>Drive an app with Google Sheets</title>
      <dc:creator>Hannah Hazi</dc:creator>
      <pubDate>Wed, 10 Aug 2022 13:26:00 +0000</pubDate>
      <link>https://dev.to/anvil/drive-an-app-with-google-sheets-4o2c</link>
      <guid>https://dev.to/anvil/drive-an-app-with-google-sheets-4o2c</guid>
      <description>&lt;p&gt;Build a website full of catalogued books to inspire you to read what's on your shelves.&lt;/p&gt;

&lt;p&gt;Use a Google Sheet to drive your site and deploy it online for others to see.&lt;/p&gt;

&lt;p&gt;Get cover images for each book from &lt;a href="https://openlibrary.org/dev/docs/api/covers"&gt;OpenLibrary&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect to Google Drive
&lt;/h2&gt;

&lt;p&gt;We'll use a Google Sheet full of data from my library to drive an app that showcases a random book. We’ll start from a blank page and build up an app that uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The open-source &lt;a href="https://anvil.works"&gt;Anvil editor&lt;/a&gt; to create our app&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://docs.google.com/spreadsheets/d/1jG4LZw5W87tc_OPLia7RnmR5rs9HpGjm8uRDMPTBzLk/edit?usp=sharing"&gt;Google Sheet&lt;/a&gt; with library book information&lt;/li&gt;
&lt;li&gt;HTTP API queries to the &lt;a href="https://openlibrary.org/dev/docs/api/covers"&gt;OpenLibrary covers database&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And we'll do it all with nothing but Python.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://anvil.works/learn/tutorials/sheets"&gt;Get started!&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Craft A Conference Talk Proposal That Sparks Joy</title>
      <dc:creator>Hannah Hazi</dc:creator>
      <pubDate>Wed, 09 Mar 2022 11:51:56 +0000</pubDate>
      <link>https://dev.to/anvil/craft-a-conference-talk-proposal-that-sparks-joy-2h67</link>
      <guid>https://dev.to/anvil/craft-a-conference-talk-proposal-that-sparks-joy-2h67</guid>
      <description>&lt;h2&gt;
  
  
  Speak on stage for the first time
&lt;/h2&gt;

&lt;p&gt;If you'd like to speak at a tech conference in the coming year, I'm here to encourage you (and hopefully increase your odds of success!). There's an audience out there who can't wait to hear what you have to say. Maybe you have a great idea for a talk about your favourite topic. But how do you get started? What's the path to becoming a software conference speaker? In this post I'll take you through the details of crafting a good talk proposal, to give you the best odds of getting on stage at your favourite conference.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's all in the proposal
&lt;/h2&gt;

&lt;p&gt;To speak at a conference, you generally need to submit a written proposal in advance. This proposal does several jobs - it describes what you'll be speaking about, gives a sense of your personality as a speaker and convinces the organisers to select your talk. It's like a mini sales pitch. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XGmnZkj9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r5cd5xodgbcz63a3ueuk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XGmnZkj9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r5cd5xodgbcz63a3ueuk.png" alt="xkcd space mission hearing comic" width="625" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not every proposal succeeds. Conferences tend to have more applicants to speak than they have speaking slots, so don't worry if you aren't accepted at first. The conference organisers will be sifting through a lot of proposals, looking for a few to select. Let's look at some tips and tricks to making your proposal stand out above the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Give Lightning Talks A Try
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--06WqzSwt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qo8hdsrcdp9es0voofbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--06WqzSwt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qo8hdsrcdp9es0voofbk.png" alt="xkcd conditional risk comic" width="543" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're not yet comfortable with the idea of giving a full conference talk, 5-10 minute &lt;a href="https://www.writethedocs.org/conf/portland/2022/lightning-talks/"&gt;lightning talks&lt;/a&gt; can be a great way to get started &lt;a href="https://dev.to/jessicagarson/how-giving-lightning-talks-helped-me-gain-technical-confidence--2omm"&gt;and gain confidence&lt;/a&gt;. It's also less of a commitment - you can try out different talk topics without worrying too much about keeping the attention of your audience. After all, it's only 5 minutes!&lt;/p&gt;

&lt;p&gt;Another benefit of the lightning talk format is that you can often sign up on the day if you're at a conference and would like to give it a try. You don't have to plan for months in advance, just come prepared with a couple of topics you'd be happy to spend 5 minutes on if you feel ready to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can I talk about?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w8VuBNWK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gwe7fkw5d3upaz8ps44r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w8VuBNWK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gwe7fkw5d3upaz8ps44r.png" alt="xkcd things that seem like they shouldn't work but do comic" width="261" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm going to use examples of successful talk proposals, mostly from PyCon UK, to break down the different kinds of talks out there. I have a soft spot for PyCon UK in particular as it's my local PyCon and the first place I gave a talk to a large audience (&lt;a href="https://www.youtube.com/watch?v=gwou7CTymS0"&gt;in the Assembly Room&lt;/a&gt; my first ever year at a PyCon, eep!). They gave me such a warm welcome, I'd encourage any newbie to give speaking at the conference a try.&lt;/p&gt;

&lt;p&gt;I've heard all of these talks and they were a lot of fun - and quite different from each other!&lt;/p&gt;

&lt;h3&gt;
  
  
  A story about a thing you built, and how that went
&lt;/h3&gt;

&lt;p&gt;What cool hobbyist thing have you built this year? Nerdery about something else you clearly care deeply about - train timetables, dogs, artwork, or whatever floats your boat. If you are passionate about something, it will make your talk sparkle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pretalx.com/pyconuk-2019/talk/HTBP7D/"&gt;Training my dog with Python&lt;/a&gt; - Vince Knight&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=2SsniTHHSTc"&gt;How we built a LCD train announcement board on a RaspberryPi&lt;/a&gt; - Henry Morris, Dale Potter&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A story about a project you worked on, and how that went
&lt;/h3&gt;

&lt;p&gt;What about work projects you are proud of working on? Or did things go horribly wrong - can you tell a story about it?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=OIqz7NMyW4E"&gt;Technical Debt Remediation in a Massive Python Codebase&lt;/a&gt; - Irit Katriel&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://2017.pyconuk.org/sessions/talks/circumnavigating-the-antarctic-with-python-and-django/"&gt;Circumnavigating the Antarctic With Python and Django&lt;/a&gt; - Carles Pina i Estany&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A somewhat controversial opinion about The State of Software In General, told in an entertaining way
&lt;/h3&gt;

&lt;p&gt;Do you have ~controversial~ opinions about anything software-related? (Legacy code is great! Agile sucks! We need to communicate &lt;em&gt;less&lt;/em&gt;, not more! UI design doesn’t matter! The web stack is broken! Python is secretly the worst!)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Insert &lt;a href="https://www.youtube.com/watch?v=6hHQKUeTL1U"&gt;any&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=LWerUUW745E"&gt;of Meredydd's&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=c-I0md_3fbQ&amp;amp;t=61%3A40"&gt;talks&lt;/a&gt; about the web stack here!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A serious talk about a meta-problem in the software community
&lt;/h3&gt;

&lt;p&gt;Do you feel passionately about an issue that impacts the software community - disability? Feminism? Breaking into software as a non-programmer? Attitudes toward different programming languages?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pretalx.com/pyconuk-2019/talk/NUSLBQ/"&gt;Do we have a diversity problem in Python community?&lt;/a&gt; - Cheuk Ting Ho&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pretalx.com/pyconuk-2019/talk/YDBBKR/"&gt;Depression in the Workplace; Let's talk.&lt;/a&gt; - Chloe Parkes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=oAk8aPfnNPI"&gt;ADHDidn't: 7 Things That Wrecked My Productivity During WFH, and How I Dealt With Them&lt;/a&gt; - Eli Holderness&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A workshop where you'll teach people something or help them learn how it works under the hood
&lt;/h3&gt;

&lt;p&gt;What have you learned lately that other people might like to learn from you? Perhaps you’ve gotten familiar with how to use particular tools of the trade (Docker? Git? Documentation writing tips?) &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://alexwlchan.net/a-plumbers-guide-to-git/"&gt;A Plumber's Guide to Git&lt;/a&gt; - Alex WL Chan&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pretalx.com/pyconuk-2019/talk/Z9VU8Z/"&gt;Telling Stories With Python and Ren'Py&lt;/a&gt; - me!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A guide to using a particular method or approach
&lt;/h3&gt;

&lt;p&gt;Especially if it can be hard to understand. Particular ways of working (code walkthroughs, testing, review processes) you’ve found handy or tripped up over. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://2017.pyconuk.org/sessions/talks/the-art-of-testing-in-python/"&gt;The Art of Testing in Python&lt;/a&gt; - Jan Chwiejczak&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://2019.djangocon.eu/talks/docs-or-it-didnt-happen-with-qa/"&gt;Docs or It Didn’t Happen!&lt;/a&gt; - Mikey Ariel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What do you wish you’d known when you were starting out?&lt;/p&gt;

&lt;h2&gt;
  
  
  Structuring your proposal
&lt;/h2&gt;

&lt;p&gt;A good talk proposal generally has three elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Who&lt;/em&gt; is the talk aimed at and &lt;em&gt;how&lt;/em&gt; will it help them&lt;/li&gt;
&lt;li&gt;Why you are going to be good at explaining this thing - your personal experience of this terrible problem, your disc dog hobby, your passion for train timetables ...&lt;/li&gt;
&lt;li&gt;Focus on topic(s) the community is interested in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bonus points for humour!&lt;/p&gt;

&lt;p&gt;Here's an example of a successful proposal. Can you spot the ways it uses the three elements?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This talk will cover a range of topics around a tool I have built to enhance work sessions with my dog. This talk will culminate in describing a Django Rest Framework I have built to keep track of the behaviours ("tricks") that my dog has learnt for the sport of discdog which involves acrobatic catches of frisbees. The tool also generates a particular sequence of these behaviours (a "routine") which ensures our training sessions always serve the purpose of being mentally stimulating. I will start by describing some modern concepts of dog behaviour and present their parallels to higher education pedagogy (my day job is an educator). Following this I will describe the sport of discdog and show some videos and photos of what it entails. (This is the cool part of the talk.) I will then describe the tool that has been built and describe how it assists with our training. This talk should be of interest to people who don't dislike dogs, like cool things and/or want to see how someone who is not a web developer used the Django Rest Framework to improve a part of their life. Depending on how much time I have to work on the tool there's a chance that there will be some machine learning as well (because "machine learning", who knows maybe even some blockchain). That's a joke, there will not be blockchain." - Vince Knight, 'Training My Dog With Python'&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's break it down.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who is this talk aimed at?
&lt;/h3&gt;

&lt;p&gt;It's for people who "want to see how someone who is not a web developer used the Django Rest Framework to improve a part of their life." So it is suitable for beginners who want to learn more about Django. It is also for people who "don't dislike dogs" and have an interest in dog training. &lt;/p&gt;

&lt;h3&gt;
  
  
  How will it help them?
&lt;/h3&gt;

&lt;p&gt;It'll help with their understanding of Django Rest Framework, and of dog training.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is this speaker going to be good at explaining this?
&lt;/h3&gt;

&lt;p&gt;They have lots of practice in this area ("my day job is an educator"), and they also know about the Disc Dog sport from competing with a dog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Topic(s) the community is interested in?
&lt;/h3&gt;

&lt;p&gt;Django Rest Framework is something many people want to know more about, and dog training is an unusual topic that's appealing in a different way. Plus it sounds like there will be cool pictures of dogs: "I will describe the sport of discdog and show some videos and photos of what it entails. (This is the cool part of the talk.)"&lt;/p&gt;

&lt;p&gt;The speaker also uses a bit of humour ("that's a joke, there will not be blockchain") which works well as this is a light-hearted talk.&lt;/p&gt;

&lt;h3&gt;
  
  
  A catchy title
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://mpron.medium.com/how-to-clickbait-a-developer-or-sre-105-catchy-blog-talk-title-ideas-f07f1cf41f06"&gt;A catchy title or theme&lt;/a&gt; can help draw people's attention to your talk. It can signal that you have a sense of humour and don’t take yourself or the talk entirely seriously. You want to show that this talk will be enjoyable for the audience and maybe they will learn something too. Some inspiration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memes (&lt;a href="https://www.youtube.com/watch?v=JKxIiSfWtjI"&gt;"One does not simply put Machine Learning into Production"&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Pop culture references! For instance, &lt;a href="https://pyvideo.org/pycon-uk-2019/dont-cross-the-streams-an-introduction-to-virtual-environments.html"&gt;“Don’t Cross the Streams”&lt;/a&gt; or &lt;a href="https://www.youtube.com/watch?v=WFbvJ0dVlHk"&gt;"War Is Peace, Freedom Is Slavery, Ignorance is Strength, Scrum is Agile"&lt;/a&gt;. This is especially visually appealing if you can add some related pictures to your slides.&lt;/li&gt;
&lt;li&gt;Puns but taken seriously (“The Art of Testing In Python” has lots of great paintings in the slides because &lt;a href="https://www.youtube.com/watch?v=DCxd7tXPJuo"&gt;Jan is an art fan&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're not feeling inspired, keeping it simple works too. &lt;a href="https://www.youtube.com/watch?v=PdSFOzali-s"&gt;"Training My Dog With Python"&lt;/a&gt; is a great talk with a simple descriptive title.&lt;/p&gt;

&lt;h2&gt;
  
  
  It doesn't have to be perfect
&lt;/h2&gt;

&lt;p&gt;Your proposal &lt;em&gt;doesn’t&lt;/em&gt; have to be perfectly phrased and spelt or super well-written - the subject and your evident passion about it is more important!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The unique thing about your proposal is... you. Whatever the topic, you will have encountered it from the particular perspective of your own unique needs, abilities and resources. That encounter, and what you have been able to take away from it, is what will interest us. Anybody can tell us about such-and-such a library or tool; only you can tell us about it from your perspective." - PyCon UK&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your passion should show in the talk proposal - mention your personal experience and motivation, and make sure you sound interested in your topic. A passionate speaker talking about something you hadn't heard of before is far more fun than an unenthusiastic speaker who chose a popular topic to try to appeal to more conference-goers. The talks with enthusiastic speakers are the ones I always remember best.&lt;/p&gt;

&lt;p&gt;Many people worry that they aren't an expert on their particular topic, so don't have enough to say for a conference talk. Or they try to fit everything they know about a topic into an abstract, encyclopaedic talk which ends up sounding rather dry and not very appealing to conference organisers. Speaking on a familiar subject in an interesting way can be more appealing than attempting to sum up the state of the art on something. &lt;/p&gt;

&lt;p&gt;Here's &lt;a href="https://2019.pyconuk.org/call-proposals/proposal-submission-advice/"&gt;a bit more advice from PyCon UK&lt;/a&gt; about the structure of a good proposal.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Dirty Secret
&lt;/h2&gt;

&lt;p&gt;Here it is … whispers … You don’t have to have written a talk yet to propose it!&lt;/p&gt;

&lt;p&gt;In fact some people &lt;em&gt;cough&lt;/em&gt; are still polishing and improving their talk or workshop days before the conference is due to begin. You just need to be able to deliver the talk if your proposal gets accepted. &lt;/p&gt;

&lt;p&gt;It’s obviously a good idea to prepare in advance, but don’t feel you need to be 100% ready before you can submit a proposal. If you’ve already made the cool thing you’d like to talk about, or have previously taught people about the tool you'd like to run a workshop on, you’re already most of the way there!&lt;/p&gt;

&lt;h2&gt;
  
  
  OK, I think I'm ready to try it! Where can I propose a talk?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Taej3j27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/146hc8e3qeame1a8j1z9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Taej3j27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/146hc8e3qeame1a8j1z9.png" alt="xkcd conservation comic" width="696" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In some ways, the past year has been great for those of us who love a good software conference. No longer restricted by geography, I've had the chance to listen to fascinating speakers from all around the world, without worrying about jet-lag. Virtual conferences gave me the chance to meet more people, and try out public speaking in some places I never thought I could. &lt;/p&gt;

&lt;p&gt;Browse through &lt;a href="https://confs.tech/python"&gt;upcoming tech conferences&lt;/a&gt; - there might be a great Python conference coming up near you. In particular, we recommend &lt;a href="https://www.python.org/community/workshops/"&gt;the various PyCons&lt;/a&gt; around the world. They are full of lovely, welcoming folks who might just be your next audience. &lt;/p&gt;

</description>
      <category>speaking</category>
      <category>career</category>
      <category>python</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>Hanukkah at Anvil - All Eight Apps, Assemble!</title>
      <dc:creator>Hannah Hazi</dc:creator>
      <pubDate>Thu, 17 Dec 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/raspberrycheesecake/hanukkah-at-anvil-all-eight-apps-assemble-50aj</link>
      <guid>https://dev.to/raspberrycheesecake/hanukkah-at-anvil-all-eight-apps-assemble-50aj</guid>
      <description>&lt;h1&gt;
  
  
  I Have A Little Web App, I Made It Out Of Python…
&lt;/h1&gt;

&lt;p&gt;We promised an app for every night of Hanukkah, and we delivered! Anvil’s tools made it easy for us to develop a &lt;strong&gt;new web app, built with nothing but Python&lt;/strong&gt; for each night.&lt;/p&gt;

&lt;p&gt;Let’s look back on some of my favourites …&lt;/p&gt;

&lt;h2&gt;
  
  
  Something practical:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--irO-b8Aa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/hanukkah/img/how-many-candles/how-many-candles-screenshot-night-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--irO-b8Aa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/hanukkah/img/how-many-candles/how-many-candles-screenshot-night-1.png" alt="" width="880" height="921"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How Many Candles?
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://dev.to/hanukkah/how-many-candles"&gt;Daily emoji to remind you when to light the candles. Handy!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Something completely silly:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EbEKFsKH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/hanukkah/img/jumpers/jumpers.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EbEKFsKH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/hanukkah/img/jumpers/jumpers.png" alt="" width="880" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Ugly Hanukkah Sweaters
&lt;/h4&gt;

&lt;p&gt;Time to dress up? Our &lt;a href="https://anvil.works/hanukkah/jumpers"&gt;beautifully ugly jumper designs&lt;/a&gt; provide inspiration...&lt;/p&gt;

&lt;h2&gt;
  
  
  Somewhere in between:
&lt;/h2&gt;

&lt;p&gt;(Depending on how seriously you take your latkes)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FgR6UWB9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/hanukkah/img/latkes/survey-page.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FgR6UWB9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/hanukkah/img/latkes/survey-page.png" alt="" width="880" height="1171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Latke Wars
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://anvil.works/hanukkah/latke-survey"&gt;The wisdom of the crowd&lt;/a&gt; will tell us what the empirically *best* latke topping is.&lt;/p&gt;

&lt;h2&gt;
  
  
  And of course, the icing on the jelly donut:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k23o0ZcI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/hanukkah/img/electric-menorah/action-shot.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k23o0ZcI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/hanukkah/img/electric-menorah/action-shot.jpg" alt="" width="880" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Electric Menorah A-Go-Go
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://anvil.works/hanukkah/electric-menorah"&gt;Light up your life with the power of Raspberry Pi!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We had a lot of fun putting together these apps, and we hope you’ve enjoyed following along! If you missed a night, there’s still time to take a look at our finished creations.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://anvil.works/hanukkah"&gt;Check out all the finished apps here!&lt;/a&gt;
&lt;/h4&gt;

</description>
    </item>
    <item>
      <title>Celebrating Hanukkah at Anvil</title>
      <dc:creator>Hannah Hazi</dc:creator>
      <pubDate>Mon, 14 Dec 2020 17:32:01 +0000</pubDate>
      <link>https://dev.to/anvil/celebrating-hanukkah-at-anvil-35c2</link>
      <guid>https://dev.to/anvil/celebrating-hanukkah-at-anvil-35c2</guid>
      <description>&lt;h1&gt;
  
  
  A Python Web App For Every Night of Hanukkah
&lt;/h1&gt;

&lt;p&gt;We've been lighting our menorah and getting excited for donuts and latkes! People around the world are celebrating Hanukkah with food, gifts and fun.&lt;/p&gt;

&lt;p&gt;Not to be outdone by those parents who give a new gift &lt;em&gt;every single night&lt;/em&gt; of Hanukkah, Anvil has prepared some special treats for you! Each night you can look forward to a &lt;strong&gt;new web app, built with nothing but Python!&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How Many Candles?
&lt;/h4&gt;

&lt;p&gt;One app I enjoyed making is a handy guide to getting lit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BuuwIzCR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l53zui4njbgl9f862re8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BuuwIzCR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l53zui4njbgl9f862re8.png" alt="How many candles?" width="880" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://anvil.works/hanukkah/how-many-candles"&gt;How Many Candles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Daily emoji to remind you when to light the candles!&lt;/p&gt;

&lt;h4&gt;
  
  
  Check out the rest of our Hanukkah event:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://anvil.works/hanukkah"&gt;Open the Hanukkah Countdown&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>chanukka</category>
      <category>hanukkah</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Our Start-Up is 25% Pregnant 🎊 So Naturally I Made an Emoji-Powered Python Web App</title>
      <dc:creator>Hannah Hazi</dc:creator>
      <pubDate>Fri, 13 Nov 2020 14:27:41 +0000</pubDate>
      <link>https://dev.to/raspberrycheesecake/our-start-up-is-25-pregnant-3m56</link>
      <guid>https://dev.to/raspberrycheesecake/our-start-up-is-25-pregnant-3m56</guid>
      <description>&lt;p&gt;Anvil is expanding. Well, I’ve gained a &lt;a href="https://anvil.works/forum/t/hello-im-anvils-new-developer-advocate/6610"&gt;lot&lt;/a&gt; of &lt;a href="https://anvil.works/forum/t/so-its-official/6679"&gt;new&lt;/a&gt; &lt;a href="https://anvil.works/forum/t/yet-another-developer-advocate/6733"&gt;colleagues&lt;/a&gt; lately, but that's not what I mean! Bridget and I are both pregnant, and our newest teammate Stu is expecting a baby too – with all three babies due in the new year 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2-Sycmnj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/blog/img/fruitmoji/fruitmoji-mobile-format-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2-Sycmnj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/blog/img/fruitmoji/fruitmoji-mobile-format-screenshot.png" alt="" width="720" height="1512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Naturally, this has meant a lot of nerdy tracking of how the pregnancies are going. For some reason, baby sites seem obsessed with the idea of &lt;a href="https://www.babycenter.com/pregnancy/your-body/how-big-is-my-baby-week-by-week-fruit-and-veggie-comparisons_5223185"&gt;comparing the size of your baby to fruit and veg&lt;/a&gt;. So I decided to make my own fruit-based pregnancy app - with a twist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://howpregnantami.com"&gt;Try out my app!&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  We love Emoji 😂
&lt;/h1&gt;

&lt;p&gt;Emoji are taking over the world! They’re everywhere you look, adding a dash of colour to texts, tweets and chats with friends and colleagues.&lt;/p&gt;

&lt;p&gt;Emoji were initially invented for Japanese email and phone programs. They proved so popular &lt;a href="http://www.unicode.org/reports/tr51/#Introduction"&gt;the Unicode Consortium officially adopted them&lt;/a&gt; back in 2007 and has reserved a set of code points to represent emoji. Since then emoji have increased in number and spread around the world, replacing older ways of conveying emotion in text like &lt;code&gt;:-)&lt;/code&gt;. They’ve become a fun way to express ourselves &lt;a href="https://www.wired.com/story/academic-emoji-conference/"&gt;that can cross language barriers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Even Oxford Dictionaries joined in. They explained:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That’s right – for the first time ever, the Oxford Dictionaries Word of the Year is a pictograph: 😂, officially called the ‘Face with Tears of Joy’ emoji, though you may know it by other names. There were other strong contenders from a range of fields but 😂 was chosen as the ‘word’ that best reflected the ethos, mood, and preoccupations of 2015.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So why not represent pregnancy with emoji too?&lt;/p&gt;

&lt;h2&gt;
  
  
  Python &amp;amp; Emoji 🐍
&lt;/h2&gt;

&lt;p&gt;I built my web app with &lt;a href="https://anvil.works/docs"&gt;Anvil&lt;/a&gt;, which means I could write everything in Python! This made emoji-wrangling particularly easy - Python 3 is &lt;a href="https://docs.python.org/3/howto/unicode.html"&gt;great with Unicode&lt;/a&gt;, and &lt;a href="http://caniemoji.com/"&gt;most web browsers&lt;/a&gt; now support emoji display too. I previewed &lt;a href="https://unicode.org/emoji/charts/full-emoji-list.html"&gt;how they would look&lt;/a&gt; for different browsers using the Unicode site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NOipAE8x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/blog/img/fruitmoji/fruit-emoji-table.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NOipAE8x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/blog/img/fruitmoji/fruit-emoji-table.png" alt="Now it's easy to get your 5 emoji fruit and veg a day!" width="880" height="735"&gt;&lt;/a&gt;&lt;br&gt;
                &lt;p&gt;Now it’s easy to get your 5 emoji fruit and veg a day!&lt;/p&gt;
&lt;br&gt;
             &lt;/p&gt;

&lt;p&gt;And with Anvil, that’s all we need to worry about! This is great news for those of us who like to express ourselves with the power of 😎.&lt;/p&gt;
&lt;h1&gt;
  
  
  Building the app 🏠
&lt;/h1&gt;

&lt;p&gt;Anvil’s online interface made it easy to start building my pregnancy tracker. I wanted a splash of colour so I chose the ‘Hello San Francisco’ theme and replaced the header image with a cute photo of a fruit-stall I found on &lt;a href="https://www.pexels.com/search/fruits%20market/"&gt;pexels.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qf2gUIpa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://anvil.works/blog/img/fruitmoji/What-size-is-bb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qf2gUIpa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://anvil.works/blog/img/fruitmoji/What-size-is-bb.gif" alt="Adding labels to my Form. I chose the font &amp;amp;lsquo;Pacifico&amp;amp;rsquo;." width="880" height="416"&gt;&lt;/a&gt;&lt;br&gt;
                &lt;p&gt;Adding labels to my Form. I chose the font ‘Pacifico’.&lt;/p&gt;
&lt;br&gt;
             &lt;/p&gt;
&lt;h2&gt;
  
  
  Font fun ✍
&lt;/h2&gt;

&lt;p&gt;The best part was &lt;a href="https://unicode.org/emoji/charts/full-emoji-list.html#food_&amp;amp;_drink"&gt;finding appropriate emoji&lt;/a&gt; for each week of pregnancy. There are quite a few fruits and veggies available as emoji but some creative choices had to be made!&lt;/p&gt;

&lt;p&gt;I found it harder to pick emoji for the final weeks and really stretched the definition of “fruit or vegetable”! For example, for 37 weeks I resorted to 🥗, and any time after the due date (40+ weeks) I just display ‘👶’. I’d started to run out of large vegetables 🎃 and most babies will make an appearance before this point.&lt;/p&gt;

&lt;p&gt;To display all the emoji, you’ll need &lt;a href="https://caniemoji.com/"&gt;a fairly recent browser&lt;/a&gt;. I didn’t have any issues on Windows and Mac, but if you’re using Linux you might need to &lt;a href="https://askubuntu.com/questions/1029661/18-04-color-emoji-not-showing-up-at-all-in-chrome-only-partially-in-firefox"&gt;update your system fonts&lt;/a&gt;. Otherwise you’ll see funky-looking black-and-white emoji!&lt;/p&gt;
&lt;h2&gt;
  
  
  Data tables 📑
&lt;/h2&gt;

&lt;p&gt;I decided to use Anvil’s &lt;a href="https://dev.to/docs/data-tables"&gt;built in database&lt;/a&gt; to store the emoji I chose for each week. This was easier than trying to keep track of it all in my code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rRmrfP6n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/blog/img/fruitmoji/fruitmoji-fruit-table.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rRmrfP6n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://anvil.works/blog/img/fruitmoji/fruitmoji-fruit-table.png" alt="The table of emoji aliases vs weeks of pregnancy I made. 1 to 4 weeks have the same emoji, sparkles ✨ because things are so tiny at that point." width="880" height="660"&gt;&lt;/a&gt;&lt;br&gt;
                &lt;p&gt;The table of emoji aliases vs weeks of pregnancy I made. 1 to 4 weeks have the same emoji, sparkles ✨ because things are so tiny at that point.&lt;/p&gt;
&lt;br&gt;
             &lt;/p&gt;

&lt;p&gt;You can store emoji directly in an Anvil Data Table - all Unicode is fully supported. But for convenience I stored &lt;a href="https://www.webfx.com/tools/emoji-cheat-sheet/"&gt;emoji aliases&lt;/a&gt; in my Data Table instead, and made a little &lt;code&gt;dict&lt;/code&gt; to translate between the aliases and emoji to display. This made it easier to play around with which emoji corresponded to which week. And it made it easier to see what I was doing regardless of what browser I was using, as some don’t render all emoji.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EMOJI_LOOKUP = {'sparkles': '✨', 'salt': '\U0001f9c2', 'cherries': '🍒', 'strawberry': '🍓', 'mushroom': '🍄', 'chestnut': '🌰', 'peanuts': '🥜', 'kiwi': ':kiwi:', 'tangerine': '🍊', 'peach': '🍑', 'lemon': '🍋', 'apple': ':apple:', 'avocado': '🥑', 'onion': '\U0001f9c5', 'potato': '🥔', 'mango': '\U0001f96d', 'banana': '🍌', 'carrot': '🥕', 'hot_pepper': '🌶', 'pear': '🍐', 'ear_of_corn': '🌽', 'broccoli': '\U0001f966', 'leafy_green': '\U0001f96c', 'burrito': '🌯', 'eggplant': '🍆', 'grapes': '🍇', 'cucumber': '🥒', 'pineapple': '🍍', 'bread': '🍞', 'sunflower': '🌻', 'bouquet': '💐', 'coconut': '\U0001f965', 'melon': '🍈', 'green_salad': '🥗', 'jack-o-lantern': '🎃', 'watermelon': '🍉', 'baby': '👶'}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I generated &lt;code&gt;EMOJI_LOOKUP&lt;/code&gt; using Python’s &lt;code&gt;emoji.emojize&lt;/code&gt; module. Just &lt;code&gt;pip install emoji&lt;/code&gt; locally to give it a try yourself. Here’s what I did:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import emoji

# exported from table in Anvil with Server function
alias_list = ['sparkles', 'sparkles', 'sparkles', 'sparkles', 'salt', 'cherries', 'strawberry', 'mushroom', 'chestnut', 'peanuts', 'kiwi', 'tangerine', 'peach', 'lemon', 'apple', 'avocado', 'onion', 'potato', 'mango', 'banana', 'carrot', 'hot_pepper', 'pear', 'ear_of_corn', 'broccoli', 'leafy_green', 'burrito', 'eggplant', 'grapes', 'cucumber', 'pineapple', 'bread', 'sunflower', 'bouquet', 'coconut', 'melon', 'green_salad', 'jack-o-lantern', 'watermelon', 'baby', 'baby']

if __name__ == " __main__":

    EMOJI_LOOKUP = {alias: emoji.emojize(":{}:".format(alias)) for alias in alias_list}

    print(EMOJI_LOOKUP)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I only needed to run it once. Then I popped &lt;code&gt;EMOJI_LOOKUP&lt;/code&gt; into my app code. Notice that it doesn’t matter that some code points are represented long-form (like &lt;code&gt;'\U0001f9c2'&lt;/code&gt;) because I didn’t have the full emoji supporting fonts available in my local terminal. The Python interpreter in Anvil knows how to deal with that format, too.&lt;/p&gt;

&lt;h1&gt;
  
  
  Returning users 🤩
&lt;/h1&gt;

&lt;p&gt;Using the &lt;a href="https://anvil.works/docs/users"&gt;User Service&lt;/a&gt; I created a login flow for return users, so they can keep tracking their pregnancy throughout its duration without needing to redo their due date calculation each time they visit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Emails 📧
&lt;/h2&gt;

&lt;p&gt;Users of the app can optionally sign up for weekly update emails. I did this by adding the &lt;a href="https://dev.to/docs/email"&gt;Email Service&lt;/a&gt; and customised it with an unsubscribe option.&lt;/p&gt;

&lt;p&gt;Each day, my app runs a &lt;a href="https://dev.to/docs/background-tasks/scheduled-tasks"&gt;Scheduled Task&lt;/a&gt; to send an email to those users who signed up for emails and have reached their next gestation week that day. Users get dropped from the table and email list after 43 weeks (at which point the baby should hopefully have made an appearance!)&lt;/p&gt;

&lt;h2&gt;
  
  
  Unsubscribing 🔔
&lt;/h2&gt;

&lt;p&gt;For obvious reasons, I wanted to make it as easy as possible for users to unsubscribe from the weekly emails. They shouldn’t need to log in to the app to do it.&lt;/p&gt;

&lt;p&gt;But I had to make sure that people could only unsubscribe themselves, not other users. If I just set up a generic “Unsubscribe” API, it would be too easy for someone to accidentally (or maliciously) remove other people from the mailing list.&lt;/p&gt;

&lt;p&gt;The solution: generate a secret token for each user. If we get a request with the right token, it must be from that user, and we can unsubscribe them immediately. I used &lt;code&gt;token_urlsafe()&lt;/code&gt; from &lt;a href="https://docs.python.org/3/library/secrets.html"&gt;the secrets module&lt;/a&gt; to generate a unique token for each user that is safe to use as part of a URL.&lt;/p&gt;

&lt;p&gt;When the app emails a user, the message contains an unsubscribe url customised with their secret token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"To unsubscribe, click here: {app}/_/api/unsubscribe/{unsub}".format(app=anvil.server.get_app_origin(), unsub=user['unsubscribe_token'])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I set up a &lt;a href="https://dev.to/blog/http-api-endpoints"&gt;custom HTTP API endpoint&lt;/a&gt; to handle clicks on those unsubscription links:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@anvil.server.http_endpoint("/unsubscribe/:id")
def unsubscribe_user(id):
  """
  Enable users to unsubscribe from email updates by clicking this API link.
  Check the id matches the unique unsubscribe token stored in the table against them 
  and if it does, remove that user's email subscription.
  """
  ip = anvil.server.request.remote_address
  user_to_unsubscribe = app_tables.users.search(unsubscribe_token=id)

  for user in user_to_unsubscribe:
    unsub_email = user['email']
    user.update(signed_up_for_emails=False)
    # Redirect user to app after unsubscribing them.
    redirect = anvil.server.HttpResponse(302, f"Unsubscribed user {unsub_email} from IP {ip}, now trying to redirect")
    redirect.headers['Location'] = "{}#unsubscribed".format(anvil.server.get_app_origin())
    return redirect

  return "Could not unsubscribe you - please check link is correct."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The corresponding code in the &lt;code&gt;__init__&lt;/code&gt; of the Form uses &lt;a href="https://anvil.works/docs/client/navigation#using-the-url-hash"&gt;&lt;code&gt;get_url_hash()&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    # If user got here by clicking unsubscribe link in their email
    if get_url_hash() == "unsubscribed":
      alert("You have been unsubscribed from Fruitmoji emails.")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users just click the link that appears in their email, leading them to a popup in the app which confirms they’ve been removed from the mailing list.&lt;/p&gt;

&lt;h1&gt;
  
  
  Learn more 🍓
&lt;/h1&gt;

&lt;p&gt;If you’re interested in discovering more about how the ‘Fruitmoji’ app works, take a look at the clone link below. It might be a helpful template for collecting a mailing list of your users with an unsubscribe mechanism:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://anvil.works/build#clone:2OFAQTEZR3JVKA42%3dDXAXNWONAZUQNBS6W5ASEOVG"&gt; Clone the finished app &lt;em&gt;&lt;br&gt;
                &lt;br&gt;
            &lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Build your own app!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://anvil.works/"&gt;Anvil&lt;/a&gt; is a platform for building full-stack web apps with nothing but Python. No need to wrestle with JS, HTML, CSS, Python, SQL and all their frameworks – just &lt;em&gt;build it all in Python&lt;/em&gt; ❤️&lt;/p&gt;

</description>
      <category>python</category>
      <category>pregnancy</category>
      <category>emoji</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
