<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://blog.poplauki.eu" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Poplavskij Vladimir blog</title>
    <link>https://blog.poplauki.eu/en/feed.xml</link>
    <atom:link href="https://blog.poplauki.eu/en/feed.xml" rel="self" type="application/rss+xml"/>
    <description>English</description>
    <language>en</language>
    
    
    
    
    
    
    
    
      
      <item>
        <title>The Way of Kings: A Journey into the Stormlight Archive</title>
        <link>https://blog.poplauki.eu/en/blog/the-way-of-kings-a-journey-into-the-stormlight-archive/</link>
        <description>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Brandon_Sanderson&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Brandon Sanderson&lt;/a&gt; is a master of his craft, and &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Way_of_Kings&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;The Way of Kings&lt;/a&gt;, the first volume in his renowned &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Stormlight_Archive&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Stormlight Archive series&lt;/a&gt;, is a testament to his skill. This epic high-fantasy novel transports you to Roshar, a world of relentless storms, enigmatic magic, and deep political struggles.&lt;/p&gt;
&lt;h2&gt;The Way of Kings&lt;/h2&gt;
&lt;p&gt;Roshar is a place where hardened warriors clash in battles of honor and desperation, ancient secrets simmer beneath the surface, and the fate of a world hangs in the balance. &lt;em&gt;The Way of Kings&lt;/em&gt; weaves together the stories of three compelling characters: Shallan, a young scholar seeking forbidden knowledge; Dalinar, a battle-worn general searching for meaning; and Kaladin, an enslaved soldier fighting for survival.&lt;/p&gt;
&lt;h2&gt;Kaladin&lt;/h2&gt;
&lt;p&gt;Kaladin is one of Sanderson’s most memorable creations. Haunted by his past, he fights to protect his men against impossible odds. His journey of strength, honor, and determination amid unimaginable hardship will resonate deeply with readers.&lt;/p&gt;
&lt;h2&gt;Dalinar Kholin&lt;/h2&gt;
&lt;p&gt;Dalinar Kholin, the stoic and honorable brother of the late king, embodies the clash between tradition and change. Deeply influenced by the ancient text &lt;em&gt;The Way of Kings&lt;/em&gt;, he anchors his beliefs in a strict code of honor. Dalinar’s struggle lies in reconciling the ideals of the past with the shifting, complex realities of the present. One principle at the heart of the book resonates especially strongly with him:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There can be no honor in a victory that forces you to abandon who you are.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It guides his actions even as it becomes a constant source of inner conflict.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-image article-image--square article-image--article&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/honor-square-400w.webp&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/honor-square-400w.jpeg&quot; /&gt;&lt;img src=&quot;https://blog.poplauki.eu/img/generated/honor-square-400w.jpeg&quot; width=&quot;400&quot; height=&quot;400&quot; alt=&quot;A knight beneath the words about honor and victory from The Way of Kings&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;The oath of the Knights Radiant&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Life before death. Strength before weakness. Journey before destination.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;These words form the oath of the Knights Radiant, an ancient order, and capture the central themes of &lt;em&gt;The Way of Kings&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you love rich world-building, unforgettable characters, and high-stakes adventure, &lt;em&gt;The Way of Kings&lt;/em&gt; is a must-read. Embark on this epic odyssey and discover why Sanderson is considered one of the finest fantasy authors of our time.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The Way of Kings&lt;/em&gt; deserves its acclaim. Its intricate world-building, fascinating cultures, and distinctive names draw you in. But it is the flawed, resilient, and undeniably human characters who make this book an unforgettable journey. If you want a novel that will challenge your mind, tug at your heartstrings, and leave you longing to return to Roshar, &lt;em&gt;The Way of Kings&lt;/em&gt; should be at the top of your reading list.&lt;/p&gt;
&lt;p&gt;Find my other book notes and reviews at &lt;a href=&quot;https://reading.poplauki.eu/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;reading.poplauki.eu&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Sat, 08 Aug 2026 17:14:30 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/the-way-of-kings-a-journey-into-the-stormlight-archive/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Essential OWASP Security Tools: Pre-Launch Website Checklist</title>
        <link>https://blog.poplauki.eu/en/blog/list-owasp-useful-links/</link>
        <description>&lt;p&gt;List of the OWASP links:&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Scanners&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/scan&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Cloudflare Radar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.projectdiscovery.io/opensource/nuclei/overview&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;A fast and customisable vulnerability scanner powered by simple YAML-based templates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;DNS&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://dnsdumpster.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;dns recon &amp;amp; research, find &amp;amp; lookup dns records&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Headers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://check.town/csp-validator&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;CSP Header Validator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://securityheaders.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Security Headers (Snyk)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;HSTS Checker&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://showdns.net/hsts-checker&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;HTTP Strict Transport Security Test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 18 Apr 2026 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/list-owasp-useful-links/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Stoic daily practice</title>
        <link>https://blog.poplauki.eu/en/blog/daily-stoic-routine-habits-for-inner-peace/</link>
        <description>&lt;h2&gt;Morning Disciplines: Claiming the Day&lt;/h2&gt;
&lt;p&gt;The Stoic day begins with an intentional effort to claim the day before “the rush storms in” and obligations collide&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Morning Reminder:&lt;/strong&gt; Practitioners are encouraged to remind themselves that they will encounter difficult people—“the busybody, the ungrateful, [and] arrogant”—and that their well-being should not be held hostage by anyone else’s character.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setting Intentions:&lt;/strong&gt; Morning rituals involve focusing on what is important and committing to live by values rather than moods, such as acting with self-discipline and honesty even when it is inconvenient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preparation:&lt;/strong&gt; This is a time for readiness, where the student prepares their mind to respond with virtue to whatever the day holds&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Throughout the Day: The Practice of Attention&lt;/h2&gt;
&lt;p&gt;Stoicism in daily life requires a constant “discipline of judgment” to ensure internal reactions are governed by reason&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Dichotomy of Control:&lt;/strong&gt; At the heart of daily life is the simple, repetitive question: “Is this within my control?”. If an event—like traffic, the weather, or another’s behavior—is not under one’s control, the practitioner chooses to let it go and focuses solely on their own responses and actions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Stoic Pause:&lt;/strong&gt; To avoid being “dazed by the rapidity of the impact” of external events, Stoics practice a deliberate pause. This brief interruption of an automatic reaction allows space to ask what is actually happening and prevents the mind from constructing a “story of harm” around neutral events.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Watchtower Perspective:&lt;/strong&gt; To counter the tendency to look at problems too closely, Stoics mentally “zoom out.” By viewing events as if from a high watchtower, individual problems shrink in significance and are seen as part of a shared, ordinary, and fleeting human condition.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Voluntary Discomfort:&lt;/strong&gt; Practitioners may periodically choose to go without luxuries, wearing simple clothes or eating cheap fare, to remind themselves that happiness does not depend on possessions and to “stiffen the spine” for future hardships&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Evening Reflection: Reviewing the Character&lt;/h2&gt;
&lt;p&gt;The day concludes with a period of reflection to assess one’s progress and character&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Review:&lt;/strong&gt; Stoics look back at the day’s events to ask: “Did I remain patient? Did I show courage? Where did emotion take over?”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Correction without Despair:&lt;/strong&gt; If a practice falls short of principles, the goal is not to despair but to simply return to the practice after the failure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Specific Exercises:&lt;/strong&gt; One recommended exercise is to choose a single moment that was disturbing and write four short lines: what happened plainly, what was concluded about it, the “watchtower” or future view of the event, and what part was actually yours to manage&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ultimately, Stoic daily practice is about mastery of the self rather than the world, seeking to become a “limb of a larger body” that acts rationally and socially in the present moment&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Apr 2026 16:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/daily-stoic-routine-habits-for-inner-peace/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>📡 Receiving Weather Forecasts from 433 MHz Sensors on Raspberry Pi with RTL-SDR</title>
        <link>https://blog.poplauki.eu/en/blog/forecast-receiver-raspberry-pi-rtl-sdr/</link>
        <description>&lt;h2&gt;From Raw Radio Signals to Elegant Grafana Dashboards&lt;/h2&gt;
