<?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: Alexey Kursanov</title>
    <description>The latest articles on DEV Community by Alexey Kursanov (@alexey_kursanov_web).</description>
    <link>https://dev.to/alexey_kursanov_web</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4188177%2Fcf0f04f0-ae8d-4db5-9197-a9631f9f7e1d.jpg</url>
      <title>DEV Community: Alexey Kursanov</title>
      <link>https://dev.to/alexey_kursanov_web</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexey_kursanov_web"/>
    <language>en</language>
    <item>
      <title>My Shifts: a personal shift and earnings tracker built for the browser</title>
      <dc:creator>Alexey Kursanov</dc:creator>
      <pubDate>Fri, 16 Oct 2026 13:35:36 +0000</pubDate>
      <link>https://dev.to/alexey_kursanov_web/my-shifts-a-personal-shift-and-earnings-tracker-built-for-the-browser-f7p</link>
      <guid>https://dev.to/alexey_kursanov_web/my-shifts-a-personal-shift-and-earnings-tracker-built-for-the-browser-f7p</guid>
      <description>&lt;p&gt;My Shifts is my personal web application for recording shifts, working time and earnings. It is part of my portfolio, rather than a paid client commission.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://moi-smeny.onrender.com/" rel="noopener noreferrer"&gt;Open My Shifts&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the application handles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A shift calendar, start/end times and breaks.&lt;/li&gt;
&lt;li&gt;Multiple workplaces with their own pay settings.&lt;/li&gt;
&lt;li&gt;Earnings calculations, manual entries, deductions and tips.&lt;/li&gt;
&lt;li&gt;A shared monthly goal and comparisons between months.&lt;/li&gt;
&lt;li&gt;CSV export and JSON backups.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A few implementation decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Planned work is different from completed work
&lt;/h3&gt;

&lt;p&gt;A planned shift belongs on the calendar, but it should not create earnings before the shift is actually started and completed. Keeping these states separate makes the totals easier to understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breaks should be counted once
&lt;/h3&gt;

&lt;p&gt;The running timer tracks break time. For hourly calculations, the total break is deducted once. A fixed payment for a completed shift follows its own rule.&lt;/p&gt;

&lt;h3&gt;
  
  
  Different currencies should stay separate
&lt;/h3&gt;

&lt;p&gt;The application can show records from multiple workplaces. It does not add amounts in different currencies into a single misleading total.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local records should survive a connection problem
&lt;/h3&gt;

&lt;p&gt;The frontend uses browser storage and syncs account data through a Node.js server and PostgreSQL. A temporary database failure should not clear the local records. JSON backups and CSV export give users another way to keep their data.&lt;/p&gt;

&lt;h2&gt;
  
  
  My role
&lt;/h2&gt;

&lt;p&gt;I worked on the product structure, interface, application logic, testing and deployment. The project continues to evolve; the live version is in Russian.&lt;/p&gt;

&lt;p&gt;I also create and improve websites and browser applications, fix bugs and add forms and integrations. I communicate in Russian and in written English using translation tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://alexey-portfolio-uk1x.onrender.com/" rel="noopener noreferrer"&gt;Explore my 10 personal and demo projects&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
  </channel>
</rss>
