<?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: Imre Gera</title>
    <description>The latest articles on DEV Community by Imre Gera (@hanziness).</description>
    <link>https://dev.to/hanziness</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%2F557919%2Fca5a15f9-dc88-462e-b420-eca891b4b7f8.jpeg</url>
      <title>DEV Community: Imre Gera</title>
      <link>https://dev.to/hanziness</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hanziness"/>
    <language>en</language>
    <item>
      <title>Updating the design of a productivity timer app</title>
      <dc:creator>Imre Gera</dc:creator>
      <pubDate>Tue, 03 Jan 2023 17:00:00 +0000</pubDate>
      <link>https://dev.to/hanziness/updating-the-design-of-a-productivity-timer-app-2j8c</link>
      <guid>https://dev.to/hanziness/updating-the-design-of-a-productivity-timer-app-2j8c</guid>
      <description>&lt;p&gt;With a new name and design comes version 1.4 of &lt;a href="https://focustide.app?utm_source=dev.to&amp;amp;utm_medium=blog&amp;amp;utm_content=article1.4top1"&gt;&lt;strong&gt;FocusTide&lt;/strong&gt;&lt;/a&gt; (formerly AnotherPomodoro). In this post I'll take a look at how I tried to make the app's design more compact.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://focustide.app?utm_source=dev.to&amp;amp;utm_medium=blog&amp;amp;utm_content=article1.4top"&gt;FocusTide&lt;/a&gt; is a modern and flexible Pomodoro timer application I've been working on for some time now. It has timers that keep ticking after reaching the limit (people don't usually do something in &lt;em&gt;exactly&lt;/em&gt; 25 minutes, this keeps track of that), a to-do list for each section, multiple timer styles, lots of settings and overall a design that tries to go out of the user's way. &lt;/p&gt;