&lt;p&gt;At some point, checking the weather in an app stopped being enough. I wanted to know the temperature on the balcony—not from some cloud-based API, but from my own sensors, working in real time.
That’s how the idea for a fully private weather monitoring system was born.&lt;/p&gt;
&lt;h3&gt;📡 1. Capturing Signals from the Air&lt;/h3&gt;
&lt;p&gt;The foundation of this project is the RTL-SDR dongle—a small radio receiver capable of intercepting transmissions from cheap 433 MHz sensors.
With the help of &lt;strong&gt;rtl_433&lt;/strong&gt;, I transformed raw radio signals into readable JSON data.
This is the moment when “radio magic” becomes actionable data.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-image article-image--landscape article-image--article&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/IMG20260411083210-landscape-400w.webp&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/IMG20260411083210-landscape-400w.jpeg&quot; /&gt;&lt;img src=&quot;https://blog.poplauki.eu/img/generated/IMG20260411083210-landscape-400w.jpeg&quot; width=&quot;400&quot; height=&quot;267&quot; alt=&quot;dongle RTL-SDR + raspberry-pi&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-image article-image--landscape article-image--article&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/IMG20260411083455-landscape-400w.webp&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/IMG20260411083455-landscape-400w.jpeg&quot; /&gt;&lt;img src=&quot;https://blog.poplauki.eu/img/generated/IMG20260411083455-landscape-400w.jpeg&quot; width=&quot;400&quot; height=&quot;267&quot; alt=&quot;forecast sensors 433 MHz&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;🔧 2. Smart Filter: Only My Sensors, Only What Matters&lt;/h3&gt;
&lt;p&gt;I didn’t want noise in the system.
That’s why I created &lt;code&gt;bridge.js&lt;/code&gt;—a small, clever &lt;code&gt;Node.js&lt;/code&gt; script that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Recognizes only my sensors (by model and ID),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maps them to friendly names: kitchen, balcony, garden,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Converts temperature from &lt;strong&gt;°F&lt;/strong&gt; to &lt;strong&gt;°C&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Publishes clean, standardized data to MQTT (&lt;code&gt;weather/&amp;lt;name&amp;gt;&lt;/code&gt;),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Records the timestamp of the last signal,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sends notifications when a sensor’s battery starts dying.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn’t just a filter—it’s my private “weather intelligence layer.”&lt;/p&gt;
&lt;h3&gt;🧠 3. A Backend That Understands Data&lt;/h3&gt;
&lt;p&gt;Next, the data flows into a NestJS-based backend.
I built a custom MQTT client that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Subscribes to &lt;code&gt;weather/#&lt;/code&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Receives ready-to-use JSON data from &lt;code&gt;bridge.js&lt;/code&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updates a cache of recent readings,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aggregates data and stores it in PostgreSQL.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The backend doesn’t need to know about radio protocols or sensor models.
It receives clean, standardized data—and does what it does best.&lt;/p&gt;
&lt;h3&gt;🗄️ 4. Weather History in PostgreSQL&lt;/h3&gt;
&lt;p&gt;Each sensor generates multiple readings per minute.
Instead of storing everything, the backend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Buffers the data,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Calculates averages,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saves elegant records to the &lt;code&gt;weather_record&lt;/code&gt; table.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This keeps the database lightweight, fast, and ready for analysis.&lt;/p&gt;
&lt;h3&gt;📊 5. Real-Time Weather in My Home&lt;/h3&gt;
&lt;p&gt;Finally, everything lands in Grafana, where I created a set of dashboards:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Temperature charts segmented by sensor,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Humidity over time,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A diagnostic panel (battery status, last signal),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A quick view of recent values.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn’t just a chart—it’s my private “weather center,” running 24/7.&lt;/p&gt;
&lt;h3&gt;🎯 Final Result&lt;/h3&gt;
&lt;p&gt;I built a system that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Receives radio signals from 433 MHz sensors,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Filters and normalizes the data,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Publishes it to MQTT,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aggregates and stores it in the backend,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Displays it beautifully in Grafana.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zero cloud. Zero vendor lock-in.
Everything runs locally, quickly, and exactly how I want.&lt;/p&gt;
</description>
        <pubDate>Thu, 09 Apr 2026 10:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/forecast-receiver-raspberry-pi-rtl-sdr/</guid>
      </item>
      
    
    
    
    
    
    
    
    
      
      <item>
        <title>Stoic Guide to Inner Peace</title>
        <link>https://blog.poplauki.eu/en/blog/15-ways-to-achieve-tranquility/</link>
        <description>&lt;p&gt;The sources present fifteen ways to achieve tranquility (based on &lt;a href=&quot;https://en.wikipedia.org/wiki/Seneca_the_Younger&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Seneca’s&lt;/a&gt; suggestions) and also discuss the technical structure of subordinate virtues that fall under the four cardinal virtues of Stoicism. While the specific count of “15 subordinate virtues” is not explicitly defined as a single canonical list in the sources, they provide a detailed list of fifteen practical suggestions for living virtuously and identify various subordinate virtues within the broader Stoic framework&lt;/p&gt;
&lt;h2&gt;The 15 Suggestions for Tranquility&lt;/h2&gt;
&lt;p&gt;These fifteen points are drawn from Seneca’s essay On Tranquillity of Mind and represent practical applications of Stoic virtue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Get involved in the world&lt;/em&gt;: Actively engaging in daily activities and worthwhile work steadies the mind and counters restlessness.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Don’t let obstacles stop you&lt;/em&gt;: Practice perseverance and find alternative paths when blocked; even small services contribute to a quiet dignity.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Decide to be alive until you die&lt;/em&gt;: Commit to staying fully present and content regardless of whether your circumstances are harsh or pleasant.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Match your actions with your ability&lt;/em&gt;: Choose tasks you can carry well and avoid commitments that overwhelm your nature or abilities.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Be careful in choosing friends&lt;/em&gt;: Prioritize genuine companions and avoid “miserable people” who find something to complain about in everything.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Don’t go after possessions&lt;/em&gt;: Avoid the consuming pursuit of wealth and aim instead for sufficiency.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Live simply&lt;/em&gt;: Avoid display and extravagance; a simple life is easier to maintain and steadies the mind.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Handle life with skill&lt;/em&gt;: Use practice and skill to turn hardships into bearable circumstances rather than crushing weights.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Be willing to let go&lt;/em&gt;: Recognize that every human condition is temporary and avoid clinging too tightly to status, possessions, or life itself.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avoid useless activities&lt;/em&gt;: Choose meaningful purposes and avoid aimless busyness that breeds distraction.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Be prepared for disappointment&lt;/em&gt;: Expect that things will not always go as hoped to strip disappointment of its power.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Be neither stubborn nor indecisive&lt;/em&gt;: Maintain the flexibility to adapt to changing circumstances or to withdraw when reason advises.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Don’t be guided by other people’s opinions&lt;/em&gt;: Ignore human folly and follow what reason demands.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Learn from other people’s courage&lt;/em&gt;: Observe how others face misfortune and strengthen your own heart through their example.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Be yourself, relax, have fun&lt;/em&gt;: Give the mind rest through walks, enjoyment, and meals in moderation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Technical Structure of Subordinate Virtues&lt;/h2&gt;
&lt;p&gt;The sources explain that the four cardinal virtues—Wisdom (Prudence), Justice, Courage, and Temperance—each encompass several subordinate virtues. According to Arius Didymus, Prudence includes six subordinate virtues, Courage includes five, and Justice and Temperance each have four, totaling 19. Specific examples named in the sources include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subordinate Virtues of Justice: These include kindness (knowledge of how to do good), fair dealing, good fellowship, and piety. Other aspects include honesty, truthfulness, and faithfulness.&lt;/li&gt;
&lt;li&gt;Subordinate Virtues of Temperance: This category includes self-control (enkrateia), orderliness (eutaxia), propriety, and modesty.&lt;/li&gt;
&lt;li&gt;Subordinate Virtues of Courage: This includes magnanimity (greatness of mind or soul), perseverance (philoponia or “love of toil”), and patience (patientia).&lt;/li&gt;
&lt;li&gt;Subordinate Virtues of Prudence (Wisdom): While the sources do not list all six, they define wisdom as the “master virtue” or “clear-sighted intelligence” that directs the others&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 29 Mar 2026 20:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/15-ways-to-achieve-tranquility/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Symmetric Key Encryption for Health Data: MigrainePulse Security Architecture</title>
        <link>https://blog.poplauki.eu/en/blog/migraine-pulse-security-key-management-service/</link>
        <description>&lt;p&gt;When building HealthTech products like &lt;a href=&quot;https://migrainepulse.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;MigrainePulse&lt;/a&gt;, one of the biggest challenges is ensuring absolute security and privacy of sensitive user data. Migraine attack history, medications taken, health records, and lifestyle details – all of this is highly personal information.&lt;/p&gt;
&lt;p&gt;From day one, our philosophy was simple: user data belongs only to them. To ensure this, we implemented an advanced symmetric key encryption system ( angl. &lt;code&gt;Symmetric Key Encryption&lt;/code&gt;) in the MigrainePulse architecture, which works together with isolated microservice solutions (&lt;code&gt;Cloudflare Workers&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;In this article, we invite you to take a technical look under the hood and learn how our protection mechanisms work.&lt;/p&gt;
&lt;h2&gt;Why Standard Solutions Are Not Enough?&lt;/h2&gt;
&lt;p&gt;Most applications today use encryption during data transmission (&lt;code&gt;TLS/SSL&lt;/code&gt;) and encryption at rest (encrypted databases). However, if the entire system (database and main server holding encryption keys) is compromised at the same time, the data can become exposed.&lt;/p&gt;
&lt;p&gt;To avoid this, we separated the actual data from the keys needed to decrypt it in the MigrainePulse system.&lt;/p&gt;
&lt;h2&gt;Architecture Foundation: SymmetricKeyService&lt;/h2&gt;
&lt;p&gt;In our backend system (using a NestJS monolith), a special &lt;code&gt;SymmetricKeyService&lt;/code&gt; module manages encryption and decryption of sensitive data.&lt;/p&gt;
&lt;p&gt;How does it work in practice?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Single Key Principle: Symmetric encryption means the same unique key is used to both encrypt and decrypt data. Each user has a unique key assigned to them, which even we do not have in our main database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Payload Encryption: When a user saves a new health record (e.g., adds a new migraine attack), the data reaches our server. &lt;code&gt;SymmetricKeyService&lt;/code&gt; takes this sensitive payload, encrypts it using an advanced algorithm (e.g., &lt;code&gt;AES-256-GCM&lt;/code&gt;), and only then saves it to the database. Only a meaningless string of characters is stored in the database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User Identification: User session and data access are tightly tied to JWT (&lt;code&gt;JSON Web Tokens&lt;/code&gt;) and Supabase authentication. The user verifies their identity, and the encryption key belonging to them is only provided upon verified login.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture class=&quot;article-image article-image--landscape article-image--article&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/migraine-pulse-security-key-management-service-diagram-landscape-400w.webp&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/migraine-pulse-security-key-management-service-diagram-landscape-400w.jpeg&quot; /&gt;&lt;img src=&quot;https://blog.poplauki.eu/img/generated/migraine-pulse-security-key-management-service-diagram-landscape-400w.jpeg&quot; width=&quot;400&quot; height=&quot;267&quot; alt=&quot;migraine-pulse-security-key-management-service diagram&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Additional Defense Layer: Cloudflare Worker&lt;/h2&gt;
&lt;p&gt;A natural question arises – where are the encryption keys stored if not in the main database?&lt;/p&gt;
&lt;p&gt;Here we called upon &lt;code&gt;Cloudflare Workers&lt;/code&gt; technology.&lt;/p&gt;
&lt;p&gt;In our architecture, encryption keys are managed through a completely isolated, Edge network infrastructure. The solution described in &lt;a href=&quot;https://github.com/wirtaw/migraine-tracker-docs/blob/master/docs/backend/cloudflare-worker.md&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;doc/backend/cloudflare-worker.md&lt;/a&gt; ensures that the main API server and database never store the keys themselves in long-term memory.&lt;/p&gt;
&lt;h2&gt;Integration Benefits:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Decentralization:&lt;/strong&gt; Since keys are stored and managed in a separate cloud infrastructure (Cloudflare), a potential hacker would not suffice to compromise our main server. They would need to simultaneously overcome two completely different, mutually isolated systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Speed (Low Latency):&lt;/strong&gt; Cloudflare Workers operate on a global Edge network (closest to the user), so requesting a key from them (for authorized decryption) adds only minimal delay while maintaining application performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Strict Access Control:&lt;/strong&gt; The Worker is configured so that it only hands over keys upon receiving correctly signed and verified requests from our SymmetricKeyService, checking all CORS and IP restrictions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;MigrainePulse is not just a tool for tracking data. It is a secure space. By combining robust NestJS architecture (&lt;a href=&quot;https://github.com/wirtaw/migraine-tracker-monolith/blob/master/src/auth/symmetric-key/symmetric-key.service.ts&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;symmetric-key.service.ts&lt;/a&gt;) with the decentralization provided by Cloudflare Workers, we created a system where the user’s personal information remains locked even in the worst-case scenarios.&lt;/p&gt;
&lt;p&gt;For us, “Security First” is not just a marketing slogan – it is the engineering foundation on which the entire MigrainePulse system is built. Because when we talk about health, there is no room for privacy compromises.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Do you have questions about our technical architecture? Join the discussion in the comments or try &lt;a href=&quot;https://migrainepulse.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;MigrainePulse&lt;/a&gt; yourself!&lt;/p&gt;
</description>
        <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/migraine-pulse-security-key-management-service/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Migraine Pulse – moving data schema to backend</title>
        <link>https://blog.poplauki.eu/en/blog/migraine-pulse-data-schema-backend/</link>
        <description>&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;: This article describes moving the data schema from frontend to backend in the Migraine Pulse app. You’ll learn how we implemented a dynamic schema using NestJS, JSON schema validation, and how it simplified the data export/import process.&lt;/p&gt;
&lt;p&gt;As I mentioned in the &lt;a href=&quot;https://blog.poplauki.eu/en/blog/migraine-pulse-origin/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;introductory post&lt;/a&gt; about the app - the first version was a prototype. A React application where I imported JSON format stored locally. It would populate the app with my migraine incidents, symptoms, etc. I would refine certain things, modify (add data). At the end, I would do an export to have the latest changes.&lt;/p&gt;
&lt;p&gt;At the same time, I would check and refine the required fields for each element.&lt;/p&gt;
&lt;p&gt;Later I started building a &lt;a href=&quot;https://github.com/wirtaw/migraine-tracker-monolith&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;backend&lt;/a&gt; which already had a connection to the database. But when creating NestJS modules, I took into account the schema I worked out above.&lt;/p&gt;
&lt;p&gt;However, until now the schema format itself was described statically on the &lt;code&gt;settings/DataManagement&lt;/code&gt; page.&lt;/p&gt;
&lt;p&gt;I decided to make it dynamic, i.e., when fields change or are added, so you don’t have to manually edit the page every time.&lt;/p&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;The first step is simple - create a new NestJS &lt;code&gt;data-management&lt;/code&gt; module with service and controller.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;nest g module data-management 
nest g &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; data-management
nest g controller data-management&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The service returns a &lt;code&gt;JSON&lt;/code&gt; schema object.&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Injectable &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@nestjs/common&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Ajv &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ajv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; addFormats &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ajv-formats&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  dtoToJsonSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  ClassType&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  JsonSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./utils/dto-to-json-schema&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateIncidentDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../incidents/dto/create-incident.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateTriggerDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../triggers/dto/create-trigger.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateSymptomDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../symptoms/dto/create-symptom.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateMedicationDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../medications/dto/create-medication.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateLocationDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../locations/dto/create-locations.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  CreateWaterDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  CreateBloodPressureDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  CreateHeightDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  CreateSleepDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  CreateWeightDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../health-logs/dto/create-health-logs.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; DataValidationResponse &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./interface/validation.interface&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Injectable&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DataManagementService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; ajv&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Ajv&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ajv &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Ajv&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; allErrors&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addFormats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ajv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;getSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; incidentObjectSchema &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dtoToJsonSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      CreateIncidentDto &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; ClassType&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    incidentObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;properties &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; incidentObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;properties &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    incidentObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;properties&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; JsonSchema&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    incidentObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;properties&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;createdAt &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      format&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;date-time&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; JsonSchema&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; existingRequired &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;incidentObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;required&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; incidentObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;required
      &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; requiredSet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Set&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;existingRequired&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;userId&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;type&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;startTime&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;datetimeAt&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
      requiredSet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    incidentObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;required &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requiredSet&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; incidentsSchema&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; JsonSchema &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;array&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      items&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; incidentObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rootSchema&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; JsonSchema &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;object&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      properties&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        incidents&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; incidentsSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        triggers&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; triggersSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        symptoms&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; symptomsSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        medications&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; medicationsSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        locations&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; locationsSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        healthLogs&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; healthLogsSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        exportedAt&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; format&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;date-time&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        version&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      required&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;incidents&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;triggers&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;symptoms&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;medications&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;locations&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;healthLogs&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;exportedAt&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;version&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      additionalProperties&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; rootSchema&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the controller, return the &lt;code&gt;JSON&lt;/code&gt; schema object from the service. It’s accessible with USER role, since that page is only accessible to logged-in users.&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Controller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Get &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@nestjs/common&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; DataManagementService &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./data-management.service&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Roles &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../auth/decorators/roles.decorator&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Role &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../auth/enums/roles.enum&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Controller&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data-management&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DataManagementController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;readonly&lt;/span&gt; dataManagementService&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; DataManagementService&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Roles&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Role&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;USER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;schema&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;getSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; object &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataManagementService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Integrate the newly created into the &lt;code&gt;settings/DataManagement&lt;/code&gt; page.&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getDataSchema&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MIGRAINE_BACKEND_API_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/api/v1/data-management/schema&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    headers&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getHeaders&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ok&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Failed to fetch data schema&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the first step provides the ability to modify not HTML, but JSON schema, to describe it and split into parts. Add versioning. Validate files before importing to not break the data structure.&lt;/p&gt;
&lt;h3&gt;Schema validation service and controller&lt;/h3&gt;
&lt;p&gt;Add new npm packages for validation using json schemas.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; ajv ajv-formats&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Injectable &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@nestjs/common&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Ajv &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ajv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; addFormats &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ajv-formats&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  dtoToJsonSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  ClassType&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  JsonSchema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./utils/dto-to-json-schema&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateIncidentDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../incidents/dto/create-incident.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateTriggerDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../triggers/dto/create-trigger.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateSymptomDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../symptoms/dto/create-symptom.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateMedicationDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../medications/dto/create-medication.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; CreateLocationDto &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../locations/dto/create-locations.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  CreateWaterDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  CreateBloodPressureDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  CreateHeightDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  CreateSleepDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  CreateWeightDto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../health-logs/dto/create-health-logs.dto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; DataValidationResponse &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./interface/validation.interface&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Injectable&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DataManagementService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; ajv&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Ajv&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ajv &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Ajv&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; allErrors&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addFormats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ajv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;getSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Above content&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;validateImportData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; DataValidationResponse &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; schema&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; JsonSchema &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; validate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ajv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;schema&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isValid &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;validate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;isValid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; isValid&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; errors&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; validate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; isValid&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Helper function &lt;code&gt;mapValidatorToSchema&lt;/code&gt; to convert &lt;code&gt;DTO&lt;/code&gt; to &lt;code&gt;JSON&lt;/code&gt; schema.&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;reflect-metadata&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; getMetadataStorage &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;class-validator&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ClassType&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;args&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PrimitiveTypeName&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;number&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;integer&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;boolean&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;null&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PrimitiveSchema&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PrimitiveTypeName&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  format&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;enum&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ArraySchema&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;array&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  items&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; JsonSchema&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ObjectSchema&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;object&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  properties&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; JsonSchema&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  required&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  additionalProperties&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;JsonSchema&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; PrimitiveSchema &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; ArraySchema &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; ObjectSchema&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ValidationMetadataLite&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  propertyName&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  constraints&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  each&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MetadataStorageLite&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;getTargetValidationMetadatas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    targetConstructor&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    targetSchema&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ValidationMetadataLite&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;asMetadataStorage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; MetadataStorageLite &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;object&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;getTargetValidationMetadatas&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; cast &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; obj &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; cast&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getTargetValidationMetadatas &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;function&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; cast &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; MetadataStorageLite&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mapValidatorToSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  meta&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ValidationMetadataLite &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  designType&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; JsonSchema &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;meta&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; Number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;number&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; Boolean&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;boolean&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;array&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; items&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;object&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; additionalProperties&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;meta&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isString&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isNumber&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;number&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isInt&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;integer&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isBoolean&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;boolean&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isDateString&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; format&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;date-time&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isUUID&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; format&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;uuid&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isEmail&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; format&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;email&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isArray&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;array&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; items&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isEnum&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; maybeEnum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;meta&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;constraints&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;meta&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;constraints&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; schema&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PrimitiveSchema &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;maybeEnum&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; maybeEnum&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; schema&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; Number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;number&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; Boolean&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;boolean&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;array&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; items&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;string&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;object&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; additionalProperties&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;dtoToJsonSchema&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  dtoClass&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ClassType&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ObjectSchema &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rawStorage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMetadataStorage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; storage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;asMetadataStorage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rawStorage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; metadatas&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ValidationMetadataLite&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; storage
    &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; storage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTargetValidationMetadatas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dtoClass &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; byProp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Map&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ValidationMetadataLite&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; m &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; metadatas&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; prop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;propertyName&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; arr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; byProp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    arr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    byProp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; properties&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; JsonSchema&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; required&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; metas&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; byProp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;entries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; designType &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Reflect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMetadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;design:type&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      dtoClass&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      prop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Function&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metas&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isArray&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isArray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; eachMeta &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metas&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;each &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isArray&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; itemsSchema &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mapValidatorToSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;eachMeta&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      properties&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;array&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; items&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; itemsSchema &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; preferredOrder &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isDateString&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isEnum&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isNumber&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isInt&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isBoolean&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isUUID&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isEmail&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isString&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&#39;isObject&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; chosen&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ValidationMetadataLite &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; preferredOrder&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        chosen &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metas&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;chosen&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;chosen&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; chosen &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metas&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; propSchema &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mapValidatorToSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;chosen&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; designType&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hasNested &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metas&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;nestedValidation&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        hasNested &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        designType &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        designType &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; Object &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        designType &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        properties&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dtoToJsonSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;designType &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; ClassType&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        properties&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; propSchema&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isOptional &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metas&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isOptional&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hasNotEmpty &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metas&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;isNotEmpty&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;isOptional &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hasNotEmpty&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; required&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; schema&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ObjectSchema &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;object&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    properties&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    additionalProperties&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;required&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;required &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; required&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; schema&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Controller endpoint for file validation.&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  Controller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  Get&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  Post&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  UploadedFile&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  UseInterceptors&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  BadRequestException 
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@nestjs/common&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; FileInterceptor &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@nestjs/platform-express&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; DataManagementService &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./data-management.service&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Public &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../auth/decorators/public.decorator&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Controller&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data-management&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DataManagementController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;readonly&lt;/span&gt; dataManagementService&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; DataManagementService&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Roles&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Role&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;USER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;schema&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;getSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataManagementService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Roles&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Role&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;USER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Post&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;validate-upload&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;UseInterceptors&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;FileInterceptor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;file&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;validateFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;UploadedFile&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; file&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Express&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Multer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;File&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; DataValidationResponse &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BadRequestException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;No file uploaded.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mimetype &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;application/json&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BadRequestException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Uploaded file must be a JSON file.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileContent&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;buffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;utf-8&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; jsonData&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; validationResult&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataManagementService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;validateImportData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;jsonData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;validationResult &lt;span class=&quot;token keyword&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BadRequestException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;validationResult&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; validationResult &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; DataValidationResponse&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;ErrorExceptionLogging&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DataManagementController&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Frontend usage example:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;checkUploadedFile&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; File&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; formData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FormData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;file&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;API_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/api/v1/data-management/validate-upload&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    method&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;POST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    body&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; formData&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isValid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;File is perfect! Proceed with import.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Validation failed:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here full code changes - &lt;a href=&quot;https://github.com/wirtaw/migraine-tracker-monolith/commit/6e9884018a822337c9546e28f1c3a480463d5bbe&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;backend&lt;/a&gt; and &lt;a href=&quot;https://github.com/wirtaw/migrane-tracker-dashboard/commit/dad4f607b455320753191ac1ce3d6c7362d2e25f&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;frontend&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/migraine-pulse-data-schema-backend/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>The Depth Paradox: Why Intellectual Isolation is the New Currency of Success</title>
        <link>https://blog.poplauki.eu/en/blog/deep-work/</link>
        <description>&lt;p&gt;This article emerged from studying &lt;a href=&quot;https://en.wikipedia.org/wiki/Cal_Newport&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Cal Newport’s&lt;/a&gt; groundbreaking book “Deep Work: Rules for Focused Success in a Distracted World.” Newport, a computer science professor at Georgetown University, argues that the ability to focus without distraction on cognitively demanding tasks is becoming increasingly rare—and increasingly valuable—in our knowledge economy. This exploration distills the core insights from his research, framed through the lens of practical application for modern professionals.&lt;/p&gt;
&lt;h2&gt;The Depth Paradox: Why Intellectual Isolation is the New Currency of Success&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Distraction Epidemic: Drowning in Functional Insignificance&lt;/strong&gt;
In the contemporary landscape of knowledge work, a quiet crisis is unfolding. Most professionals are drowning in a sea of functional insignificance—trapped in a state of perpetual motion that yields nothing of lasting value. We have mastered the art of “being busy” while our capacity for meaningful output withers. This friction arises from a fundamental failure to distinguish between two types of effort: Deep Work and Shallow Work.
Deep Work refers to professional activities performed in a state of distraction-free concentration that push your cognitive capabilities to their absolute limit. These efforts create new value, improve your skill, and are notoriously difficult to replicate. Shallow Work, conversely, involves non-cognitively demanding, logistical tasks often performed while distracted. In the new economy, the capacity for depth is becoming increasingly rare at the exact moment its market value is skyrocketing. It is no longer a mere habit; it is a superpower.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Deep Work Advantage: Mastery in the New Economy&lt;/strong&gt;
To survive the shift toward an automated and hyper-competitive economy, one must master two essential skills: the ability to learn complex things quickly and the ability to perform at an elite level with both quality and speed. Neither of these can be achieved through the fragmented attention of shallow effort.
As a researcher of cognitive performance, I argue that depth is the fundamental mechanism of value creation. To achieve this, one must choose a structure for their concentration. The Monastic method involves radical isolation to focus on a single high-level goal. The Bimodal method allows for a clear division of time between deep stretches and periods for everything else. Finally, the Journalistic method involves shifting into a deep work state instantly whenever a pocket of time opens up. Regardless of the method, the goal is the same:
“Deep work is focusing on professional activities without distraction so that cognitive abilities to unfold as much as they can. Only through such efforts are new values created and skills developed.”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Busy Trap: The Path of Least Resistance&lt;/strong&gt;
Why do we struggle to choose depth? The answer lies in the &lt;strong&gt;Principle of Least Resistance&lt;/strong&gt;. In the absence of clear feedback on how specific behaviors impact the bottom line, we instinctively choose whatever is easiest in the moment. We aren’t necessarily lazy; we are cognitively unanchored.
Because modern knowledge work lacks the visible output of a factory line, workers revert to industrial-age metrics: doing as much as possible as visibly as possible. This “visible busyness” serves as a psychological mask. We mistake the volume of sent emails for the value of our output, choosing the shallow path of least resistance over the rigorous, often lonely path of cognitive depth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Productive Power of Idleness: An Entrepreneurial Strategy&lt;/strong&gt;
High-intensity focus requires a commitment to what many would call “idleness.” However, the high-performer views rest not as a luxury, but as a prerequisite. To achieve peak results, one must adopt an entrepreneurial mindset— seek results like a businessman —which recognizes that downtime is fuel for insight.
Neurologically, the mind does not necessarily need total cessation of activity; it needs a change of pace to restore the energy required for Deep work. To integrate rest into a high-performance system, follow these four principles:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Focus on significant goals:&lt;/strong&gt; Direct your energy toward a small number of crucial targets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lead indicators:&lt;/strong&gt; Measure behaviors that drive success (e.g., hours spent in deep work).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scoreboard:&lt;/strong&gt; Maintain a visible record of wins to maintain motivation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cadence of accountability:&lt;/strong&gt; Establish a regular rhythm for reviewing performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;strong&gt;The Craftsman’s Approach to Technology&lt;/strong&gt;
Most individuals select their digital tools based on the &lt;strong&gt;Any-Benefit Principle&lt;/strong&gt;: if a tool offers any marginal advantage, they feel justified in using it. This is a trap that leads to cognitive fragmentation. &lt;strong&gt;Craftsman’s Principle&lt;/strong&gt; offers a more rigorous alternative:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;“Use a tool only if its positive impact on core goals significantly outweighs the negatives.”&lt;/p&gt;
&lt;p&gt;Consider the author Michael Lewis. His core professional goal is to write stories that change worldviews. To achieve this, his essential steps are patient, deep research and thoughtful writing. When viewed through this lens, a tool like Twitter (X) offers a marginal benefit (staying “informed”) that is dwarfed by the negative impact on his capacity for deep research.
To break your tool dependency, try a 30-day “digital fast.” Afterward, ask: Would those thirty days have been significantly better if I had been using this service? Did anyone care that I was gone? If the answer is “no,” the tool is a hindrance to your depth.&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;High-Quality Leisure: The Mind Needs Change, Not Rest&lt;/strong&gt;
Many professionals lose their focus to “vampire websites” during their off-hours because they fail to plan their leisure. As Arnold Bennett observed, the mind is not like a limb that needs to cease movement to recover:
“The mind can work without ceasing and hard; it does not tire like a hand or a foot… Everything it needs is change, not rest (excluding sleep).”
An unplanned evening creates a vacuum easily filled by shallow distractions. By structuring your free time with intentional, demanding activities—reading, complex hobbies, or deep social connection—you protect your cognitive capacity. Intentional leisure ensures that when the workday begins, your mind is refreshed and ready for high-intensity concentration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Radical Art of Ignoring Email&lt;/strong&gt;
Communication is often the greatest enemy of cognitive integrity. To maintain your depth, you must adopt the “Professor’s Principle” of radical selectivity. Choose to ignore any message that meets these criteria:&lt;/p&gt;
&lt;p&gt;It is vaguely formulated or difficult to answer directly.
The proposal is uninteresting or irrelevant to your core goals.
No positive result will come from responding, and nothing bad happens if you don’t.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Furthermore, utilize &lt;strong&gt;targeted email management&lt;/strong&gt;. Instead of a back-and-forth volley, provide a “process-centric” reply that closes the loop. Consider the common “coffee meeting” request. Instead of saying “Sure, when?” which triggers a 10-email thread, reply: “I can meet on Tuesday at 10:00 AM at the cafe on 5th Street. If that works, I’ll see you there; if not, please suggest two other times that work for you.” This makes the sender work harder and frees your mind from the “open loops” that drain attention.&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;strong&gt;Conclusion: The Courage to Be Less Busy&lt;/strong&gt;
Success in the modern era is not awarded to those who can work the longest hours or respond to the most notifications. It is reserved for those who have the courage to protect their cognitive depth. By ruthlessly rejecting the shallow, you do not just save time—you gain the energy required to create something meaningful.
Reducing superficial work is not about doing less; it is about becoming the type of professional who can produce results that are impossible in a state of constant distraction. As you look at your calendar, ask yourself: which shallow habits are you willing to sacrifice to reclaim your superpower?&lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/deep-work/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Migraine Pulse – my journey creating a personal migraine tracking app</title>
        <link>https://blog.poplauki.eu/en/blog/migraine-pulse-origin/</link>
        <description>&lt;h2&gt;Part One. How It All Started&lt;/h2&gt;
&lt;p&gt;Sometimes I suffer from migraine attacks – sometimes severe. I’d heard that keeping an attack diary was worthwhile. In 2024, after one particularly severe attack, I started writing text descriptions with dates and symptoms. In parallel, I began testing various apps where I tried to record the same events.&lt;/p&gt;
&lt;h2&gt;Why Existing Apps Didn’t Suit Me&lt;/h2&gt;
&lt;p&gt;First, what I didn’t like about existing apps – their handling of personal data was insufficiently transparent. And security was also questionable.&lt;/p&gt;
&lt;p&gt;Second, they lacked import and export capabilities for my own data. Few formats and no standards.&lt;/p&gt;
&lt;p&gt;Third, there was no flexibility to add my own attack logic. Or another resource with data I specifically needed, like magnetic storm forecasts or their history.&lt;/p&gt;
&lt;p&gt;That’s when I decided to create my own migraine diary to track symptoms. And not just that.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What I Learned Building This Project&lt;/h2&gt;
&lt;p&gt;Building this project, like building anything, I learned new technologies and tools. I tried services I hadn’t used before in work or in other personal projects.&lt;/p&gt;
&lt;p&gt;One of the first things I used was creating a frontend prototype. It remained almost unchanged.&lt;/p&gt;
&lt;p&gt;The second thing I used for brainstorming, prototype generation, and rewriting monotonous code was AI. Here I tried ChatGPT, Khoj (Gemini, Claude Sonnet), and Google Antigravity services.&lt;/p&gt;
&lt;p&gt;I made the service code – &lt;a href=&quot;https://github.com/wirtaw/migraine-tracker-monolith&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;backend&lt;/a&gt; and &lt;a href=&quot;https://github.com/wirtaw/migrane-tracker-dashboard&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;frontend&lt;/a&gt; – publicly available, because I believe everyone should have the opportunity to take it and modify it for themselves. Either to help me improve. Or to suggest and add new functionality.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What’s Coming in the Future?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I’ll add more various reports and a module that will analyze only your data and, based on them, warn about increased probability of migraine or headache.&lt;/li&gt;
&lt;li&gt;Translation into other languages – first would be Ukrainian, Lithuanian, and Polish.&lt;/li&gt;
&lt;li&gt;Gender selection and adding women’s cycles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A demo environment where you can try it out without entering much information – you can find it by following this &lt;a href=&quot;https://migrane-tracker-dashboard.sliplane.app/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The documentation page is &lt;a href=&quot;https://wirtaw.github.io/migraine-tracker-docs/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The official product of the program, which will have my personal functionality and more integrations – you can find it &lt;a href=&quot;https://migrainepulse.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-image article-image--landscape article-image--article&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/migraine-pulse-kaip-pradejau-kurti-heatmap-landscape-400w.webp&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/migraine-pulse-kaip-pradejau-kurti-heatmap-landscape-400w.jpeg&quot; /&gt;&lt;img src=&quot;https://blog.poplauki.eu/img/generated/migraine-pulse-kaip-pradejau-kurti-heatmap-landscape-400w.jpeg&quot; width=&quot;400&quot; height=&quot;267&quot; alt=&quot;Heatmap Migrain Pulse&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In future blog posts, I’ll tell you more details about each feature. Also about interesting discoveries I made building this product.&lt;/p&gt;
&lt;p&gt;Good luck and health!&lt;/p&gt;
</description>
        <pubDate>Wed, 11 Mar 2026 22:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/migraine-pulse-origin/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>How to Find Tranquility in a Turbulent World Seneca&#92;’s Stoic Strategies</title>
        <link>https://blog.poplauki.eu/en/blog/stoic-strategies-tranquility-modern-world/</link>
        <description>&lt;p&gt;We live in a world that feels like it’s constantly shouting. Between the polarized political landscape, the relentless ping of social media notifications, and the rising temperature of public discourse, “inner peace” can feel like a luxury reserved for monks on a mountaintop.&lt;/p&gt;
&lt;p&gt;But according to the Roman philosopher Seneca, tranquility isn’t about the world falling silent; it’s about finding a “smooth flow” within yourself while the storm rages outside. Based on his timeless essay &lt;a href=&quot;https://thestoicgym.substack.com/p/fifteen-ways-to-be-tranquil?publication_id=1991170&amp;amp;post_id=188890630&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;On Tranquillity of Mind&lt;/a&gt;, here is how we can reclaim our headspace in 2026.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Trap of Idleness vs. Purposeful Action&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Many people believe that peace is found in doing nothing. Seneca argues the opposite: Boredom is the enemy. When we retreat into idleness, our minds begin to eat themselves.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stay in the Game: If your main path is blocked—be it a career setback or a personal disappointment—don’t just quit. Find a different way to contribute. As Seneca says, “The services of a good citizen are never useless.”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activity with Intent: Avoid “aimless busyness.” Running in circles isn’t progress. Choose a meaningful goal and keep your eyes on it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Know Your Heavy Lifting&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A major source of our modern burnout is overcommitment. We try to carry the weight of the world, our careers, and our social feeds all at once.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Check Your Load: Before taking on a new project or emotional burden, ask: Am I stronger than this load? If the weight exceeds your capacity, you won’t find peace; you’ll find resentment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The “Sufficiency” Sweet Spot: We are obsessed with more. More followers, more money, more gear. Stoicism teaches us to aim for enough. Simplicity isn’t about deprivation; it’s about the freedom that comes from not needing to guard a mountain of “stuff.”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Curate Your Circle (And Your Feed)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Negativity is contagious. Seneca warns that “mixing what is healthy with what is sick” breeds disease—and that applies to your social circle.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Selective Friendship: You don’t need perfect friends, but you should avoid those who “delight in misery.” If your inner circle (or your digital feed) is a constant source of gloom, your tranquility doesn’t stand a chance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ignore the Gallery: Public opinion is a fickle beast. If you live your life based on what “they” think, you are a slave. Do what reason dictates, and let the critics shout into the void.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Building Your Psychological Armor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tranquility isn’t a stroke of luck; it’s a practiced skill. We can build resilience by changing how we perceive “bad” luck.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;Strategy&lt;/td&gt;&lt;td&gt;Stoic Principle&lt;/td&gt;&lt;td&gt;Modern Application&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Anticipation&lt;/td&gt;&lt;td&gt;Premeditatio Malorum&lt;/td&gt;&lt;td&gt;Expect things to go wrong. If you aren&#39;t surprised by a setback, it loses its power to hurt you.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Flexibility&lt;/td&gt;&lt;td&gt;Adaptability&lt;/td&gt;&lt;td&gt;Don&#39;t be rigid. If your plans change, change with them. A tree that bends in the wind doesn&#39;t snap.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Letting Go&lt;/td&gt;&lt;td&gt;Temporality&lt;/td&gt;&lt;td&gt;Remember: every human condition is temporary. This &quot;disaster&quot; will eventually be a footnote.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;The Art of the Reset&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Finally, Seneca reminds us that we aren’t machines. Authenticity is exhausting if you’re always performing.&lt;/p&gt;
&lt;p&gt;Be yourself. Trying to maintain a “perfect” persona is a fast track to mental exhaustion. Take time to walk outside, enjoy a meal without your phone, and let your mind rest. Rest isn’t an indulgence—it’s the fuel that allows you to return to the world with a “heart of courage.”
The Takeaway&lt;/p&gt;
&lt;p&gt;Your internal state is the only thing you truly own. The world might be turbulent, but your mind doesn’t have to be. By matching your actions to your abilities and keeping a flexible spirit, you can achieve that “smooth flow” Seneca promised.&lt;/p&gt;
</description>
        <pubDate>Sat, 28 Feb 2026 16:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/stoic-strategies-tranquility-modern-world/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>40 Provocative Questions for Deep Self-Reflection</title>
        <link>https://blog.poplauki.eu/en/blog/40-provocative-questions-deep-self-reflection/</link>
        <description>&lt;h2&gt;Provocative Questions for Yourself&lt;/h2&gt;
&lt;p&gt;Many of us need a good shake-up from time to time to tear ourselves away from a semi-automatic, routine state. The list of provocative questions below is sobering and allows you to look at your life from different angles, become a little more mindful, understand what is important, where opportunities are hidden, and much more. There are no single “correct” answers to them, and not all can be answered immediately. But the very search for answers will help you know yourself and your needs, reflecting on what often remains out of sight.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What will people say at your funeral? And who will be attending?&lt;/li&gt;
&lt;li&gt;Which of your habits stand between you and happiness?&lt;/li&gt;
&lt;li&gt;You are standing at the gates of heaven, and they ask you: “Why should we let you in?” How would you answer?&lt;/li&gt;
&lt;li&gt;If you lost everything today, how would you act? To whom would you turn for help? How would your actions and habits change?&lt;/li&gt;
&lt;li&gt;Are there people who mean a great deal to you? When was the last time you told them?&lt;/li&gt;
&lt;li&gt;What would you change in your life if you knew you would never get sick and never die?&lt;/li&gt;
&lt;li&gt;You have a million dollars, but today is the last day of your life. What do you do?&lt;/li&gt;
&lt;li&gt;How would you describe yourself in five words?&lt;/li&gt;
&lt;li&gt;What are the chances that you have already missed something important that you will regret for the rest of your life?&lt;/li&gt;
&lt;li&gt;What conclusions could be drawn from this?&lt;/li&gt;
&lt;li&gt;If you could be guaranteed to possess three skills right now, what would they be? Most importantly — why?&lt;/li&gt;
&lt;li&gt;If you could be guaranteed to get rid of three habits, which ones? How do they hinder you today and why haven’t you gotten rid of them yet?&lt;/li&gt;
&lt;li&gt;If you could relive three moments from the past, which ones? What is special about them?&lt;/li&gt;
&lt;li&gt;If you knew how to find an approach to and influence every person in the world, what would your path to success look like? What would you achieve and how?&lt;/li&gt;
&lt;li&gt;What is the first thought that comes to mind when you encounter a very difficult problem or failure?&lt;/li&gt;
&lt;li&gt;Do you believe that your anger, irritation, and rage are solely your fault?&lt;/li&gt;
&lt;li&gt;How many hobbies did you have five years ago and how many do you have now? If there is a difference, what is the reason?&lt;/li&gt;
&lt;li&gt;What are the three main events of your life? You made three key decisions and now live completely differently than you could have. Why did you do it and are you happy with the choice?&lt;/li&gt;
&lt;li&gt;What were you doing the last time you were so engaged that you lost track of time?&lt;/li&gt;
&lt;li&gt;Do you try to look for answers to life’s questions as they arise, or do you just let them go?&lt;/li&gt;
&lt;li&gt;Why are you motivated in the morning but lose motivation by evening? Conversely, what exactly were you doing when you wanted nothing in the morning but were full of enthusiasm by evening?&lt;/li&gt;
&lt;li&gt;If karma visited you, would it help or punish you? For what specifically and in what ways?&lt;/li&gt;
&lt;li&gt;What do you owe yourself?&lt;/li&gt;
&lt;li&gt;What do you owe your family and friends?&lt;/li&gt;
&lt;li&gt;When you think about the future—does it frighten or inspire you?&lt;/li&gt;
&lt;li&gt;Do you believe you should help yourself first or a person in need? In which specific cases?&lt;/li&gt;
&lt;li&gt;What makes you special?&lt;/li&gt;
&lt;li&gt;How many people do you truly love? What do you do for them and how often?&lt;/li&gt;
&lt;li&gt;Describe the best adventure of your life.&lt;/li&gt;
&lt;li&gt;Where would you like to live? Why haven’t you moved there yet?&lt;/li&gt;
&lt;li&gt;Do you believe more in logic or creative thinking?&lt;/li&gt;
&lt;li&gt;Whom do you admire and why?&lt;/li&gt;
&lt;li&gt;If you found out when and how you would die, how would your life change now?&lt;/li&gt;
&lt;li&gt;What is honor? Does it matter to you?&lt;/li&gt;
&lt;li&gt;Which is better: living ten years with excellent health or thirty years with mediocre health?&lt;/li&gt;
&lt;li&gt;If you didn’t waste any time from this moment forward, what would you achieve?&lt;/li&gt;
&lt;li&gt;Which areas of your life do you control?&lt;/li&gt;
&lt;li&gt;Are you more often inside your comfort zone or outside of it?&lt;/li&gt;
&lt;li&gt;Do you consider yourself a hero or a villain?&lt;/li&gt;
&lt;li&gt;Which scientists do you consider villains and why?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The philosopher Voltaire urged us to judge a person by the questions they ask. This is good and sound advice because through questions one can learn much: from the ability to get to the heart of things to personal priorities. Learn to ask the right questions, including to yourself—it is also a kind of art. Constantly ask yourself why something happened and how to solve a particular problem.&lt;/p&gt;
</description>
        <pubDate>Wed, 28 Jan 2026 23:29:37 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/40-provocative-questions-deep-self-reflection/</guid>
      </item>
      
    
    
    
    
      
      <item>
        <title>Modernizing Your TypeScript Project: Migrating from TSLint to ESLint (Flat Config)</title>
        <link>https://blog.poplauki.eu/en/blog/typescript-eslint-flat-config-guide/</link>
        <description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;TSLint has been &lt;a href=&quot;https://www.npmjs.com/package/tslint&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;deprecated&lt;/a&gt; for years, but many legacy projects (and their forks) still rely on it. In this post, I’ll show you how we migrated our repository to ESLint using the modern Flat Configuration, improving both performance and developer experience.&lt;/p&gt;
&lt;h2&gt;Why Migrate?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Deprecated Stack&lt;/em&gt;: TSLint no longer receives updates.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Improved Performance&lt;/em&gt;: ESLint (especially with Flat Config) is significantly faster.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Modern Ecosystem&lt;/em&gt;: Better compatibility with modern tooling (&lt;code&gt;Prettier&lt;/code&gt;, &lt;code&gt;Jest&lt;/code&gt;, &lt;code&gt;VS Code&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Stricter Type Safety&lt;/em&gt;: Catch common bugs like floating promises and unsafe type assignments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Migration Journey&lt;/h2&gt;
&lt;h3&gt;Step 1: Out with the Old&lt;/h3&gt;
&lt;p&gt;I started by clearing out the legacy TSLint packages and the &lt;code&gt;tslint.json&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; remove tslint tslint-config-prettier
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; tslint.json&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 2: In with the New&lt;/h3&gt;
&lt;p&gt;I installed the core ESLint dependencies and the new &lt;code&gt;typescript-eslint&lt;/code&gt; toolkit.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; eslint typescript-eslint globals&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 3: Configuring for the Future&lt;/h3&gt;
&lt;p&gt;The new &lt;code&gt;eslint.config.mjs&lt;/code&gt; setup is much cleaner and more modular. Here’s a snippet of our final configuration: &lt;a href=&quot;https://github.com/wirtaw/fastify-api-typescript-boilerplate/blob/master/eslint.config.mjs&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Link&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Step 4: Fixing the Fun Stuff&lt;/h3&gt;
&lt;p&gt;The migration revealed several hidden issues in our codebase:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Floating Promises&lt;/em&gt;: Discovered several unawaited calls that could cause race conditions.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Type Safety&lt;/em&gt;: Tightened up areas where &lt;code&gt;any&lt;/code&gt; was being used loosely.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Results&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[*] &lt;em&gt;Faster linting&lt;/em&gt;: Noticeably faster.&lt;/li&gt;
&lt;li&gt;[*] &lt;em&gt;Better DX&lt;/em&gt;: Integrated seamlessly with our IDEs.&lt;/li&gt;
&lt;li&gt;[*] &lt;em&gt;Cleaner Code&lt;/em&gt;: Caught several bugs that TSLint missed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Don’t wait! Migrating to ESLint is an investment in your project’s long-term health. The Flat Config system makes the setup more intuitive than ever.&lt;/p&gt;
&lt;p&gt;Follow my journey at &lt;a href=&quot;https://github.com/wirtaw/fastify-api-typescript-boilerplate&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Fastify API with TypeScript&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 25 Jan 2026 14:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/typescript-eslint-flat-config-guide/</guid>
      </item>
      
    
    
      
      <item>
        <title>OWASP in practice — auditing my NestJS monolith</title>
        <link>https://blog.poplauki.eu/en/blog/migraine-tracking-nestjs-owasp-audit/</link>
        <description>&lt;p&gt;Here is base checklist to analyse:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Authentication &amp;amp; Session Management&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;JWT Strategy&lt;/em&gt;: Verify that JwtStrategy correctly extracts the &lt;code&gt;Bearer&lt;/code&gt; token from the request headers and validates the sub (user ID) against your database.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Secret Key Management&lt;/em&gt;: Ensure that &lt;code&gt;JWT_SECRET&lt;/code&gt; and &lt;code&gt;SUPABASE_JWT_SECRET&lt;/code&gt; are not hardcoded but are managed via secure environment variables in your deployment environment.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Token Expiration&lt;/em&gt;: Confirm that JWTs have a reasonable expiration time set in your AuthConfig to minimize the window for token misuse if compromised.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Supabase Integration&lt;/em&gt;: Since you use Supabase for auth, ensure your SupabaseService properly handles the &lt;code&gt;AUTH_CLIENT_OPTIONS&lt;/code&gt; and that the service role key is never exposed to the client.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Authorization (RBAC &amp;amp; Ownership)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;RBAC Guard Logic&lt;/em&gt;: Audit &lt;code&gt;RbacGuard&lt;/code&gt; to ensure it correctly checks both roles and permissions metadata before granting access to controllers.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ownership Checks&lt;/em&gt;: In &lt;code&gt;IncidentsService&lt;/code&gt;, you have logic to check if a user owns an incident before they can update or delete it. Ensure this “Ownership Guard” pattern is consistently applied across all services (e.g., &lt;code&gt;Symptoms&lt;/code&gt;, &lt;code&gt;Medications&lt;/code&gt;, &lt;code&gt;Triggers&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Public Decorator&lt;/em&gt;: Check all routes marked with &lt;code&gt;@Public()&lt;/code&gt; to ensure they are intended to be accessible without authentication.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Data Protection &amp;amp; Encryption&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Symmetric Encryption&lt;/em&gt;: Your SymmetricKeyService uses &lt;code&gt;aes-256-cbc&lt;/code&gt; for encryption. Verify that:&lt;/p&gt;
&lt;p&gt;- The &lt;code&gt;ENCRYPTION_KEY&lt;/code&gt; is exactly 32 bytes.&lt;/p&gt;
&lt;p&gt;- The Initialization Vector (IV) is unique for every encryption operation to prevent pattern matching.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hashing&lt;/em&gt;: Your IncidentsService uses &lt;code&gt;createHash(&#39;sha256&#39;)&lt;/code&gt;. While SHA-256 is fast, ensure it is being used for data integrity and not for password storage (which Supabase handles).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Exception Filters&lt;/em&gt;: Your &lt;code&gt;AllExceptionsFilter&lt;/code&gt; is designed to catch all errors. Ensure that in production mode, it does not leak internal stack traces or database query details to the end-user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Input Validation &amp;amp; API Security&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Global Validation Pipe&lt;/em&gt;: Ensure main.ts has &lt;code&gt;app.useGlobalPipes(new ValidationPipe({ whitelist: true }))&lt;/code&gt; enabled to strip any properties from the request body that are not defined in your DTOs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CORS Configuration&lt;/em&gt;: Review the CORS settings in &lt;code&gt;main.ts&lt;/code&gt;. Ensure that only your dashboard domain (https://migrainepulse.com) is allowed in production, rather than using *.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Helmet/Security Headers&lt;/em&gt;: Check if helmet is implemented in main.ts to set security-related HTTP headers (e.g., &lt;code&gt;X-Content-Type-Options&lt;/code&gt;, &lt;code&gt;X-Frame-Options&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Infrastructure &amp;amp; Deployment&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Environment Isolation&lt;/em&gt;: Confirm that env/.env.example is the only environment file in your repository and that actual .env files are ignored by git.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Database Connectivity&lt;/em&gt;: Ensure your Mongoose connection uses TLS/SSL when connecting to your production MongoDB instance.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Dependency Audit&lt;/em&gt;: Regularly run pnpm audit to check for known vulnerabilities in your project’s dependencies.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CI/CD Secrets&lt;/em&gt;: Verify that secrets like &lt;code&gt;SLIPLANE_API_KEY&lt;/code&gt; used in your GitHub Actions are stored as encrypted repository secrets and not in plain text.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Wed, 21 Jan 2026 20:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/migraine-tracking-nestjs-owasp-audit/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>The Power of Not Having an Opinion Online</title>
        <link>https://blog.poplauki.eu/en/blog/power-of-not-having-an-online-opinion/</link>
        <description>&lt;p&gt;You don’t have to have an opinion about everything on the internet.
Some things are simply none of your business.&lt;/p&gt;
&lt;p&gt;In today’s hyper-connected world, we feel pressured to weigh in on every trending topic. However, true digital freedom comes from realizing that your silence is just as valuable as your voice. Protect your peace by choosing what deserves your energy and what doesn’t.&lt;/p&gt;
</description>
        <pubDate>Sat, 27 Dec 2025 16:02:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/power-of-not-having-an-online-opinion/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>9 Behavioral Signs of Truly Promising People</title>
        <link>https://blog.poplauki.eu/en/blog/9-behavioral-signs-of-truly-promising-people/</link>
        <description>&lt;p&gt;The importance of your &lt;strong&gt;social circle&lt;/strong&gt; is obvious. However, how to find &lt;strong&gt;valuable&lt;/strong&gt; or &lt;strong&gt;promising people&lt;/strong&gt; is an open question. Here is a selection of telling behavioral signs.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;They are not dragged down by their environment or desires.&lt;/strong&gt; They are independent and know how to decline, reasonably adhering to their priorities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;They don’t chase the crowd.&lt;/strong&gt; They look at things a little differently. They respect the concept of &lt;strong&gt;“individuality.”&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;They are not afraid to ask questions.&lt;/strong&gt; They fuel their curiosity and are open to discussion. They don’t aggressively try to impose their views as the only correct ones.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;They don’t participate in small talk and meaningless chatter.&lt;/strong&gt; They don’t care what someone is cooking for dinner, who is dating whom, what someone wore, or what a celebrity said.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;They prefer solitude to big parties.&lt;/strong&gt; They understand the difference between false satisfaction and true pleasure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;They are easily irritated by stupid, aggressively insistent, and toxic people.&lt;/strong&gt; They avoid such people at all costs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;They know how to explain things easily and clearly.&lt;/strong&gt; They are expressive with their ideas and can make sketches and diagrams if needed for clarification.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;They avoid superficial knowledge.&lt;/strong&gt; They study things from different angles and genuinely enjoy unfamiliar, alternative points of view.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you stumble upon someone who fits the description of at least 2-3 points, that is the person you need. Their company will help you achieve success faster. Accordingly, the more such people in your environment, the better.&lt;/p&gt;
</description>
        <pubDate>Wed, 29 Oct 2025 20:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/9-behavioral-signs-of-truly-promising-people/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Why You&#39;re Stuck: 7 Reasons to Stop and Start Moving</title>
        <link>https://blog.poplauki.eu/en/blog/why-youre-stuck-personal-growth/</link>
        <description>&lt;p&gt;Each of us has certainly had a moment in life when we felt like we were standing still. We dream of great things, we make plans, but for some reason, reality doesn’t keep up with our ambitions. This article isn’t meant to demotivate you, but to shed light on uncomfortable truths that may be the key to unlocking your true potential. Prepare to confront the seven reasons that may be the source of your lack of progress. Ready for an honest conversation with yourself?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;You haven’t lost enough.&lt;/em&gt; You’re too comfy in your average life and don’t even try. You talk about learning new things instead of actually doing them.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;You care too much what others think.&lt;/em&gt; You adjust yourself to fit in, focusing on what you own instead of what you do.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;You think you’re smarter than you are.&lt;/em&gt; You’ve just learned the same stuff as everyone else to pass tests, but real knowledge comes from real life.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;You don’t read.&lt;/em&gt; You only read what you have to, or nothing at all. You’d rather watch TV than learn something new or understand different perspectives.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;You’re not curious.&lt;/em&gt; You just soak up whatever news is spoon-fed to you, never questioning anything or digging deeper.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;You don’t ask questions.&lt;/em&gt; You don’t challenge authority or even yourself. You just survive in monotony.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The truth pisses you off.&lt;/em&gt; You’re living with your head in the clouds, ignoring reality, and you’re probably annoyed by this article right now. You’re the only one stopping yourself from doing awesome stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By &lt;a href=&quot;https://raymmar.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Raymmar Tirado&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What dou You think about these reasons?&lt;/p&gt;
</description>
        <pubDate>Thu, 25 Sep 2025 19:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/why-youre-stuck-personal-growth/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Fixing JNLP `libnsl.so.1` Error on Fedora Linux</title>
        <link>https://blog.poplauki.eu/en/blog/fedora-jnlp-libnsl-fix/</link>
        <description>&lt;p&gt;When attempting to launch Java Web Start (JNLP) applications on recent Fedora Linux installations, experienced users may encounter a &lt;code&gt;javaws&lt;/code&gt; execution error similar to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;javaws: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This issue typically arises because the &lt;code&gt;libnsl&lt;/code&gt; (Network Services Library) package, while crucial for some legacy Java applications or specific JDK components, is no longer a default dependency or is deprecated in its traditional form on modern Linux distributions like Fedora. Consequently, a clean JDK installation might not include this library by default.&lt;/p&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;The resolution is straightforward: explicitly install the &lt;code&gt;libnsl&lt;/code&gt; package using DNF.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install &lt;code&gt;libnsl&lt;/code&gt;:&lt;/strong&gt;
Execute the following command in your terminal:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; libnsl&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rerun Your JNLP Application:&lt;/strong&gt;
After the &lt;code&gt;libnsl&lt;/code&gt; package is installed, retry launching your &lt;code&gt;.jnlp&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;javaws start.jnlp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The application should now execute without the &lt;code&gt;libnsl.so.1&lt;/code&gt; error.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Context and Explanation&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;libnsl&lt;/code&gt; library historically provided an interface for network services, including functionalities related to NIS (Network Information Service). While its direct role has diminished in modern system architectures, certain older applications, or specific implementations within the Java Development Kit (JDK), might still carry dependencies on it. When these applications are invoked on systems where &lt;code&gt;libnsl&lt;/code&gt; is not present, the &lt;code&gt;javaws&lt;/code&gt; binary (part of the JDK) fails to load due to the missing shared object. Manually installing it ensures all necessary dependencies are met for legacy Java Web Start applications to function correctly.&lt;/p&gt;
&lt;p&gt;This fix is applicable across various Fedora versions where this dependency omission might occur, ensuring smooth operation of JNLP applications for those requiring them.&lt;/p&gt;
</description>
        <pubDate>Thu, 03 Jul 2025 08:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/fedora-jnlp-libnsl-fix/</guid>
      </item>
      
    
    
      
      <item>
        <title>Helpful Fedora Resources: Manage Your Linux System with Ease</title>
        <link>https://blog.poplauki.eu/en/blog/list-fedora-useful-links/</link>
        <description>&lt;p&gt;Welcome to our comprehensive collection of helpful resources designed to make managing your Fedora Linux system straightforward and efficient. Whether you’re a new user looking for installation guidance or an experienced administrator seeking advanced tips, this page offers a curated selection of articles, tutorials, and tools. Dive in to learn how to master package management, configure your desktop, troubleshoot common issues, and unlock the full potential of your Fedora workstation or server. We aim to equip you with the knowledge and resources necessary to confidently navigate and optimize your Fedora experience.&lt;/p&gt;
&lt;p&gt;List of the Fedora links:&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.poplauki.eu/en/blog/fix-dnf-transaction-failed/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Fix Fedora “Transaction Failed” Updates: Beginner’s Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.poplauki.eu/en/blog/fedora-jnlp-libnsl-fix/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Fixing JNLP &lt;code&gt;libnsl.so.1&lt;/code&gt; Error on Fedora Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 01 Jul 2025 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/list-fedora-useful-links/</guid>
      </item>
      
    
    
      
      <item>
        <title>Fix Fedora &quot;Transaction Failed&quot; Updates: Beginner&#39;s Guide</title>
        <link>https://blog.poplauki.eu/en/blog/fix-dnf-transaction-failed/</link>
        <description>&lt;p&gt;So, you’re updating your Fedora Linux system, and suddenly, DNF throws a “Transaction failed” error, specifically mentioning file conflicts like those pesky VLC plugins. Don’t sweat it! This article is your friendly guide to understanding and fixing these common update problems, even if you’re new to Linux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;  Your Fedora update failed with a message similar to:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;Transaction failed&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Rpm transaction failed&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
 &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; file &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;usr&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;lib64&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;vlc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;plugins&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;codec&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;libfaad_plugin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;so from install &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; vlc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;plugins&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;base&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3.0&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;.21&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fc41&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x86_64 conflicts &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; file from &lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; vlc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;plugins&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;freeworld&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3.0&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;.21&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fc41&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x86_64&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Understanding the Error:&lt;/strong&gt; This error indicates that two different packages are trying to install the exact same file (&lt;code&gt;/usr/lib64/vlc/plugins/codec/libfaad_plugin.so&lt;/code&gt;) on your system.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vlc-plugins-base&lt;/code&gt;: This is likely the official Fedora package for basic VLC plugins.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vlc-plugins-freeworld&lt;/code&gt;: This package is almost certainly from the RPM Fusion Free repository, which provides multimedia codecs and other software not included in Fedora due to licensing restrictions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The conflict arises because both packages contain &lt;code&gt;libfaad_plugin.so&lt;/code&gt;, which is a plugin for AAC audio decoding. Since RPM Fusion Free often provides more comprehensive multimedia support, it’s common to have both, leading to this conflict during updates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt;  To resolve this, you need to ensure that only &lt;em&gt;one&lt;/em&gt; version of the conflicting package (or the package providing the conflicting file) is installed. In most cases, if you’re using RPM Fusion, you’ll want to prioritize the RPM Fusion version as it often provides broader codec support.&lt;/p&gt;
&lt;h2&gt;Method 1: Directly Remove the Conflicting Fedora Package (Recommended)&lt;/h2&gt;
&lt;p&gt;This method involves removing the &lt;code&gt;vlc-plugins-base&lt;/code&gt; package, which is likely the one causing the conflict with the more feature-rich &lt;code&gt;vlc-plugins-freeworld&lt;/code&gt; from RPM Fusion.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Identify the conflicting packages:&lt;/strong&gt; The error message explicitly states them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vlc-plugins-base-1:3.0.21-24.fc41.x86_64&lt;/code&gt; (likely from Fedora’s official repositories)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vlc-plugins-freeworld-3.0.21-2.fc41.x86_64&lt;/code&gt; (from RPM Fusion)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remove the&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;vlc-plugins-base&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;package:&lt;/strong&gt; Since &lt;code&gt;vlc-plugins-freeworld&lt;/code&gt; is intended to provide the necessary VLC plugins (and often supersedes &lt;code&gt;vlc-plugins-base&lt;/code&gt; in functionality), we can remove the &lt;code&gt;vlc-plugins-base&lt;/code&gt; package directly. DNF should handle the dependencies by letting &lt;code&gt;vlc-plugins-freeworld&lt;/code&gt; take over.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;sudo dnf remove vlc&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;plugins&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;base&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What to expect:&lt;/strong&gt;  DNF will list the &lt;code&gt;vlc-plugins-base&lt;/code&gt; package for removal. It might also show that &lt;code&gt;vlc&lt;/code&gt; (the main VLC player package) might be re-evaluated to depend on &lt;code&gt;vlc-plugins-freeworld&lt;/code&gt; if it doesn’t already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Review the output carefully.&lt;/strong&gt;  Ensure it’s only removing &lt;code&gt;vlc-plugins-base&lt;/code&gt; and potentially adjusting VLC’s dependencies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;If prompted, type&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;y&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;and press Enter&lt;/strong&gt; to confirm the removal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;Clean DNF metadata (optional but recommended):&lt;/strong&gt; After removing packages, it’s good practice to clean DNF’s cache.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;sudo dnf clean all&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retry the system update:&lt;/strong&gt; Now that the problematic &lt;code&gt;vlc-plugins-base&lt;/code&gt; package is removed, try the system update again.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;sudo dnf update &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;refresh&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This should now complete successfully.&lt;/p&gt;
&lt;h2&gt;Method 2: Reinstalling VLC to Ensure RPM Fusion Dominance&lt;/h2&gt;
&lt;p&gt;If Method 1 doesn’t fully resolve it, or if you want to ensure VLC is entirely sourced from RPM Fusion, you can reinstall it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remove all VLC-related packages:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This will remove both the Fedora and RPM Fusion versions of VLC and its plugins.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;sudo dnf remove &lt;span class=&quot;token string&quot;&gt;&#39;vlc*&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Review the list carefully! Make sure you’re not removing anything critical that you don’t intend to.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clean DNF metadata:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;sudo dnf clean all&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install VLC (it should pull from RPM Fusion if enabled):&lt;/strong&gt; If RPM Fusion Free is correctly enabled, &lt;code&gt;dnf install vlc&lt;/code&gt; should pull the RPM Fusion version of &lt;code&gt;vlc&lt;/code&gt; and its associated &lt;code&gt;vlc-plugins-freeworld&lt;/code&gt; by default, as RPM Fusion packages often have higher priority or specific dependencies.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;sudo dnf install vlc&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Verify during installation:&lt;/strong&gt;  DNF should indicate that it’s installing &lt;code&gt;vlc&lt;/code&gt; and &lt;code&gt;vlc-plugins-freeworld&lt;/code&gt;. Look at the “From repo” column in the transaction summary to confirm the packages are coming from &lt;code&gt;rpmfusion-free&lt;/code&gt; or &lt;code&gt;rpmfusion-free-updates&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retry the system update:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;sudo dnf update &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;refresh&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Summary:&lt;/h2&gt;
&lt;p&gt;Now you’re ready to tackle “Transaction failed” messages like a pro! This guide walked you through solving common dnf update problems in Fedora Linux, giving you the confidence to maintain your system with ease.&lt;/p&gt;
</description>
        <pubDate>Tue, 01 Jul 2025 08:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/fix-dnf-transaction-failed/</guid>
      </item>
      
    
    
    
    
    
    
    
    
      
      <item>
        <title>Helpful Resources to Learn JavaScript on GitHub</title>
        <link>https://blog.poplauki.eu/en/blog/list-js-useful-links/</link>
        <description>&lt;p&gt;Welcome to me curated list of excellent GitHub repositories that can help you learn JavaScript, from the very basics to advanced concepts. GitHub is a treasure trove of learning materials, code examples, and interactive projects.&lt;/p&gt;
&lt;p&gt;List of the JavaScript links:&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sorrycc/awesome-javascript&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Awesome JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/getify/You-Dont-Know-JS&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;You-Dont-Know-JS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/denysdovhan/wtfjs&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Wtfjs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mbeaudru/modern-js-cheatsheet&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Modern JS Cheatsheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/HowProgrammingWorks/Book/blob/master/content/en/Index.md&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;HowProgrammingWorks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/trekhleb/javascript-algorithms&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;JavaScript Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ryanmcdermott/clean-code-javascript&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;clean-code-javascript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sindresorhus/awesome-npm&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Awesome npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tc39&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Ecma International, Technical Committee 39 – ECMAScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 29 Jun 2025 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/list-js-useful-links/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Unmasking Neuroticism: 5 Traps to Recognize in Yourself &amp; Others</title>
        <link>https://blog.poplauki.eu/en/blog/understanding-the-5-traps-of-neuroticism/</link>
        <description>&lt;p&gt;Have you ever felt a persistent unease, a gnawing feeling that something isn’t quite right, even when outwardly everything seems fine? Or perhaps you’ve observed patterns in others that just don’t add up? It’s possible you’re encountering the subtle, yet powerful, influence of neuroticism.&lt;/p&gt;
&lt;p&gt;Neuroticism, at its core, is often a consequence of unresolved inner conflicts. It’s a complex psychological landscape where our internal struggles project outwards, sometimes twisting our perceptions and interactions in unexpected ways. Today, we’re going to explore five common “traps” that individuals prone to neurotic patterns often fall into, and crucially, how to recognize them in yourself or those around you.&lt;/p&gt;
&lt;h2&gt;1. The Claim to Love: When Connection Becomes a Crutch&lt;/h2&gt;
&lt;p&gt;We all seek love and connection, but for a neurotic individual, the very definition of love can become distorted. What might be labeled as “love” is often something else entirely – a desperate need, a parasitic reliance, or a desire for possession.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How it manifests:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Needing others to live your life&lt;/strong&gt;: An inability to function independently, relying on another person to fulfill basic needs or provide a sense of purpose. It’s not about shared life, but a fundamental inability to live one’s own life.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Parasitic existence&lt;/strong&gt;: Depending on someone else to meet your needs because you’re unable or unwilling to satisfy them yourself. This isn’t mutual support; it’s a one-sided drain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Possession for prestige&lt;/strong&gt;: A desire to “own” another, especially if that person holds significant power, prestige, or wealth. The perceived “love” is less about the individual and more about what they represent for your own self-importance.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Understanding the impact&lt;/strong&gt;: This trap leads to relationships built on unstable foundations, often causing immense strain and dissatisfaction for both parties. It’s a love that suffocates rather than liberates.&lt;/p&gt;
&lt;h2&gt;2. The Claim to Kindness: Submissiveness Masquerading as Virtue&lt;/h2&gt;
&lt;p&gt;Kindness is a beautiful trait, but like love, it can be misconstrued within a neurotic framework. Here, what appears as “kindness” can actually be a deep-seated submissiveness, a suppression of genuine feelings driven by fear.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How it manifests&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suppressed aggression&lt;/strong&gt;: Rather than expressing legitimate anger or frustration, a neurotic individual might repress these aggressive impulses out of an overwhelming fear of judgment or rejection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Obsequious behavior&lt;/strong&gt;: An excessive desire to please, even at personal cost, not out of true altruism but from a desperate need for approval. This isn’t genuine empathy; it’s a strategic move to avoid disapproval.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Understanding the impact&lt;/strong&gt;: This trap prevents authentic self-expression and can lead to resentment brewing beneath a facade of niceness. It also makes it difficult for others to truly connect, as the kindness feels more like a performance than a heartfelt gesture.&lt;/p&gt;
&lt;h2&gt;3. The Claim to Omniscient Interest: When Intellect Dominates Emotion&lt;/h2&gt;
&lt;p&gt;For some neurotic individuals, particularly those disconnected from their feelings and emotions, there’s a strong belief that everything can be solved through pure reason. This often translates into a facade of knowing everything or being intensely interested in a wide array of topics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How it manifests&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Over-reliance on intellect&lt;/strong&gt;: A conviction that logical analysis can resolve all problems, often dismissing the role of emotions, intuition, or interpersonal dynamics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Profession as a shield&lt;/strong&gt;: Dedication to a profession or cause, not for its inherent value, but as a means to achieve material well-being, prestige, or power. The true motivation is hidden, even from oneself.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Surface-level engagement&lt;/strong&gt;: A broad, but often shallow, interest in many things, serving as a way to avoid deeper emotional introspection or genuine vulnerability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Understanding the impact&lt;/strong&gt;: This trap can create an emotional vacuum, leading to a life that feels intellectually rich but emotionally unfulfilling. It can also make it challenging for others to form deep connections, as genuine emotional exchange is avoided.&lt;/p&gt;
&lt;h2&gt;4. The Claim to Honesty and Justice: Aggression Dressed as Integrity&lt;/h2&gt;
&lt;p&gt;This trap is more common in aggressive neurotic types. What they present as unwavering honesty and a commitment to justice is often a thinly veiled expression of their own aggression, disguised as moral superiority.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How it manifests&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Brutal “honesty”&lt;/strong&gt;: The inability to “sugarcoat” or be tactful is presented as a virtue, but it often serves as an outlet for hostility, intended to demean or put others down rather than to offer constructive truth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“No” as a weapon&lt;/strong&gt;: Saying “no” is not an assertion of healthy boundaries or strength, but a desire to humble, suppress, or undermine others. It’s about control, not conviction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Moral grandstanding&lt;/strong&gt;: A tendency to loudly declare their own rectitude while aggressively pointing out the perceived flaws or injustices of others.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Understanding the impact&lt;/strong&gt;: This trap creates a toxic environment, eroding trust and fostering conflict. It’s not about genuine integrity; it’s about using the guise of honesty to assert dominance and express aggression.&lt;/p&gt;
&lt;h2&gt;5. The Claim to Suffering: Unconscious Motives Behind Misery&lt;/h2&gt;
&lt;p&gt;Neurotic individuals are prone to suffering, but this suffering often feels beyond their control, or at least, its true origins are obscured. To an external observer, their misfortunes might seem exaggerated or overly dramatized. However, there are often hidden motives behind this suffering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How it manifests&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A cry for attention/support&lt;/strong&gt;: Suffering can be an unconscious plea for notice, care, or validation from others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Misattributing the cause&lt;/strong&gt;: A neurotic person might believe they are suffering due to guilt, when in reality, the pain stems from not living up to an idealized self-image.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Loneliness masked as heartbreak&lt;/strong&gt;: Believing one is suffering from unrequited love, when the true underlying cause is an inability to tolerate solitude due to an internal fragmentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exaggerated drama&lt;/strong&gt;: While the pain is real to the sufferer, their description of it often appears disproportionate to the actual events, leading others to feel confused or exhausted.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Understanding the impact&lt;/strong&gt;: This trap can lead to a cycle of perpetual victimhood, where genuine self-understanding and growth are hindered by unconscious manipulation or misinterpretation of one’s own pain. It also makes it difficult for others to offer effective support, as the true needs are not being articulated.&lt;/p&gt;
&lt;h2&gt;Recognizing the Threads of Neuroticism&lt;/h2&gt;
&lt;p&gt;These five traps, while distinct, often interweave, leading to complex moral dilemmas and interpersonal challenges for the neurotic individual. They are, ultimately, consequences of unresolved internal conflicts – a person split into parts, unable to fully integrate their experiences and emotions.&lt;/p&gt;
&lt;p&gt;Understanding these patterns is the first step towards untangling them. If you recognize these traits in yourself, it’s an invitation to explore your inner landscape with curiosity and compassion. If you see them in others, it can foster a deeper understanding, allowing you to interact with greater awareness and empathy. The path to breaking free from these invisible chains begins with recognition.&lt;/p&gt;
&lt;h2&gt;Source&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/psiholog_natakoshulko/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;psiholog_natakoshulko&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 28 Jun 2025 16:18:57 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/understanding-the-5-traps-of-neuroticism/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Cynical Truths: Uncomfortable Realities About Life and Relationships</title>
        <link>https://blog.poplauki.eu/en/blog/cynical-truths/</link>
        <description>&lt;p&gt;&lt;picture class=&quot;article-image article-image--square article-image--article&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/cynical-truths-square-400w.webp&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/cynical-truths-square-400w.jpeg&quot; /&gt;&lt;img src=&quot;https://blog.poplauki.eu/img/generated/cynical-truths-square-400w.jpeg&quot; width=&quot;400&quot; height=&quot;400&quot; alt=&quot;Uncomfortable Realities About Life and Relationships&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Introduction to Cynicism&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cynicism, at its core, is a philosophy rooted in questioning societal norms and perceived truths. It’s about stripping away illusions and facing the world with a critical, often skeptical, eye. While it can be seen as pessimistic, cynicism can also be a pathway to a more authentic and self-aware existence. Cynics value virtue and reason, often rejecting conventional desires for wealth, power, and fame.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11 Cynical Truths&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;By constantly forgiving everyone, you help evil to establish itself in impunity.&lt;/strong&gt; Turning a blind eye to wrongdoing only allows it to flourish.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exaggerated point: God will not call you.&lt;/strong&gt; You are responsible for your actions and their consequences.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Life failures are a necessity.&lt;/strong&gt; They are inevitable and provide valuable lessons for growth.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Example:&lt;/em&gt; Failing a test teaches you the importance of preparation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Money, no matter how you look at it, is the main thing.&lt;/strong&gt; Financial stability often dictates opportunities and quality of life.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Even the biggest failure has an excuse.&lt;/strong&gt; People will always find a way to rationalize their shortcomings.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Example:&lt;/em&gt; Blaming a bad economy for a failed business venture.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Always say yes” is not a good rule.&lt;/strong&gt; Setting boundaries is crucial for self-preservation and prevents exploitation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You are not the first in line for the injustice of this world.&lt;/strong&gt; Suffering is a universal experience, and recognizing this can foster empathy.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Example:&lt;/em&gt; Witnessing discrimination highlights systemic inequalities.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Everyone wears masks.&lt;/strong&gt; People present different versions of themselves depending on the situation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It’s worth reviewing your friends list.&lt;/strong&gt; Not all relationships are beneficial, and some may be detrimental to your well-being.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Example:&lt;/em&gt; Cutting ties with friends who consistently bring negativity into your life.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No one thinks the same way as you.&lt;/strong&gt; Embrace individuality and understand that perspectives vary widely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every person uses you in their own way.&lt;/strong&gt; Recognizing this doesn’t have to be negative, but it’s important to be aware of the dynamics in your relationships.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Example:&lt;/em&gt; A colleague seeking your expertise to advance their own project.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These cynical truths may seem harsh, but they offer a clear-eyed perspective on the realities of life. By acknowledging these truths, you can navigate the world with greater awareness, protect yourself from manipulation, and make more informed decisions. Embracing a bit of cynicism can lead to a more authentic and resilient existence.&lt;/p&gt;
</description>
        <pubDate>Mon, 23 Jun 2025 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/cynical-truths/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>The Double-Edged Sword of Desire: Why &quot;Be Careful What You Wish For&quot; is Timeless Wisdom</title>
        <link>https://blog.poplauki.eu/en/blog/be-careful-what-you-wish-for-timeless-wisdom/</link>
        <description>&lt;p&gt;“That’s a big takeaway from history, and it leads to a realization that will always be true: Be careful what you wish for.”&lt;/p&gt;
&lt;p&gt;– “Same as Ever: A Guide to What Never Changes” &lt;a href=&quot;https://www.amazon.com/Morgan-Housel/e/B084ZNV1LR&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Morgan Housel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This powerful quote distills a truth as old as humanity itself. We often chase desires with unwavering focus, convinced that their attainment will bring ultimate happiness. Yet, history, personal experience, and profound philosophical traditions consistently reveal a paradox: getting exactly what we want can sometimes lead to unforeseen difficulties, deeper dissatisfaction, or even regret. Both Stoicism and Mindfulness offer invaluable frameworks for understanding this intricate relationship with our desires, guiding us toward a more discerning and peaceful approach to life.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Stoicism: Mastering the Inner Citadel Against External Desires&lt;/h2&gt;
&lt;p&gt;Stoicism, an ancient philosophy focused on virtue, reason, and living in harmony with nature, provides a robust framework for understanding the pitfalls of unexamined desires. Its core principle, the &lt;strong&gt;Dichotomy of Control&lt;/strong&gt;, teaches us to distinguish between what is within our power (our thoughts, judgments, and actions) and what is not (external events, other people’s opinions, health, wealth). Wishing excessively for things outside our control is, to a Stoic, a direct path to suffering.&lt;/p&gt;
&lt;p&gt;For example, consider the &lt;strong&gt;desire for fame or public recognition&lt;/strong&gt;. You might pour your energy into a creative project, dreaming of accolades and widespread appreciation. A Stoic would caution against this fervent wish. Why?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;External Dependency:&lt;/strong&gt; Fame is an external “indifferent.” It’s not inherently good or bad, and crucially, it’s not something you can control. You can create the art, but you can’t control how others react to it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vulnerability to Fortune:&lt;/strong&gt; If your peace of mind hinges on public approval, you become enslaved to the fickle whims of others. What if the project flops? What if success brings unwanted scrutiny or pressure? Seneca, a prominent Stoic, warned extensively about the dangers of seeking popularity, as it often compromises one’s integrity and inner peace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compromising Virtue:&lt;/strong&gt; The intense longing for external validation can subtly erode your commitment to virtue. You might find yourself making choices based on what’s popular rather than what’s right or authentic to your craft.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of wishing for fame, a Stoic would advise internalizing your desires: wish to &lt;strong&gt;produce your best work&lt;/strong&gt;, to &lt;strong&gt;act with integrity&lt;/strong&gt;, and to &lt;strong&gt;apply yourself diligently&lt;/strong&gt;. True satisfaction comes from the virtuous effort itself, not from the external outcome.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Mindfulness: Observing the Transient Nature of Longing&lt;/h2&gt;
&lt;p&gt;Mindfulness, deeply rooted in Buddhist traditions, emphasizes cultivating &lt;strong&gt;present moment awareness without judgment&lt;/strong&gt;. When it comes to desires, mindfulness encourages us to observe them as transient mental events, rather than immediately clinging to them or acting upon them. The problem isn’t the desire itself, but our &lt;strong&gt;attachment&lt;/strong&gt; to it and the mistaken belief that fulfilling every desire will lead to lasting happiness.&lt;/p&gt;
&lt;p&gt;Consider the &lt;strong&gt;wish for a specific career promotion&lt;/strong&gt;. You might spend countless hours dreaming about the new title, the higher salary, the perceived prestige.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Attachment to Impermanence:&lt;/strong&gt; From a mindful perspective, even if you secure the promotion, the initial elation is fleeting. New stresses, greater responsibilities, or the realization that the role isn’t what you imagined often follow. Your happiness becomes dependent on an external condition, which is inherently unstable and subject to change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffering from Non-Attainment:&lt;/strong&gt; If the promotion doesn’t materialize, your intense wish and attachment can lead to profound disappointment, anger, or a sense of failure. Your mental peace is disrupted by clinging to a future scenario that didn’t unfold as desired.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing the Present:&lt;/strong&gt; While consumed by the longing for a future promotion, you might overlook the present value of your current work, the opportunities for learning and growth in your existing role, or the simple joys of your daily life. Your mind is constantly pulled away from the richness of the “now.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A mindful approach would involve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Observing the desire:&lt;/strong&gt; Noticing the wish for promotion as a thought or feeling, without getting swept away by it. “Ah, there’s the thought about wanting that promotion.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-attachment:&lt;/strong&gt; Working diligently towards your goals, but cultivating an acceptance of whatever outcome arises. Your inherent worth isn’t tied to the promotion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus on the process:&lt;/strong&gt; Finding satisfaction in the effort, the learning, and the engagement with your current tasks, regardless of the future reward. Understanding that true contentment comes from within, not from external achievements, which are by nature impermanent.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
</description>
        <pubDate>Sun, 15 Jun 2025 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/be-careful-what-you-wish-for-timeless-wisdom/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>The Unshakeable Truth? Embracing Justification&#39;s Limits in the Face of Münchhausen</title>
        <link>https://blog.poplauki.eu/en/blog/unshakeable-truth-munchhausen-justification-limits/</link>
        <description>&lt;p&gt;Dive into the profound challenge of &lt;a href=&quot;https://en.wikipedia.org/wiki/M%C3%BCnchhausen_trilemma&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;the Münchhausen Trilemma&lt;/a&gt; and explore how we can find robust understanding even when faced with the limits of justification. This post unpacks the infinite regress, circular reasoning, and dogmatism, offering insights into practical ways to build knowledge and make decisions when absolute certainty remains elusive. Discover how embracing epistemological humility can lead to more resilient beliefs and a clearer path forward.&lt;/p&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;p&gt;Here are some clear, relatable examples for each part of the Münchhausen Trilemma:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An Endless Chain of Reasons (Infinite Regress):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Example: Imagine a child repeatedly asking “Why?” about everything.
&lt;ul&gt;
&lt;li&gt;“Why is the sky blue?”&lt;/li&gt;
&lt;li&gt;“Because of how light scatters in the atmosphere.”&lt;/li&gt;
&lt;li&gt;“Why does light scatter like that?”&lt;/li&gt;
&lt;li&gt;“Because of the wavelength of blue light and the size of air molecules.”&lt;/li&gt;
&lt;li&gt;“Why do light and molecules behave that way?”&lt;/li&gt;
&lt;li&gt;…and so on, potentially forever, without reaching an ultimate, self-evident first principle. Each answer requires another explanation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Circular Reasoning (Arguing in Circles):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Example: A classic example is the “Bible is true because it says it’s true, and it says it’s God’s word, so it must be true.”
&lt;ul&gt;
&lt;li&gt;“How do you know the Bible is true?”&lt;/li&gt;
&lt;li&gt;“Because the Bible says it’s the word of God, and God would not lie.”&lt;/li&gt;
&lt;li&gt;“How do you know God would not lie?”&lt;/li&gt;
&lt;li&gt;“Because the Bible says God is truthful.”&lt;/li&gt;
&lt;li&gt;The justification for the Bible’s truth relies on the Bible’s truth itself, creating a closed loop without external validation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make Some Unproven Assumptions (Dogmatism):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Example: Someone firmly believing that all alternative medicine is inherently fraudulent, simply because they “know” that traditional medicine is the only valid form of healing, without having researched or considered any evidence for alternative practices.
&lt;ul&gt;
&lt;li&gt;“I refuse to even consider acupuncture; it’s just quackery.”&lt;/li&gt;
&lt;li&gt;“But have you seen any studies on its effectiveness for pain relief?”&lt;/li&gt;
&lt;li&gt;“Doesn’t matter. It’s not ‘real’ medicine, and I don’t need evidence to know that.”&lt;/li&gt;
&lt;li&gt;This person stops the chain of justification by declaring a certain premise (only traditional medicine is valid) as a self-evident truth, not requiring any further proof or inquiry.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, how do we operate in the face of these seemingly intractable challenges? The key lies not in overcoming the trilemma in an absolute sense, but in understanding its implications and adopting more pragmatic and resilient approaches to justification. For the infinite regress, we learn to accept “sufficient justification” for a given context, often relying on widely accepted scientific consensus, practical utility, or community agreement as a temporary bedrock. To counter circular reasoning, we must cultivate a rigorous commitment to external validation, constantly seeking independent evidence or different perspectives to break the self-referential loop. Finally, to avoid falling into dogmatism, we embrace intellectual humility, remaining open to new evidence, challenging our own assumptions, and critically evaluating the foundations of our beliefs, even those we hold dear.&lt;/p&gt;
&lt;h2&gt;Summary:&lt;/h2&gt;
&lt;p&gt;This post boldly tackles the Münchhausen Trilemma, a foundational challenge to how we justify knowledge. We unpack its three inescapable paths: the infinite regress of reasons, the pitfalls of circular reasoning, and the rigid stance of dogmatism, illustrating each with clear, relatable examples. Rather than seeking an impossible absolute truth, the article proposes a practical framework for navigating these epistemological hurdles. It advocates for embracing “sufficient justification” within specific contexts, actively seeking external validation to break circular logic, and cultivating intellectual humility to guard against unproven assumptions. Ultimately, this piece empowers readers to build more resilient beliefs and make informed decisions by understanding and intelligently operating within the inherent limits of human justification.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Links:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://philosophorsuni.substack.com/p/in-plain-english-munchhausen-trilemma&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;In Plain English: Münchhausen Trilemma&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.thecollector.com/what-is-munchausen-trilemma/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;What Is Munchausen’s Trilemma?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 08 Jun 2025 13:18:57 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/unshakeable-truth-munchhausen-justification-limits/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>The Spectrum of Motivation: Material and Non-Material Drivers</title>
        <link>https://blog.poplauki.eu/en/blog/the-spectrum-of-motivation/</link>
        <description>&lt;p&gt;What truly drives us to be productive? It’s rarely just about the paycheck. This diagram breaks down the core elements of motivation, revealing the spectrum from tangible rewards to intangible drivers that influence our engagement and output. Let’s explore the key categories:&lt;/p&gt;
&lt;img src=&quot;https://s3.g.s4.mega.io/ckcmkjmaqedml3aiyva3m3o2rbwu4mbvztutq/poplauki/blog/the-spectrum-of-motivation.svg&quot; alt=&quot;The Spectrum of Motivation&quot; /&gt;</description>
        <pubDate>Thu, 15 May 2025 20:18:57 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/the-spectrum-of-motivation/</guid>
      </item>
      
    
    
    
    
    
    
    
    
      
      <item>
        <title>Stop Wishing, Start Doing: Stoic Quotes to Ignite Action and Focus</title>
        <link>https://blog.poplauki.eu/en/blog/stop-wishing-start-doing-stoic/</link>
        <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You don’t need more time, you need less distractions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You don’t need motivation, you need self-control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You don’t need more resources, you need resourcefulness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You don’t need luck, you need preparation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You don’t need to be busy, you need to be focused.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You don’t need to know everything, you just need to start.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You have everything you need.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 11 May 2025 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/stop-wishing-start-doing-stoic/</guid>
      </item>
      
    
    
    
    
      
      <item>
        <title>How to Stop Comparing Yourself to Others and Find Your Own Path: Philosophical Reflections on the Meaning of Life</title>
        <link>https://blog.poplauki.eu/en/blog/stop-comparing-find-your-path/</link>
        <description>&lt;p&gt;Comparing ourselves to others is a habit instilled in us from early childhood. We learn to see ourselves through the eyes of others, to be the object of someone’s assessment, to strive to meet external expectations. This is how a meaningless race begins, in which we lose ourselves.&lt;/p&gt;
&lt;p&gt;But it’s worth asking: is there a final goal in this race? Can we truly find fulfillment by trying to catch up to others’ successes, changing ourselves according to someone else’s standards?&lt;/p&gt;
&lt;p&gt;We are rarely taught to follow the path of our own soul, to seek the unique within ourselves, to be in agreement with ourselves. How often do we allow the external world to become our guide, forgetting that true freedom is not the right to be like everyone else, but the right to be oneself?&lt;/p&gt;
&lt;p&gt;Victory can only be called genuine when it is the result of an internal choice, a response from the heart, a movement of our own will. Only by stepping beyond imposed stereotypes can we begin to live our real life, and not just play a social role.&lt;/p&gt;
&lt;p&gt;Everything else is just an attempt to stay afloat on the surface of familiar scenarios, never allowing ourselves the question: “Who am I, really?”&lt;/p&gt;
&lt;p&gt;If you want to move closer to your essence, try taking a step:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live from the inside out, not the outside in.&lt;/li&gt;
&lt;li&gt;Allow yourself to be responsible for your feelings and decisions.&lt;/li&gt;
&lt;li&gt;Give up comparison and competition—choose exploration and acceptance.&lt;/li&gt;
&lt;li&gt;Don’t explain yourself to the world—the world needs your presence, not your report.&lt;/li&gt;
&lt;li&gt;Work thoughtfully, not by exhausting yourself.&lt;/li&gt;
&lt;li&gt;Awaken your creative power; allow it to lead.&lt;/li&gt;
&lt;li&gt;Fill every action with meaning and attention.&lt;/li&gt;
&lt;li&gt;Allow yourself to create the meaning of your life—don’t look for a ready-made one, but give birth to your own.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 30 Dec 2024 21:10:49 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/stop-comparing-find-your-path/</guid>
      </item>
      
    
    
      
      <item>
        <title>Implementing Web Speech API: Advanced Text-to-Speech with SpeechSynthesisUtterance in JavaScript</title>
        <link>https://blog.poplauki.eu/en/blog/web-speech-api-text-to-speech-javascript/</link>
        <description>&lt;p&gt;This article details the process of converting text to speech using the &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; API in JavaScript. This robust API provides granular control over the voice, pitch, and rate of synthesized speech, making it an optimal choice for developing accessible web applications and enhancing user engagement.&lt;/p&gt;
&lt;h2&gt;Introduction: Leveraging the Web Speech API for Text-to-Speech&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; API serves as a fundamental component of the Web Speech API, designed to convert textual content into spoken audio within web applications. This API offers comprehensive control over the voice characteristics, including pitch and rate, enabling developers to create accessible and highly engaging user experiences.&lt;/p&gt;
&lt;h2&gt;Core Functionality: Understanding &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; object represents a speech request and is the primary interface for configuring synthesized speech. Its constructor accepts a string, which is the text to be spoken.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; utterance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SpeechSynthesisUtterance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Text to be spoken.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Key properties of the &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; object allow for granular control over the output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;text&lt;/code&gt;: The string of text that the &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; will synthesize.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;lang:&lt;/code&gt; The language of the utterance, specified as a BCP 47 language tag (e.g., &lt;code&gt;en-US&lt;/code&gt;, &lt;code&gt;es-ES&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;voice&lt;/code&gt;: A &lt;code&gt;SpeechSynthesisVoice&lt;/code&gt; object that defines the voice to be used. If not specified, the browser will use its default voice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;pitch&lt;/code&gt;: The pitch of the voice. A value between 0 (lowest) and 2 (highest), with 1 being the default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rate&lt;/code&gt;: The speed at which the utterance is spoken. A value between 0.1 (slowest) and 10 (fastest), with 1 being the default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;volume&lt;/code&gt;: The volume of the utterance. A value between 0 (silent) and 1 (loudest), with 1 being the default.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Speech operations are managed by the window.speechSynthesis interface, which provides methods such as speak(), pause(), resume(), and cancel().&lt;/p&gt;
&lt;h2&gt;Practical Implementation: Basic Text-to-Speech&lt;/h2&gt;
&lt;p&gt;The following example illustrates a basic implementation of the SpeechSynthesisUtterance API to synthesize the text ‘Hello, world!’ into spoken audio:
JavaScript&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; utterance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SpeechSynthesisUtterance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Hello, world!&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
utterance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pitch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Sets the pitch to 1.5 (range 0 to 2)&lt;/span&gt;
utterance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Sets the speech rate to 1.2 (range 0.1 to 10)&lt;/span&gt;

window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;speechSynthesis&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;speak&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;utterance&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For comprehensive documentation regarding the SpeechSynthesisUtterance API, consult the official MDN Web Docs: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Managing Voices: Asynchronous Loading and Selection&lt;/h2&gt;
&lt;p&gt;In recent Chrome versions, the window.speechSynthesis.getVoices() method may initially return an empty array upon page load. This behavior occurs because Chrome asynchronously fetches the list of available voices from its servers. To ensure voices are populated prior to text synthesis, it is imperative to implement a callback mechanism that awaits the completion of voice loading. The following code snippet demonstrates this approach:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;speechSynthesis&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onvoiceschanged&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; voices &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;speechSynthesis&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getVoices&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Available voices loaded:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; voices&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Example: Selecting a specific voice&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// const desiredVoice = voices.find(voice =&gt; voice.name === &#39;Google US English&#39;);&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// if (desiredVoice) {&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//   utterance.voice = desiredVoice;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// }&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This code snippet utilizes the &lt;code&gt;onvoiceschanged&lt;/code&gt; event to ensure the &lt;code&gt;voices&lt;/code&gt; array is populated before attempting to access or select a specific voice for text-to-speech operations. The &lt;code&gt;voices&lt;/code&gt; array can then be iterated to identify and assign the desired voice to the &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; instance.&lt;/p&gt;
&lt;h2&gt;Advanced Use Cases and Considerations&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; API facilitates a wide range of advanced web application features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accessibility Enhancements:&lt;/strong&gt; The &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; API can be leveraged to provide auditory feedback for user interactions, guiding users through intricate processes or conveying critical notifications, thereby enhancing accessibility for individuals with visual impairments or cognitive disabilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Interactive User Interfaces:&lt;/strong&gt; Implement voice-controlled interfaces, enabling users to navigate web pages, select options, and execute commands through spoken input, fostering a hands-free or alternative interaction paradigm.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Educational Platform Integration:&lt;/strong&gt; Convert static, text-based educational content into dynamic audio lectures, thereby broadening accessibility and diversifying learning modalities for various demographics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Personalized User Experiences:&lt;/strong&gt; Customize the vocal characteristics and stylistic attributes of the synthesized speech to align with specific brand identities or user preferences, thereby creating highly differentiated and engaging web applications.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Browser Compatibility and Asynchronous Voice Loading&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; API is widely supported across modern web browsers. Below is an overview of its compatibility status:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome: Fully supported from version 4 and up.&lt;/li&gt;
&lt;li&gt;Firefox: Fully supported from version 2 and up.&lt;/li&gt;
&lt;li&gt;Safari: Fully supported from version 3.1 and up.&lt;/li&gt;
&lt;li&gt;Edge: Fully supported from version 12 and up.&lt;/li&gt;
&lt;li&gt;Opera: Fully supported from version 10 and up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note on Voice Consistency:&lt;/strong&gt; It is important for developers to be aware that the availability and quality of synthesized voices can vary significantly across different browsers and operating systems. This necessitates robust testing across target environments and potentially offering users a selection of available voices within the application.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;SpeechSynthesisUtterance&lt;/code&gt; API provides a powerful and flexible mechanism for integrating text-to-speech capabilities into web applications. By mastering its core functionalities and understanding key considerations such as asynchronous voice loading, developers can create more accessible, interactive, and engaging user experiences. Its broad browser support further solidifies its position as a valuable tool in modern web development.&lt;/p&gt;
&lt;h2&gt;Resources: Demos and Further Reading:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href=&quot;https://wirtaw.github.io/speech_synthesis/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;https://wirtaw.github.io/speech_synthesis/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MDN Web Speech API Synthesis Examples:&lt;/strong&gt; &lt;a href=&quot;https://mdn.github.io/dom-examples/web-speech-api/speak-easy-synthesis/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;https://mdn.github.io/dom-examples/web-speech-api/speak-easy-synthesis/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Smashing Magazine Article:&lt;/strong&gt; &lt;a href=&quot;https://www.smashingmagazine.com/2017/02/experimenting-with-speechsynthesis/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;https://www.smashingmagazine.com/2017/02/experimenting-with-speechsynthesis/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository Example:&lt;/strong&gt; &lt;a href=&quot;https://github.com/Drunkula/twitchtoolsglitch&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;github.com/Drunkula/twitchtoolsglitch&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 30 Dec 2024 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/web-speech-api-text-to-speech-javascript/</guid>
      </item>
      
    
    
    
    
    
    
    
    
      
      <item>
        <title>The Difference Between Being Alone and Loneliness</title>
        <link>https://blog.poplauki.eu/en/blog/the-difference-between-being-alone-and-loneliness/</link>
        <description>&lt;p&gt;Social isolation can affect your mental health if you are not used to spending time with yourself. However, even this can be adapted to and enjoyed.&lt;/p&gt;
&lt;p&gt;Many thinkers over the centuries have emphasized the importance of coming to terms with this state. Michel de Montaigne once even wrote: “The greatest thing in the world is to know how to belong to yourself.”&lt;/p&gt;
&lt;p&gt;Solitude encourages the imagination and makes it possible for serious thoughts to appear in people’s heads that go beyond the usual routine and force the convolutions to move.&lt;/p&gt;
&lt;p&gt;Loneliness, on the other hand, is a negative experience. Self-pity, thoughts of a wasted life, sadness torment. And if you are really interested in your self-development, then it does not hurt to turn this feeling into positive and constructive.&lt;/p&gt;
&lt;p&gt;The first step to being happy alone with yourself is accepting the situation. You need to ask yourself questions, turning loneliness into a constructive pastime: what do I really value in life? What do I need most? What do I need to do with…? What’s next?&lt;/p&gt;
&lt;p&gt;The second step is to keep your mind and body in constant tone. You need your body to calm your brain. You need feelings to organize your thoughts. Do not feed yourself with empty chatter and empty dramatic thoughts that only worsen the situation.&lt;/p&gt;
&lt;p&gt;You don’t have to run from anything. Instead of running away from what is, you should notice what is right under your nose. It sounds a bit complicated, but think about it.&lt;/p&gt;
&lt;p&gt;Try starting a journal and writing down thoughts about what interests you. Write poetry. Download Duolingo and delve into some new language. Start writing your autobiography or a book. Visit a virtual museum. Learn something new through YouTube or take a course that will help accelerate your career growth and expand your competence. Anything.&lt;/p&gt;
&lt;p&gt;Being happy alone with yourself is a constant striving to be better mentally, socially and emotionally for yourself and your loved ones.&lt;/p&gt;
&lt;p&gt;Today’s topic is a bit complicated, but relevant - no offense. And we will end it with a wise saying: “You cannot be lonely if you like the person you are alone with.”&lt;/p&gt;
</description>
        <pubDate>Sun, 29 Dec 2024 20:44:16 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/the-difference-between-being-alone-and-loneliness/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Finding Inner Peace in a Crazy World</title>
        <link>https://blog.poplauki.eu/en/blog/finding-inner-peace-crazy-world/</link>
        <description>&lt;p&gt;One day you stop fussing and trying to prove something to someone, you look with a smile at the world around you with all its madness, you don’t rush to please people, you don’t rush to give advice or judge or save anyone, you stop answering calls from people who haven’t admired or interested you for a long time, you look at the sky more than at who is busy with what and how they live, you remember what inspires you regardless of the circumstances, you don’t apologize, you don’t explain, you don’t argue, you don’t waste time on the uninteresting and temporary, and you discover incredible peace and many things that you didn’t notice before in the pursuit of meeting someone’s ideas or meeting someone’s expectations.  Comfort within is more precious than any temptations of temporary pleasure. More precious than any temporary people and temporary things. Everything you like is personal, and the personal belongs only to the person you see in the mirror. The rest is empty speculation and conjecture of those who are trying to see something else in you.&lt;/p&gt;
&lt;p&gt;You are your own best ally in how to be yourself and be happy in this crazy world.&lt;/p&gt;
&lt;p&gt;Source: &lt;em&gt;Tatiana Marach&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 29 Dec 2024 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/finding-inner-peace-crazy-world/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Stop Doing This: Habits That Kill Success</title>
        <link>https://blog.poplauki.eu/en/blog/habits-that-kill-success/</link>
        <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stop being a people-pleaser. It’s impossible to please everyone, and it’s stressful. It’s better to have a small circle of close contacts than many acquaintances you need to appease. You want to be successful, not a sycophant, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop hanging out with nasty people. Your environment either pulls you up or tramples you further into the ground. Choose who to be friends with and who to surround yourself with practically. Avoid garbage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop watching porn so often (men). Not only is it addictive, but with each orgasm, you lose strength - you ejaculate not only semen but also your motivation. It’s better to save energy and spend your time more wisely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop needing to talk when you’re bored. Don’t know what to do? Don’t call someone for the sake of hour-long conversations about nothing. Instead, read/listen to a book or do something you’ve been putting off for days. Get rid of the need to fill the silence with empty chatter. Fill it with your own depth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop caring about the opinions of others. It’s beyond your control. And if you can’t control it, why worry and fret? It’s a waste of time. Be independent and free yourself from the shackles of approval - they hinder your path to success. Not all your actions will be approved by others, so boldly ignore them. Approve of yourself.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop being in destructive relationships. Does your partner constantly pressure you? Constantly provoke quarrels and scandals? Is there no constructiveness in the relationship? Don’t hope for the best; move on. Break up. Spare your nerves; you’ll need them later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop relying on miracles or luck. 99% of all results depend on your efforts, perseverance, and ambitions. Why would you rot in the shadows for 60 years, hoping for a miracle, if you can create that miracle yourself in a shorter time?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop procrastinating. If you need to do something, do it. Don’t think that tomorrow you’ll find a compromise with yourself and want to do something worthwhile. Do what’s necessary immediately. Don’t deceive yourself, and don’t put obligations in the back burner. By doing this, you’re only delaying your success.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 21 Dec 2024 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/habits-that-kill-success/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>4 foundations for self-discipline</title>
        <link>https://blog.poplauki.eu/en/blog/four-foundations-of-self-discipline/</link>
        <description>&lt;p&gt;1. Too many responsibilities - a destructive break to pieces. Do only what you want to do no matter what. Ignore the irrelevant.&lt;/p&gt;
&lt;p&gt;Each commitment that you shoulder affects willpower.
If there is too much excess, it will not stand and you will break.&lt;/p&gt;
&lt;p&gt;2. Start the day with the most important thing. Something meaningful can be done in the first hour after waking up.&lt;/p&gt;
&lt;p&gt;If you don’t want to load yourself with something significant early, do something small. It’s better than just sticking to the phone.&lt;/p&gt;
&lt;p&gt;3. Be sharp and serious about yourself. If you forgot to do something, do not wish yourself, but punish yourself for the offense.
Not with a whip, of course.&lt;/p&gt;
&lt;p&gt;Sacrifice sleep to complete what was promised, for example. So the burden is off your shoulders, and self-confidence increases.&lt;/p&gt;
&lt;p&gt;4. Routine correction. Plan as much as possible. Stick to the schedule until the very end of the day, do not shirk. When planning, you must take into account your priorities and adhere to their implementation.&lt;/p&gt;
&lt;p&gt;The more habits and rules you introduce into your routine, the less you have to strain to maintain self-discipline. It will become the same effort as going to the toilet - by default, successful.&lt;/p&gt;
&lt;p&gt;A strong and reasonable schedule is a must-have for outstanding people. Sooner or later, you still have to take control of the days. And it is better if you come to this yourself, and not forced by circumstances. There will be experience.&lt;/p&gt;
</description>
        <pubDate>Sun, 15 Dec 2024 08:18:57 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/four-foundations-of-self-discipline/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Self-restraint and sacrifice</title>
        <link>https://blog.poplauki.eu/en/blog/self-resistaint-and-sacrifice/</link>
        <description>&lt;p&gt;It may be that the taste for self-restraint which these creeds, however false, have instilled in mankind has been of some use in strengthening the human race.&lt;/p&gt;
&lt;p&gt;For the strength of the generic and individual character consists chiefly in the capacity to sacrifice the present to the future, to scorn the temptations of an ephemeral pleasure for a more distant and lasting satisfaction.&lt;/p&gt;
&lt;p&gt;The more this faculty is exercised, the more exalted and strong becomes the character; and the highest heroism is attained by those who, in order to preserve or win liberty and truth for other, perhaps distant, ages, renounce the pleasures of life, and even life itself.&lt;/p&gt;
&lt;p&gt;© James George Frazer
“The Golden Bough”&lt;/p&gt;
</description>
        <pubDate>Sun, 08 Dec 2024 12:00:00 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/self-resistaint-and-sacrifice/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>The Foundation of the Pyramid of Success</title>
        <link>https://blog.poplauki.eu/en/blog/success-pyramide/</link>
        <description></description>
        <pubDate>Sun, 08 Dec 2024 08:18:57 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/success-pyramide/</guid>
      </item>
      
    
    
    
    
    
    
    
    
    
    
      
      <item>
        <title>Mdina: Unveiling the secrets of Malta&#39;s Silent City</title>
        <link>https://blog.poplauki.eu/en/blog/mdina-unveiling-the-secrets-of-maltas-silent-city/</link>
        <description>&lt;p&gt;Step back in time as you wander through the captivating streets of Mdina, Malta’s enchanting Silent City. Discover its rich history, admire its captivating architecture, and soak in its tranquil atmosphere. From ancient fortifications to captivating museums, Mdina offers a unique and unforgettable experience.&lt;/p&gt;
&lt;p&gt;Nestled atop a hill in the heart of Malta, Mdina stands as a captivating relic of a bygone era. Known as the Silent City, Mdina exudes an aura of tranquility that is both enchanting and mesmerizing.&lt;/p&gt;
&lt;h2&gt;Mdina castle.&lt;/h2&gt;
&lt;p&gt;As you pass through the imposing Mdina Gate, you are instantly transported back in time. The narrow, winding streets are lined with magnificent palazzos, their honey-colored facades adorned with intricate details. The air is filled with a sense of history, whispering tales of the many civilizations that have graced this ancient city.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-image article-image--landscape article-image--article&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/IMG20230907111450s-landscape-400w.webp&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/IMG20230907111450s-landscape-400w.jpeg&quot; /&gt;&lt;img src=&quot;https://blog.poplauki.eu/img/generated/IMG20230907111450s-landscape-400w.jpeg&quot; width=&quot;400&quot; height=&quot;267&quot; alt=&quot;Imposing Mdina Gate&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Mdina’s rich history dates back to the Bronze Age. Over the centuries, it has been ruled by &lt;a href=&quot;https://en.wikipedia.org/wiki/Phoenicia&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Phoenicians&lt;/a&gt;, Romans, Arabs, Normans, and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Knights_Hospitaller&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;Knights of St. John&lt;/a&gt;. Each civilization has left its mark on the city, creating a unique blend of architectural styles.&lt;/p&gt;
&lt;p&gt;Among the must-see attractions in Mdina are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mdina Cathedral:&lt;/strong&gt; A stunning example of Sicilian Baroque architecture, Mdina Cathedral is a feast for the eyes. The interior is adorned with opulent decorations, including intricate marble carvings and gilded artwork.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mdina Dungeons:&lt;/strong&gt; Descend into the depths of Mdina and explore the city’s eerie dungeons. These subterranean chambers were once used to hold prisoners, and their atmosphere is still one of mystery and intrigue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Palazzo Falson:&lt;/strong&gt; This magnificent palace offers a glimpse into the lives of Mdina’s noble families. The opulent interior is filled with fine art, furniture, and artifacts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mdina Glass:&lt;/strong&gt; Mdina is renowned for its exquisite glassblowing tradition. Visit Mdina Glass to see skilled artisans create beautiful works of art from molten glass.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bastions of Mdina:&lt;/strong&gt; The bastions that surround Mdina offer breathtaking views of the surrounding countryside. Take a stroll along the bastions and enjoy the panoramic vistas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture class=&quot;article-image article-image--portrait article-image--article&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/IMG20230907120713-portrait-400w.webp&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://blog.poplauki.eu/img/generated/IMG20230907120713-portrait-400w.jpeg&quot; /&gt;&lt;img src=&quot;https://blog.poplauki.eu/img/generated/IMG20230907120713-portrait-400w.jpeg&quot; width=&quot;400&quot; height=&quot;600&quot; alt=&quot;A quiet street in Mdina&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;As you wander through Mdina’s enchanting streets, take the time to savor the city’s tranquil atmosphere. The absence of cars and the hushed whispers of the wind create a sense of serenity that is truly unique.&lt;/p&gt;
&lt;p&gt;Mdina is a place where time seems to stand still. It is a city that invites you to slow down, to relax, and to simply be. So come and explore the Silent City, and let its magic transport you to another era.&lt;/p&gt;
</description>
        <pubDate>Sun, 22 Oct 2023 07:58:13 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/mdina-unveiling-the-secrets-of-maltas-silent-city/</guid>
      </item>
      
    
    
      
      <item>
        <title>Open jnlp file on Fedora</title>
        <link>https://blog.poplauki.eu/en/blog/open-jnlp-file-on-fedora/</link>
        <description>&lt;p&gt;How to open an jnlp file on Fedora&lt;/p&gt;
&lt;p&gt;I have on laptop Fedora 30 (x64)
For an online service connect need to start - specific &lt;em&gt;start.jnlp&lt;/em&gt; file.&lt;/p&gt;
&lt;p&gt;Google help me find information - what my system need JDK
Next step install java on my Fedora 30, because it not installed yet.&lt;/p&gt;
&lt;p&gt;By this &lt;a href=&quot;https://fedoraproject.org/wiki/JDK_on_Fedora&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;instruction&lt;/a&gt; done JDK installation.&lt;/p&gt;
&lt;p&gt;Reboot.
Run system upgrade&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf update&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Try to run start.jnlp&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;javaws start.jnlp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Got terrible error&lt;/p&gt;
&lt;p&gt;&lt;code&gt;javaws: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ok. Let’s install &lt;em&gt;libnsl&lt;/em&gt; package&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; libnsl&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And next try.
Voila it works.&lt;/p&gt;
</description>
        <pubDate>Sat, 14 Dec 2019 18:09:20 GMT</pubDate>
        <dc:creator>Vladimir Poplavskij</dc:creator>
        <guid>https://blog.poplauki.eu/en/blog/open-jnlp-file-on-fedora/</guid>
      </item>
      
    
  </channel>
</rss>