&lt;p&gt;I've been wanting to get rid of the clunky design of the top schedule view, the big control bar and the weird placement of the to-do list's button -- all of which were especially troublesome on mobile, -- but had no idea how. They all worked okay-ish on the desktop (as there's plenty of screen space there) but each of these components had their own share of design problems.&lt;/p&gt;

&lt;p&gt;But before I get to the problems, here are some of the big changes coming in version 1.4, in a compact form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AnotherPomodoro is now FocusTide.&lt;/strong&gt; This rebranding is to avoid potential &lt;a href="https://francescocirillo.com/pages/pomodoro-trademark-guidelines" rel="noopener noreferrer"&gt;trademark-related&lt;/a&gt; clashes with the pomodoro word, which cannot be so freely used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is no separate home page now, just the timer view&lt;/strong&gt;, accessible in the place of the home page (simply at &lt;a href="https://focustide.app" rel="noopener noreferrer"&gt;https://focustide.app&lt;/a&gt;). If you had the &lt;code&gt;/timer&lt;/code&gt; page previously bookmarked, don't worry, it will still work (and redirect to &lt;code&gt;/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The user interface got a big overhaul.&lt;/strong&gt; New font, a more consistent and rounded design for all components, a compact top app bar, new timer controls and more harmonized colors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The onboarding view now lets you set some of the settings for first use.&lt;/strong&gt; Previously, it was just a bunch of small "reminders" of what the app can do, but now it is a complete setup process. Much more useful. It also has a progress bar so you know how much is left.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time inputs are now easier to handle.&lt;/strong&gt; The time input fields were reworked, they should be easier to use (no more small buttons to change between minutes and seconds).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, let me tell you how I (believe I have) solved those design problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layout changes
&lt;/h2&gt;

&lt;p&gt;First, as we'll need this later, &lt;strong&gt;the whole layout&lt;/strong&gt;. My big problem with it was &lt;strong&gt;stuff that was scattered across the screen&lt;/strong&gt;: the to-do button was near the bottom right corner (1), the settings button was in the upper right corner, and the schedule view was top center (2). Additionally, &lt;strong&gt;hacks were needed for mobile screens&lt;/strong&gt;: the settings button was merged into the schedule view and the to-do button pushed the control buttons to the left (causing the timer start/pause button to be off-center) at mobile screen breakpoints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fub30z6mlwejixpnc5hv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fub30z6mlwejixpnc5hv3.png" alt="Screenshot highlighting design issues"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This was both difficult to maintain and did not exactly achieve its goals&lt;/strong&gt;: the control buttons were pushed to the side when the user enabled the to-do list, potentially causing missed taps due to muscle memory. The settings button was actually two buttons: one was shown on desktop, another was shown on mobile. The schedule display needed a lot of style changes on different screens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solutions
&lt;/h3&gt;

&lt;p&gt;The schedule view at the top had big rectangles in it that &lt;strong&gt;multiple users identified as clickable buttons&lt;/strong&gt;. They were not supposed to be clickable, instead they were just there to inform the user of what section they are in (work, pause or long pause) and what sections will follow. This was embedded in a grey box and it only looked right on mobile if I stretched it to cover the whole width of the screen. Essentially, the top part became a big panel on mobile devices and covered an unnecessarily large amount of screen space. Since I realized I like rounded designs more, I tried to create something smaller and circular.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ew4g2lzox5r2y02njmg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ew4g2lzox5r2y02njmg.jpg" alt="The old schedule view implementation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To start off, I realized that a more traditional-looking approaching could work and went off to implement an &lt;strong&gt;app bar&lt;/strong&gt;, essentially compacting everything into a 56px high bar. That meant the whole schedule view and the to-do and settings buttons. The buttons were easy, the schedule view was a bit more tricky. Since I wanted to put circles next to each other (and wanted them to seem less clickable), I wrapped them in a fully rounded panel and made them small. Then, since vertical space is small, I put the section's name right of this panel. The end result was a lot more compact bar that still achieved what it was supposed to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtrm2mqmemfa3esuznn0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtrm2mqmemfa3esuznn0.jpg" alt="The new app bar implementation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For some extra flavor, I made the inactive entries smaller through a CSS &lt;code&gt;scale&lt;/code&gt; transform and gave a white ring to the active item. I also reduced the default number of items from 5 to 3 (though this is still customizable).&lt;/p&gt;

&lt;p&gt;Now the top bar does not block the view and it's also a lot smaller. Plus, I moved the to-do button here, too, so it does not shift the position of the control buttons anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Colors
&lt;/h2&gt;

&lt;p&gt;I use TailwindCSS for styling the app. I love that it's allowing me to have creative freedom over how I style my app instead of giving me prebuilt components (which is also great sometimes, especially for prototyping).&lt;/p&gt;

&lt;p&gt;What I realized, though, is that I kept using Tailwind's colors freely, which made it difficult to identify parts of the interface: I used a 800 slate for one background, then later a 700 grey for another. &lt;strong&gt;The app was full of colors that were close to each other, but were still different.&lt;/strong&gt; In the meantime I also used &lt;a href="https://flutter.dev" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt; and &lt;a href="https://m3.material.io" rel="noopener noreferrer"&gt;Material Design 3&lt;/a&gt;, which uses primary, secondary (and sometimes tertiary) and surface colors and their variants (like primary, on primary, primary container, on primary container).&lt;/p&gt;

&lt;p&gt;This use of &lt;strong&gt;abstract colors&lt;/strong&gt; also helps keep the design &lt;strong&gt;consistent&lt;/strong&gt;: a primary button is always of primary color and its contents are "on primary" colored. If I later decide to change the primary color of the app, everything changes with it (and I don't have to manually hunt down the individual uses of certain colors and their shades). Colors also have their dark variants, so I don't have to manually search for contrasting colors for a dark theme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9u2jqnyaw616rqmel02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9u2jqnyaw616rqmel02.png" alt="The settings panel is all red"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make things even easier, I used the &lt;a href="https://m3.material.io/theme-builder" rel="noopener noreferrer"&gt;Material 3 theme builder&lt;/a&gt; to get a harmonic color theme for the app and set them as Tailwind colors, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;colors:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;primary:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;DEFAULT:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#a&lt;/span&gt;&lt;span class="mi"&gt;7373&lt;/span&gt;&lt;span class="err"&gt;a'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;container:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#ffdad&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;oncontainer:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#&lt;/span&gt;&lt;span class="mi"&gt;410007&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;dark:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#ffb&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;b&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;darkon:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#&lt;/span&gt;&lt;span class="mi"&gt;670311&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;darkcontainer:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#&lt;/span&gt;&lt;span class="mi"&gt;871&lt;/span&gt;&lt;span class="err"&gt;f&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;darkoncontainer:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#ffdad&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I removed all uses of specific colors (like &lt;code&gt;bg-red-200&lt;/code&gt;) and instead just used these abstract colors (e.g. &lt;code&gt;dark:bg-primary-dark dark:text-primary-darkon&lt;/code&gt;). This helped me create a user interface where no component feels out of place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The control bar
&lt;/h2&gt;

&lt;p&gt;Another part to renovate at was the control bar. It used negative margins and &lt;code&gt;z-index&lt;/code&gt; and fancy blurred animated rings to operate. It looked cool, but the buttons were close together, &lt;strong&gt;making it easy to tap the wrong button on mobile&lt;/strong&gt;. Also, that spinning blurred ring wasn't a battery-friendly choice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffndk7luhywrcby7ljh4t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffndk7luhywrcby7ljh4t.jpg" alt="The old control bar implementation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I no doubt like Material Design 3, and when I was looking for inspiration for a better design, I came across Google's &lt;em&gt;Clock&lt;/em&gt; app, more precisely its stopwatch page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpva14u9llpk6adbc4gvb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpva14u9llpk6adbc4gvb.png" alt="The control bar of the Google Clock app's stopwatch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It was exactly what I needed&lt;/strong&gt;: the start/pause button in the middle and two secondary buttons to the sides. The main button is bigger and wider (though only while the stopwatch is running) and uses the primary color scheme. The buttons on the side use the secondary color scheme and are circle shaped. This is what I ended up implementing as well, without the resizing effect. Also, the secondary buttons disappear when they cannot be used, just like in the Clock app. And finally, the fancy glowing-rotating outline is gone. It was redundant and did not fit into the overall design of the app. The new design looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc211sny6yg4a8ce3hctu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc211sny6yg4a8ce3hctu.jpg" alt="My implementation of the bottom control bar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick word on fonts
&lt;/h2&gt;

&lt;p&gt;Previously the app used &lt;a href="https://fonts.google.com/specimen/Poppins" rel="noopener noreferrer"&gt;&lt;strong&gt;Poppins&lt;/strong&gt;&lt;/a&gt;, a friendly, rounded sans-serif font that looks a bit similar to Google Sans and became hugely popular. I now have switched over to &lt;a href="https://fonts.google.com/specimen/Lexend" rel="noopener noreferrer"&gt;&lt;strong&gt;Lexend&lt;/strong&gt;&lt;/a&gt;, a font I really like and use as the display font on my KDE desktop, too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The end results
&lt;/h2&gt;

&lt;p&gt;With the above changes, I believe the app looks a lot cleaner than before.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5h86cm1czns1qg106d9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5h86cm1czns1qg106d9.jpg" alt="Before (left) and after (right) of the design changes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What do you think? Feel free to share your thoughts on the changes and tell me what you would change. Check out &lt;a href="https://focustide.app?utm_source=dev.to&amp;amp;utm_medium=blog&amp;amp;utm_content=article1.4bottomname"&gt;&lt;strong&gt;FocusTide&lt;/strong&gt;&lt;/a&gt; at &lt;a href="https://focustide.app?utm_source=dev.to&amp;amp;utm_medium=blog&amp;amp;utm_content=article1.4bottomurl"&gt;https://focustide.app&lt;/a&gt; and see it in action!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vue</category>
      <category>news</category>
      <category>design</category>
    </item>
    <item>
      <title>AnotherPomodoro 1.2: export settings and non-strict timers</title>
      <dc:creator>Imre Gera</dc:creator>
      <pubDate>Wed, 01 Jun 2022 15:06:08 +0000</pubDate>
      <link>https://dev.to/hanziness/anotherpomodoro-12-export-settings-and-non-strict-timers-3l5o</link>
      <guid>https://dev.to/hanziness/anotherpomodoro-12-export-settings-and-non-strict-timers-3l5o</guid>
      <description>&lt;p&gt;Ever tried the pomodoro technique only to realize that you can't work for &lt;em&gt;exactly&lt;/em&gt; 25 minutes? This update tries to solve that.&lt;/p&gt;

&lt;p&gt;I've just released the 1.2 version of &lt;a href="https://another-pomodoro.app/?utm_source=blog&amp;amp;utm_medium=devto&amp;amp;utm_campaign=update1.2&amp;amp;utm_content=article-headline"&gt;&lt;strong&gt;AnotherPomodoro&lt;/strong&gt;&lt;/a&gt;, a modern, customizable and open-source productivity timer. This new release is seemingly small, but it actually implements two bigger new features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continued ticking of timers
&lt;/h2&gt;

&lt;p&gt;One of the ideas was that we don't usually work for exactly 25 minutes: sometimes a task can take more time than what we set for the timer. The same goes for breaks. So AnotherPomodoro's timers now don't stop at the specified time mark but instead keep counting the extra minutes you spent working or watching memes. These timers now display how much extra time you spent on a section, allowing you to better keep your time management in check.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0MykGXE1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bgy7txlwr7n27cbupmaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0MykGXE1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bgy7txlwr7n27cbupmaj.png" alt="Screenshot of a work timer that shows +5 minutes" width="880" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exporting/importing settings and tasks
&lt;/h2&gt;

&lt;p&gt;This feature was implemented &lt;a href="https://github.com/Hanziness/AnotherPomodoro/issues/178"&gt;based on a request&lt;/a&gt;. Since the app does not (yet) have syncing capabilities, saving your settings and tasks to a file can be useful when moving across devices or browsers. The saved file can then be imported in a different instance. It can also be helpful when you want to save different settings and tasks for different moods or environments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X69ewVfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/42ke2qy7hq5iqsh9418t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X69ewVfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/42ke2qy7hq5iqsh9418t.png" alt="The settings menu was expanded with the new export and import buttons" width="880" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: welcome screen
&lt;/h2&gt;

&lt;p&gt;While the app is relatively simplistic, it does have quite a few settings and features and not everyone might be familiar with the pomodoro technique. Because of this, I added a small modal that pops up when launching the app for the first time. It shows a quick few-step-long tutorial on what to do and where to look for stuff.&lt;/p&gt;

&lt;p&gt;To determine whether the app was launched for the first time, it checks if the app's state was restored during launch. If there was no data to restore, the app considers it a first launch.&lt;/p&gt;

&lt;p&gt;The modal was modified for mobile devices to look like a bottom sheet, hopefully providing an experience that feels more at home.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Tuc04OOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z1xtx4ynxscs8vjd2xp9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tuc04OOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z1xtx4ynxscs8vjd2xp9.png" alt="Welcome screen on mobile devices" width="828" height="1792"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest
&lt;/h2&gt;

&lt;p&gt;There were some additional minor changes. See the full (though quite short) changelog &lt;a href="https://github.com/Hanziness/AnotherPomodoro/releases/tag/v1.2.0"&gt;here&lt;/a&gt; or &lt;a href="https://another-pomodoro.app/?utm_source=blog&amp;amp;utm_medium=devto&amp;amp;utm_campaign=update1.2&amp;amp;utm_content=article-bottom"&gt;check out the new features yourself&lt;/a&gt; and if you find something that you'd like to see to improved, don't hesitate to &lt;a href="https://github.com/Hanziness/AnotherPomodoro/issues"&gt;create a new issue&lt;/a&gt; on GitHub.&lt;/p&gt;

&lt;p&gt;Have you tried productivity (or pomodoro) timers before? What are your thoughts of them?&lt;/p&gt;

</description>
      <category>news</category>
      <category>javascript</category>
      <category>pwa</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I reached 1.0: programming bit by bit</title>
      <dc:creator>Imre Gera</dc:creator>
      <pubDate>Fri, 21 Jan 2022 16:46:44 +0000</pubDate>
      <link>https://dev.to/hanziness/releasing-a-pomodoro-app-1-programming-bit-by-bit-4nbg</link>
      <guid>https://dev.to/hanziness/releasing-a-pomodoro-app-1-programming-bit-by-bit-4nbg</guid>
      <description>&lt;p&gt;In this article, I'll share my experience of how I built a productivity timer web application from start to finish, without entirely losing my motivation in the middle of it. I'll share some &lt;strong&gt;strategies and tips&lt;/strong&gt; that have worked for me. Maybe they'll work for you, too.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is part of a series on how I built a new Pomodoro web application, &lt;a href="https://another-pomodoro.app/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch&amp;amp;utm_content=anotherpomodoro1_heading"&gt;AnotherPomodoro&lt;/a&gt;, from start to finish. This article focuses on the development side of the process, but I plan to do a detailed write-up on the release part (buying a domain, managing branching, creating graphics, launching etc.) as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3tNEv9Pe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lq2fn0i7ab8lxn1zjypc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3tNEv9Pe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lq2fn0i7ab8lxn1zjypc.png" alt="Screenshot of AnotherPomodoro running with its default settings" width="880" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Motivation
&lt;/h2&gt;

&lt;p&gt;Probably the most critical question when building an app is &lt;strong&gt;why you are doing it&lt;/strong&gt;. At some point, I realized that I couldn't structure my time well and ended up not being too productive. I thought that a small tool would perhaps help me: something that tells me to keep working for a little longer, possibly keeping track of my tasks as well.&lt;/p&gt;

&lt;p&gt;I ended up searching for Pomodoro timers: the technique is about working 25 minutes and then taking a 5-minute-long break and repeating the cycle, turning every few pauses into longer ones. I tried a lot of these browser-based timers but &lt;strong&gt;none could make me keep using them&lt;/strong&gt;. Among the main reasons were &lt;strong&gt;bloated designs&lt;/strong&gt; (eg. small timer, lots of links and unnecessary stuff on the screen), simple customization &lt;strong&gt;features locked behind paywalls&lt;/strong&gt; or the app just very clearly asking me to pay for it. Such things not only frustrate people but also distract them from the app's main purpose (to stay productive), in my opinion.&lt;/p&gt;

&lt;p&gt;I also thought that making such an app should not be so difficult, &lt;strong&gt;maybe I could create something even better&lt;/strong&gt;. I just had to decide on the platform and tooling, but since I was already looking at web apps and I already had some experience with &lt;a href="https://nuxtjs.org/"&gt;Nuxt&lt;/a&gt; and &lt;a href="https://vuejs.org/"&gt;Vue.js&lt;/a&gt;, I believed that I could leverage them to build my very own take on a great timer application. Time to start building it!&lt;/p&gt;

&lt;h2&gt;
  
  
  🏗️ Building an application little by little
&lt;/h2&gt;

&lt;p&gt;So I started making the app and while coding it, I made a few observations of myself: how I worked, what helped and what didn't help. If there are two essential takeaways from the following paragraphs, they are to &lt;strong&gt;start small&lt;/strong&gt; and &lt;strong&gt;work little by little&lt;/strong&gt;. As cliché as they sound, they allow you to reach the end of the tunnel without giving up or sinking into "feature creep" mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start with a working prototype
&lt;/h3&gt;

&lt;p&gt;This is an advice that strongly applies to game development and many other fields, too. When starting a product, &lt;strong&gt;you should always try to make a minimal, working prototype first&lt;/strong&gt; (like how on StackOverflow it is advisable to provide an MWE or minimal working example). In the case of AnotherPomodoro, that working prototype was the timer page with the following items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A timer/countdown in the middle&lt;/li&gt;
&lt;li&gt;A button that starts and pauses the timer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's it. &lt;strong&gt;No less, no more.&lt;/strong&gt; See, the above list does not contain features that any viable productivity timer should, but &lt;em&gt;that was not the goal, either&lt;/em&gt;! This was something that &lt;strong&gt;I, as a beginner, could implement in a short time&lt;/strong&gt;, too, and once that timer page was there and I could start and stop the countdown, I knew that I was on the right track. I just created a timer, now I only had to extend it, and if that small prototype is not flexible enough anymore, I'll rewrite it, but I won't have to start from scratch again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XHGkaQtO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0bdqiv09pxjcefmkx1sx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XHGkaQtO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0bdqiv09pxjcefmkx1sx.png" alt="Screenshot with a timer and the controls only" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Go for the most critical parts first
&lt;/h3&gt;

&lt;p&gt;Having built a working foundation for the app, it was time to put the word "productivity" into the productivity timer. For me, I had to move on to the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create sessions of three different lengths: 25 minutes for working, then 5 minutes for a short pause, and eventually 15 minutes for a longer pause. The app had to be able to switch between these in a particular order (work -&amp;gt; pause -&amp;gt; work -&amp;gt; ... -&amp;gt; long pause -&amp;gt; work).&lt;/li&gt;
&lt;li&gt;An advance button to skip to the next session&lt;/li&gt;
&lt;li&gt;A display showing the type of session that is currently running (just a string initially, like "work")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;... and then I could start doing all kinds of fancy stuff: a progress bar in the background, coloured boxes for the different session types, a settings panel, fancy animations, whatever I liked. And once the timer page was done and had a minimally viable set of features, I could have a go at the home page and other stuff. &lt;strong&gt;I did the timer page first because that is what users would spend most of their time on&lt;/strong&gt;, anyway.&lt;/p&gt;

&lt;p&gt;It would've been pointless to start with the home page, because, logical it may sound, it's nothing more but a funnel to the timer page. Alternatively, I could have made the timer page the home page, too, as is the case with some apps. But then I would have had to introduce the app there, bloating a page that was meant to help you focus with its cleanness.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CBbDWMfm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ytv7vguwbk8ta29e8foc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CBbDWMfm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ytv7vguwbk8ta29e8foc.png" alt="Screenshot with a progress bar and schedule display" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Managing priorities
&lt;/h3&gt;

&lt;p&gt;It was also important to &lt;strong&gt;realize what is critical&lt;/strong&gt; and what is not. There's no point building the fancy glowing ring animation for the play/pause button if the app still cannot switch between sessions reliably. Usually, it's a good idea to leave refining the visuals (eg. adding animations or making colours consistent) to the end, unless they are a key part of the application.&lt;/p&gt;

&lt;p&gt;This won't be new if you've worked on a project before. If you're keeping your application in a hosted Git repository like GitHub, GitLab or Bitbucket (you better be!), then &lt;strong&gt;you should start making use of issues (with labels) and milestones&lt;/strong&gt; as soon as you can. They help you categorize the features you want to have and avoid &lt;em&gt;feature creeping&lt;/em&gt;, where you keep adding new stuff and thus growing an endless wish list instead of finishing the thing.&lt;/p&gt;

&lt;p&gt;Here's something that maybe I could have done, too: &lt;em&gt;assign 0.1, 0.2 and such milestones to my issues&lt;/em&gt;. It would have helped me "feature freeze" releases so that I don't keep adding all kinds of new wishes to the 1.0 milestone and release 0.x versions ad-hoc. &lt;strong&gt;It will be borderline impossible to create a fixed set of features for 1.0&lt;/strong&gt;, because as you develop the app and time passes, your expectations will change, too. Still, it's a good idea to only add something to the 1.0 milestone (or any milestone) if you are sure you need it. You can also ask your friends or the people of the internet if they would want a feature or not.&lt;/p&gt;

&lt;p&gt;As a bonus point, &lt;strong&gt;the issues you create in your repository can also serve as part of the documentation&lt;/strong&gt;. You can outline new features there and you will even be able to generate changelogs from the merged pull requests (like I do using &lt;a href="https://github.com/conventional-changelog/standard-version"&gt;&lt;code&gt;conventional-changelog/standard-version&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eUpOdik---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gf9d4oqidoqsvbdk0s6t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eUpOdik---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gf9d4oqidoqsvbdk0s6t.png" alt="Change log of the v0.10 release" width="880" height="832"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Face it: it will never be perfect
&lt;/h3&gt;

&lt;p&gt;As with all forms of art, at some point, you'll have to draw the final stroke. In software development, it's not the final one, though, but it's a very important one: &lt;strong&gt;the 1.0 milestone&lt;/strong&gt;. If you keep refining your app for years without ever releasing 1.0, it will remain unfinished and possibly hidden forever. AnotherPomodoro has been in development for more than a year now, which is probably a bit too long compared to that &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I won't be making a lot of money with it (people don't support free projects that much) and&lt;/li&gt;
&lt;li&gt;it likely won't have tens of thousands of monthly users. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Speaking of feature creep&lt;/strong&gt;, in my case, I still think that it would be cool to add &lt;a href="https://github.com/Hanziness/AnotherPomodoro/issues/9"&gt;motivational quotes&lt;/a&gt;, &lt;a href="https://github.com/Hanziness/AnotherPomodoro/issues/7"&gt;a reward system&lt;/a&gt;, personal statistics and more to the app, but if I started working on these before releasing 1.0, it would probably take another year to finish. Also, new ideas and wishes would arise anyway, so maybe I wouldn't be much ahead on this journey. These things are not critical to make the app &lt;strong&gt;usable&lt;/strong&gt; and &lt;strong&gt;enjoyable&lt;/strong&gt;, so they go to the backlog, and I'll finish them if I have enough time and motivation.&lt;/p&gt;

&lt;p&gt;Now I only need to fix the remaining bugs 🐞&lt;/p&gt;




&lt;p&gt;I'd love to hear your opinion about this post, how you stay productive or what you think of &lt;a href="https://another-pomodoro.app/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch&amp;amp;utm_content=anotherpomodoro1_footer"&gt;my app&lt;/a&gt;! Don't forget to &lt;a href="https://github.com/Hanziness/AnotherPomodoro?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch&amp;amp;utm_content=anotherpomodoro1_footer"&gt;check out the app's GitHub repository&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;See you around.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Creating a pomodoro app with open-source tools</title>
      <dc:creator>Imre Gera</dc:creator>
      <pubDate>Mon, 11 Jan 2021 17:10:54 +0000</pubDate>
      <link>https://dev.to/hanziness/creating-a-pomodoro-app-with-open-source-tools-2bmf</link>
      <guid>https://dev.to/hanziness/creating-a-pomodoro-app-with-open-source-tools-2bmf</guid>
      <description>&lt;p&gt;In this short and absolutely-not-technical post, I'll take a look at the choice of software used to create AnotherPomodoro. No code here, it's more about the choices I made for the technology stack and a bit of talk about static sites being capable of doing a lot.&lt;/p&gt;

&lt;h1&gt;
  
  
  The web as a platform
&lt;/h1&gt;

&lt;p&gt;So I knew I wanted to build a Pomodoro timer (&lt;a href="https://www.buymeacoffee.com/imreg/first-glimpse-anotherpomodoro-169355"&gt;here's why I decided to do that&lt;/a&gt;). The question was: where do I distribute the app? Do I build a mobile app or a desktop app? Do I really need to build something that users should &lt;em&gt;install&lt;/em&gt; at all?&lt;/p&gt;

&lt;p&gt;I've been playing around with web development for quite a while, so I was quite biased towards front-end web technologies: just building something with HTML, CSS and JavaScript. You can actually build mobile and desktop apps with these technologies (Ionic for mobile, Electron for desktop), but since web browsers are essential and frequently-used apps in almost every operating system, you can just build a webpage and there's no need to install anything: just type in the address and there you go. Or if the webpage is a Progressive Web App (PWA), you can easily pin it to your home screen, too. &lt;strong&gt;Zero effort.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Vue and Nuxt.js
&lt;/h1&gt;

&lt;p&gt;Web page it is, then. But I did not want to write HTML files because as the app would get bigger, so would its maintenance become more difficult.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3EJce70U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zfw4lzoc0e5rph314mpv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3EJce70U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zfw4lzoc0e5rph314mpv.png" alt="Screenshot of the settings view's first page" width="880" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've grown to like &lt;a href="https://vuejs.org"&gt;VueJS&lt;/a&gt; recently with its huge flexibility (use JavaScript or TypeScript and integrate any CSS pre-processor, among others). Reactive frameworks make it easy to build an app where once you change something, that change is immediately reflected everywhere else in the app. You can notice this behaviour in AnotherPomodoro as well: go to the settings menu, to the display tab and toggle the schedule or change the number of items in the schedule. You'll see that once you click the checkbox or enter a different number, the changes are immediately applied - no need to press a "Save" button or reload the page! The best thing is that I did not need to program this behaviour into the app, first: Vue does it all for me.&lt;/p&gt;

&lt;p&gt;Before starting out with AnotherPomodoro I've found that there's something that makes it even easier to build a Vue app: &lt;a href="https://nuxtjs.org/"&gt;&lt;strong&gt;Nuxt.js&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nuxt allows me to create websites that just work: no need to set up things like a router (what to do when the user types in &lt;code&gt;/timer&lt;/code&gt; into the address bar) or some kind of state management (Vuex) and on top of that, the app is optimized out of the box thanks to &lt;em&gt;server-side rendering&lt;/em&gt;. It also lets you create &lt;strong&gt;statically generated websites&lt;/strong&gt;. With that nothing special is required to run your web app other than the "dumbest" kind of web server: one that can serve plain old HTML, CSS and JavaScript files. That's cool.&lt;/p&gt;

&lt;p&gt;That's what I wanted, so I focused on building a fully static website. I probably cannot list all the benefits of using something like Nuxt.js and it might not be too interesting either: they are most noticeable to me, a developer. Among a lot of advantages, I can easily separate my app into &lt;em&gt;components&lt;/em&gt; - like how the three styles of timers are just different components: when you switch between them, they get swapped. This makes it really easy to build more stuff into the app without it getting too bloated (like having thousands of lines of code in a single file).&lt;/p&gt;

&lt;h1&gt;
  
  
  Extending Nuxt.js
&lt;/h1&gt;

&lt;p&gt;Right, web technologies are cool. Nuxt.js is &lt;em&gt;really&lt;/em&gt; cool. How do I make it even easier to develop a web app? Well, let's get ourselves a &lt;strong&gt;UI library&lt;/strong&gt; first to create a beautiful app quickly!&lt;/p&gt;

&lt;p&gt;At first, I tried &lt;a href="https://vuetifyjs.com/en"&gt;Vuetify&lt;/a&gt;. I loved it because it allowed me to build an app without having to know how to style stuff and program things like a modal (dialog) window. I just wrote &lt;code&gt;v-dialog&lt;/code&gt; and I had a modal window with beautiful material design looks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pWwHS0c4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g3xy75qxlky60nurci4l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pWwHS0c4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g3xy75qxlky60nurci4l.png" alt="Screenshot of the app running with its default settings" width="880" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the end, I felt that it slowed the app down and without effort, the whole site started to look really generic. I then decided to switch to &lt;a href="https://tailwindcss.com"&gt;Tailwind CSS&lt;/a&gt; (kind of the opposite of what Vuetify provides) and refreshed the app's looks with a hand-crafted design. There were no ready-made components any more but it's really easy to create whatever you want using Tailwind. I just write &lt;code&gt;p-4 border border-gray-200 shadow&lt;/code&gt; and I have a box that now looks like a card: it has padding inside it, a grey border and a shadow. Awesome!&lt;/p&gt;

&lt;p&gt;Later on, some more plug-ins were added to the site: I needed an app that can be translated into different languages (thanks &lt;a href="https://i18n.nuxtjs.org"&gt;nuxt-i18n&lt;/a&gt; and &lt;a href="https://kazupon.github.io/vue-i18n/"&gt;vue-i18n&lt;/a&gt;!), I wanted it to save the settings so when the user comes back they are reloaded (thanks &lt;a href="https://github.com/robinvdvleuten/vuex-persistedstate"&gt;vuex-persistedstate&lt;/a&gt;!), I did not want to write my own date and time formatting functions (thanks &lt;a href="https://day.js.org"&gt;Day.js&lt;/a&gt;!) and so on. You can find the full list of modules I used &lt;a href="https://github.com/Hanziness/AnotherPomodoro#-technologies-packages-used"&gt;on the project's GitHub page&lt;/a&gt;! There's a lot and they all helped make AnotherPomodoro what it is now.&lt;/p&gt;

&lt;h1&gt;
  
  
  Publishing the results with Netlify
&lt;/h1&gt;

&lt;p&gt;Once the app was sort-of ready, I needed a place where I could host it so that it has a URL address and anyone can access it without having to execute commands on their computers. Normally one would say that you cannot host your website without paying for a hosting service. Sure, when you want to build an app with a database and extra logic and authentication (register and log in) - anything that requires some extra work on the server's side - that's not necessarily free. Or if it is free, you'd soon reach the free tier's limits, anyway.&lt;/p&gt;

&lt;p&gt;Remember when I mentioned that AnotherPomodoro is a static website? There are services like &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt; (and &lt;a href="https://vercel.com/"&gt;Vercel&lt;/a&gt;) that allow you to not only upload a static website (one that consists of HTML, CSS and JavaScript files and no server-side logic) but also offer you to build that website from your source code! That means that whenever I change the app's code, Netlify runs a command so that Nuxt.js creates a static website from the app's code. These services are also a lot more generous with their free tiers: you get 100 GBs of bandwidth per month (the full app is around 2-300 KBs but you likely won't download all of that) and 300 minutes spent building your app (at least on Netlify) - of which one build takes around 2 minutes. This is more than enough even for a growing app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UQ3FXtD7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xuho9z4gyq3nn39d91hv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UQ3FXtD7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xuho9z4gyq3nn39d91hv.png" alt="The home page of AnotherPomodoro" width="880" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  "Hacking the system" with static websites
&lt;/h1&gt;

&lt;p&gt;AnotherPomodoro is equipped with features that one could easily say would require a "proper" server: storing your settings and tasks, for example. Thanks to frameworks like Nuxt.js and their static site generation functionality, this can be avoided in a lot of cases. &lt;strong&gt;You can even build a blog or a news site with static site generation!&lt;/strong&gt; Since there's no authentication (you edit the code of your site on your machine, not the content in some database on the internet) there's also a lot less space for attacks. Just be sure to protect the source code and your materials properly.&lt;/p&gt;

&lt;p&gt;Static site generation is not some universal magic wand to avoid databases and more complex servers, though. Since no data is stored on servers, AnotherPomodoro is not able to synchronize your settings and tasks across your devices: if your browser does that for you, all the better. There's no way to create leaderboards, either. In fact, &lt;strong&gt;sharing any user-generated content&lt;/strong&gt; (think social media posts, for example) &lt;strong&gt;through a static app is without any supporting server is (mostly) impossible, if not tricky&lt;/strong&gt;. To me, these things were never really important, anyway. I am willing to spend 30 seconds to configure the app and I don't think that Pomodoro apps need leaderboards. I can build a statistics module into the app, though 🙂&lt;/p&gt;

&lt;p&gt;The key is to &lt;strong&gt;recognize&lt;/strong&gt; when the features you want in your app actually might not require more than what a static website can provide. &lt;strong&gt;It might be tempting to include a login feature just to share data across devices&lt;/strong&gt; but in some cases that might be overkill. In AnotherPomodoro's case, a quick setup page is being made to set the app up for first use even quicker so users will not need to delve into the settings that much. This also helps avoid having to sync settings across multiple browsers.&lt;/p&gt;

&lt;p&gt;The app's source code (along with more technical information) is available &lt;a href="https://github.com/Hanziness/AnotherPomodoro"&gt;at the project's GitHub page&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Hanziness"&gt;
        Hanziness
      &lt;/a&gt; / &lt;a href="https://github.com/Hanziness/AnotherPomodoro"&gt;
        AnotherPomodoro
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Modern and customizable productivity timer app that runs in your browser.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
⏳ AnotherPomodoro&lt;/h1&gt;
&lt;p&gt;Free and open-source Pomodoro application, right in your browser.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/imreg?utm_source=github&amp;amp;utm_medium=web&amp;amp;utm_content=readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/28aae05a0fba45679e8e27d90609601e249b64a5fe30dfef05495de4f4e318d4/68747470733a2f2f63646e2e6275796d6561636f666665652e636f6d2f627574746f6e732f76322f64656661756c742d79656c6c6f772e706e67" height="54"&gt;&lt;/a&gt; &lt;a href="https://www.producthunt.com/posts/anotherpomodoro?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-anotherpomodoro" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3f47da7f218487301b555446b57aaa031f608e4f528284a1cf5337016bcadafa/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f66656174757265642e7376673f706f73745f69643d333237313835267468656d653d6c69676874" alt="AnotherPomodoro - Modern &amp;amp; customizable productivity timer | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/00f044c3ef2406111b3c36700efd9d4d79d68c248a1ab92f3de2fc6f5e175cc3/68747470733a2f2f6170692e6e65746c6966792e636f6d2f6170692f76312f6261646765732f37636232623766622d636163642d346163662d383033622d3861663964616439663261382f6465706c6f792d737461747573"&gt;&lt;img src="https://camo.githubusercontent.com/00f044c3ef2406111b3c36700efd9d4d79d68c248a1ab92f3de2fc6f5e175cc3/68747470733a2f2f6170692e6e65746c6966792e636f6d2f6170692f76312f6261646765732f37636232623766622d636163642d346163662d383033622d3861663964616439663261382f6465706c6f792d737461747573" alt="Netlify Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Hanziness/AnotherPomodoro./static/assets/img/ProductImg_Default.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cF8L8gU3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/Hanziness/AnotherPomodoro./static/assets/img/ProductImg_Default.png" alt="Screenshot of the application showing a work section."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
What is it?&lt;/h2&gt;
&lt;p&gt;AnotherPomodoro is a Pomodoro timer application running in the browser. It helps you manage your time so that you can do more work instead of watching videos of cute cats 😿&lt;/p&gt;
&lt;h3&gt;
Quickstart: your schedule&lt;/h3&gt;
&lt;p&gt;When working with AnotherPomodoro, you'll be moving between three types of sessions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Work&lt;/strong&gt;.  Do what you have to do.&lt;/li&gt;
&lt;li&gt;(Short) &lt;strong&gt;Pause&lt;/strong&gt;.  Take a short rest, stand up from your computer and drink some water.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long pause&lt;/strong&gt;.  Having worked some time now, take a longer break. You can grab a cup of coffee, watch some memes and scroll social media.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With the default Pomodoro settings, every third break will be a long one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip&lt;/strong&gt;. You can customize the length of the timers and the frequency of long pauses, too!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
What you get&lt;/h2&gt;
&lt;p&gt;Here's the looong list of features…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Hanziness/AnotherPomodoro"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Thanks for reading this little snippet of the making of AnotherPomodoro. If you haven't yet, &lt;a href="https://another-pomodoro.netlify.app/"&gt;check out the app at https://another-pomodoro.netlify.app&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;This blog post was originally shared on &lt;a href="https://www.buymeacoffee.com/imreg"&gt;my Buy Me a Coffee page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>todayilearned</category>
    </item>
  </channel>
</rss>
