<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Iurii Panarin</title>
    <description>The latest articles on Forem by Iurii Panarin (@pxyup).</description>
    <link>https://forem.com/pxyup</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F109451%2F3af66a72-67bb-4e9b-9f6d-af1123785aaa.jpeg</url>
      <title>Forem: Iurii Panarin</title>
      <link>https://forem.com/pxyup</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pxyup"/>
    <language>en</language>
    <item>
      <title>Fitter - Open Source no-code tool for map-reduce data from different source and even more!</title>
      <dc:creator>Iurii Panarin</dc:creator>
      <pubDate>Wed, 30 Oct 2024 18:46:10 +0000</pubDate>
      <link>https://forem.com/pxyup/fitter-open-source-no-code-tool-for-map-reduce-data-from-different-source-and-even-more-10hd</link>
      <guid>https://forem.com/pxyup/fitter-open-source-no-code-tool-for-map-reduce-data-from-different-source-and-even-more-10hd</guid>
      <description>&lt;h2&gt;
  
  
  Hello everyone!
&lt;/h2&gt;

&lt;p&gt;I am &lt;a href="https://github.com/PxyUp" rel="noopener noreferrer"&gt;Pxyup&lt;/a&gt; and today i want represent for you by open source project Fitter.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/PxyUp" rel="noopener noreferrer"&gt;
        PxyUp
      &lt;/a&gt; / &lt;a href="https://github.com/PxyUp/fitter" rel="noopener noreferrer"&gt;
        fitter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      New way for collect information from the API's/Websites
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com/PxyUp/fitter" rel="noopener noreferrer"&gt;Fitter + Fitter CLI&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Fitter - new way for collect information from the API's/Websites&lt;/p&gt;
&lt;p&gt;Fitter CLI - small cli command which provide result from Fitter for test/debug/home usage&lt;/p&gt;
&lt;p&gt;Fitter Lib - library which provide functional of fitter CLI as a library&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/PxyUp/fitter/blob/master/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FPxyUp%2Ffitter%2Fraw%2Fmaster%2Fdemo.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Way to collect information&lt;/h1&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt; - parsing response from some API's or http request(usage of http.Client)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser&lt;/strong&gt; - emulate real browser using chromium + docker + playwright/cypress and get DOM information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static&lt;/strong&gt; - parsing static string as data&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Format which can be parsed&lt;/h1&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;JSON&lt;/strong&gt; - parsing JSON to get specific information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XML&lt;/strong&gt; - parsing xml tree to get specific information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML&lt;/strong&gt; - parsing dom tree to get specific information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XPath&lt;/strong&gt; - parsing dom tree to get specific information but by xpath&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Use like a library&lt;/h1&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;go get github.com/PxyUp/fitter&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-go notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;package&lt;/span&gt; main
&lt;span class="pl-k"&gt;import&lt;/span&gt; (
    &lt;span class="pl-s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"github.com/PxyUp/fitter/lib"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"github.com/PxyUp/fitter/pkg/config"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"log"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"net/http"&lt;/span&gt;
)

&lt;span class="pl-k"&gt;func&lt;/span&gt; &lt;span class="pl-en"&gt;main&lt;/span&gt;() {
    &lt;span class="pl-s1"&gt;res&lt;/span&gt;, &lt;span class="pl-s1"&gt;err&lt;/span&gt; &lt;span class="pl-c1"&gt;:=&lt;/span&gt; &lt;span class="pl-s1"&gt;lib&lt;/span&gt;.&lt;span class="pl-en"&gt;Parse&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/PxyUp/fitter" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  How it was created
&lt;/h3&gt;

&lt;p&gt;In 2023, I worked on an idea called Trip Searcher:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.  You enter a budget.
2.  You specify a starting city or country.
3.  You set the trip duration and a range of possible start and end dates.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The Trip Searcher would monitor flights and return potential routes from the starting city, including total prices to various destinations, and send notifications to Telegram with:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.  Flight costs (parsed from Google or Kiwi).
2.  Hotel prices (from Airbnb or Booking).
3.  Food costs (retrieved from Numbeo).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;For this setup, I needed a list of countries, cities, and airport codes to plug into the sites mentioned. During development, I started thinking about how convenient it would be if all this information could be easily combined and parsed to streamline requests, which led to the idea for a project I call Fitter.&lt;/p&gt;

&lt;p&gt;P.S.: This project was for personal use.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fitter CLI
&lt;/h2&gt;

&lt;p&gt;A no-code map-reducer that returns data in user-friendly (JSON) or custom formats, suitable for storage in a database or transmission via HTTP.&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Supports parsing through HTML (query), JSON (gjson), XML, and xpath parsers.&lt;/li&gt;
&lt;li&gt; Retrieves data as a browser would, using Docker, Playwright(+ stealth mode), HTTP Client, Cache, File, or propagated fields, with support for custom plugins.&lt;/li&gt;
&lt;li&gt; Provides proxy support for Playwright and HTTP clients.&lt;/li&gt;
&lt;li&gt; Can send or store information to a file, webhook, console, and more via plugins.&lt;/li&gt;
&lt;li&gt; Handles all data types: int, float, bool, array, object, null, and string.&lt;/li&gt;
&lt;li&gt; Combines (map-reduce) and transforms fields.&lt;/li&gt;
&lt;li&gt; Utilizes the powerful &lt;a href="https://github.com/expr-lang/expr" rel="noopener noreferrer"&gt;expr library&lt;/a&gt; for template syntax, which is available across the application.&lt;/li&gt;
&lt;li&gt; Offered as a standalone binary and Docker version.&lt;/li&gt;
&lt;li&gt; Allows limits on request counts or instances for browser/Docker usage.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;a href="https://raw.githubusercontent.com/PxyUp/fitter/refs/heads/master/examples/cli/config_static_connector.json" rel="noopener noreferrer"&gt;Static generation&lt;/a&gt;:
&lt;/h4&gt;

&lt;p&gt;Here we will just generate static array from hardcoded&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./fitter_cli_v1.0.18-darwin-amd64 &lt;span class="nt"&gt;--url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://raw.githubusercontent.com/PxyUp/fitter/refs/heads/master/examples/cli/config_static_connector.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"PAGE: 1 INDEX: 0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"PAGE: 2 INDEX: 1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"PAGE: 3 INDEX: 2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"PAGE: 4 INDEX: 3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"PAGE: 5 INDEX: 4"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://raw.githubusercontent.com/PxyUp/fitter/refs/heads/master/examples/cli/config_current_time.json" rel="noopener noreferrer"&gt;Get current time&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Get information from the website and return to user.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./fitter_cli_v1.0.18-darwin-amd64 &lt;span class="nt"&gt;--url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://raw.githubusercontent.com/PxyUp/fitter/refs/heads/master/examples/cli/config_current_time.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"Current time is: 19:18:51"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Get current Steam Sales
&lt;/h4&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;That will create &lt;em&gt;sales.md&lt;/em&gt; wile in provided directory&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h4&gt;
  
  
  &lt;a href="https://raw.githubusercontent.com/PxyUp/fitter/refs/heads/master/examples/cli/config_cli.json" rel="noopener noreferrer"&gt;Get best news from HackerNews + Comment list for each&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;In this config we using template syntax for propagate result from the first request to next one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./fitter_cli_v1.0.18-darwin-amd64 &lt;span class="nt"&gt;--url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://raw.githubusercontent.com/PxyUp/fitter/refs/heads/master/examples/cli/config_cli.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"internal_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://news.ycombinator.com/item?id=41975047"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"kids"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"response_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9db6ec73-3e35-4d06-b5eb-dbaa05a3a31d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"internal_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://news.ycombinator.com/item?id=41975981"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;amp;amp;gt; We describe Flock as &amp;amp;amp;quot;Flutter+&amp;amp;amp;quot;. In other words, we do not want, or intend, to fork the Flutter community. Flock will remain constantly up to date with Flutter.&amp;amp;lt;p&amp;amp;gt;That was the first fear when I saw the title - splitting community and having two incompatible versions. Good to see it addressed in the post.&amp;amp;lt;p&amp;amp;gt;The second was just a fear of how it would complicate the development process, but it seems to be a drop-in replacement (just configuring FVM - Flutter Version Manager):&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;pre&amp;amp;gt;&amp;amp;lt;code&amp;amp;gt;   Configure .fvmrc to use Flock:   {     &amp;amp;amp;quot;flutter&amp;amp;amp;quot;: &amp;amp;amp;quot;master&amp;amp;amp;quot;,     &amp;amp;amp;quot;flutterUrl&amp;amp;amp;quot;: &amp;amp;amp;quot;https:&amp;amp;amp;#x2F;&amp;amp;amp;#x2F;github.com&amp;amp;amp;#x2F;Flutter-Foundation&amp;amp;amp;#x2F;flutter.git&amp;amp;amp;quot;   }&amp;amp;lt;/code&amp;amp;gt;&amp;amp;lt;/pre&amp;amp;gt;Flutter is the best thing that happened to UI development since Qt. Most people don&amp;amp;amp;#x27;t realize how many apps written in Flutter they use daily, simply because it&amp;amp;amp;#x27;s impossible to tell. And the frustration described in the post is felt by many CTOs and developers. Especially those who use Flutter for desktop and web. Flutter provides an amazing experience for desktop apps, and precisely because of that, it feels so frustrating when you stumble upon some stupid bug that has been open for a year or two and never gets prioritized. Usually, it&amp;amp;amp;#x27;s nothing critical, but still requires workarounds and wasting time.&amp;amp;lt;p&amp;amp;gt;I don&amp;amp;amp;#x27;t know, the idea of Flock sounds good, the main question is engaging the community. Hopefully, the author (who seem to be an ex-Flutter team member himself) have a good grasp on the state of the community.&amp;amp;lt;p&amp;amp;gt;Wishing luck to the project and going to keep an eye on the progress."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"comment"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;41975981&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Back when I worked on GWT, we had trouble accepting outside contributions because the team had a mandate to support Googlers. That is, much like other libraries and tools at Google, changes could not break google3. This means &amp;amp;lt;i&amp;amp;gt;testing&amp;amp;lt;/i&amp;amp;gt; patches against google3 and either changing the patch, or fixing whatever code used it, and these are tasks that no outsider can do.&amp;amp;lt;p&amp;amp;gt;Shepherding these patches is no fun when you have your own changes to work on that are more important to the team.&amp;amp;lt;p&amp;amp;gt;We did something similar, by creating an external fork where changes could be tried out by the community, without necessarily being accepted into the internal version.&amp;amp;lt;p&amp;amp;gt;I think a fork &amp;amp;lt;i&amp;amp;gt;could&amp;amp;lt;/i&amp;amp;gt; work if there was enough external momentum, but even 20 people working full time would actually be pretty good for an open source project. How many developers will this fork attract? The fork would need to attract other businesses who can put people on it.&amp;amp;lt;p&amp;amp;gt;One downside is that the code isn&amp;amp;amp;#x27;t tested against google3. Sometimes you find actual bugs that way.&amp;amp;lt;p&amp;amp;gt;Edit: reading more closely, the complaint doesn&amp;amp;amp;#x27;t seem to be that patches weren&amp;amp;amp;#x27;t reviewed, but rather that bug reports weren&amp;amp;amp;#x27;t investigated. That&amp;amp;amp;#x27;s definitely something outside developers could do more of, and seems a lot easier than forking?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"comment"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"response_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"af15ca55-c45c-48a8-a18d-2fcbd7dd8f3b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;41975765&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"internal_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://news.ycombinator.com/item?id=41975765"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://raw.githubusercontent.com/PxyUp/fitter/refs/heads/master/examples/cli/config_image_multiple.json" rel="noopener noreferrer"&gt;Scrape all images from website and store them locally&lt;/a&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./fitter_cli_v1.0.18-darwin-amd64 &lt;span class="nt"&gt;--url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://raw.githubusercontent.com/PxyUp/fitter/refs/heads/master/examples/cli/config_image_multiple.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/Users/pxyup/fitter/bin/1/basic-image.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/Users/pxyup/fitter/bin/2/alt-text.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/Users/pxyup/fitter/bin/3/no-size.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/Users/pxyup/fitter/bin/4/size.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/Users/pxyup/fitter/bin/5/image-with-title.png"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Fitter
&lt;/h2&gt;

&lt;p&gt;Fitter it is extended version of the Fitter CLI which have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Http server for trigger&lt;/li&gt;
&lt;li&gt;Return response as telegram message/webhook&lt;/li&gt;
&lt;li&gt;And that currently did not have documentation :)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;This tools can be used in different purpose:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Web scrapper&lt;/li&gt;
&lt;li&gt;Data scrapper with plugins&lt;/li&gt;
&lt;li&gt;Produce specific load testing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/PxyUp/it_life_berlin_fitter" rel="noopener noreferrer"&gt;Build chat bots&lt;/a&gt; - i use it for automate my telegram channel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example this job every day send best Dev.to aritcles:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;h2&gt;
  
  
  Plans
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Add more browser tools. Like click/scroll(currently can be done only by JS injection)&lt;/li&gt;
&lt;li&gt;Improve template syntax&lt;/li&gt;
&lt;li&gt;Add custom template editor + config editor&lt;/li&gt;
&lt;li&gt;May be will think about SASS for fitter CLI for run custom workflow for customers and return result to APP/Watch/etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Really wait for your feedback! Ask any question i will ask&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>go</category>
    </item>
    <item>
      <title>Fitter - open-source instrument for amazing scraping.</title>
      <dc:creator>Iurii Panarin</dc:creator>
      <pubDate>Tue, 30 Jan 2024 22:46:18 +0000</pubDate>
      <link>https://forem.com/pxyup/fitter-open-source-instrument-for-amazing-scraping-4aap</link>
      <guid>https://forem.com/pxyup/fitter-open-source-instrument-for-amazing-scraping-4aap</guid>
      <description>&lt;h3&gt;
  
  
  Hello everyone!
&lt;/h3&gt;

&lt;p&gt;I want to introduce &lt;a href="https://github.com/PxyUp/fitter"&gt;Fitter&lt;/a&gt; for you.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/PxyUp"&gt;
        PxyUp
      &lt;/a&gt; / &lt;a href="https://github.com/PxyUp/fitter"&gt;
        fitter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      New way for collect information from the API's/Websites
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
&lt;a href="https://github.com/PxyUp/fitter"&gt;Fitter + Fitter CLI&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Fitter - new way for collect information from the API's/Websites&lt;/p&gt;
&lt;p&gt;Fitter CLI - small cli command which provide result from Fitter for test/debug/home usage&lt;/p&gt;
&lt;p&gt;Fitter Lib - library which provide functional of fitter CLI as a library&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/PxyUp/fitter/blob/master/demo.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LFp4tBWP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://github.com/PxyUp/fitter/raw/master/demo.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
Way to collect information&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt; - parsing response from some API's or http request(usage of http.Client)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser&lt;/strong&gt; - emulate real browser using chromium + docker + playwright/cypress and get DOM information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static&lt;/strong&gt; - parsing static string as data&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;
Format which can be parsed&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;JSON&lt;/strong&gt; - parsing JSON to get specific information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XML&lt;/strong&gt; - parsing xml tree to get specific information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML&lt;/strong&gt; - parsing dom tree to get specific information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XPath&lt;/strong&gt; - parsing dom tree to get specific information but by xpath&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;
Use like a library&lt;/h1&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;go get github.com/PxyUp/fitter&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-go notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;package&lt;/span&gt; main
&lt;span class="pl-k"&gt;import&lt;/span&gt; (
    &lt;span class="pl-s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"github.com/PxyUp/fitter/lib"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"github.com/PxyUp/fitter/pkg/config"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"log"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"net/http"&lt;/span&gt;
)

&lt;span class="pl-k"&gt;func&lt;/span&gt; &lt;span class="pl-en"&gt;main&lt;/span&gt;() {
    &lt;span class="pl-s1"&gt;res&lt;/span&gt;, &lt;span class="pl-s1"&gt;err&lt;/span&gt; &lt;span class="pl-c1"&gt;:=&lt;/span&gt; &lt;span class="pl-s1"&gt;lib&lt;/span&gt;.&lt;span class="pl-en"&gt;Parse&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/PxyUp/fitter"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This tool can do a lot of stuff:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read content by XML/XPath/Json/HTML selectors&lt;/li&gt;
&lt;li&gt;Emulate browser with docker/playwright/chromium&lt;/li&gt;
&lt;li&gt;Support proxy&lt;/li&gt;
&lt;li&gt;Global references&lt;/li&gt;
&lt;li&gt;Fallback on no empty fields&lt;/li&gt;
&lt;li&gt;Notification Telegram/Http/Redis/Console&lt;/li&gt;
&lt;li&gt;File downloading&lt;/li&gt;
&lt;li&gt;Full &lt;a href="https://github.com/PxyUp/fitter/blob/master/README.md"&gt;README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Can work as golang library&lt;/li&gt;
&lt;li&gt;Support runtime golang plugins&lt;/li&gt;
&lt;li&gt;Work as CLI&lt;/li&gt;
&lt;li&gt;Works on Linux/Mac/Windows.&lt;/li&gt;
&lt;li&gt;Support different type of fields&lt;/li&gt;
&lt;li&gt;Support &lt;a href="https://expr-lang.org/"&gt;expression language&lt;/a&gt; for field and notification settings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;......&lt;/p&gt;

&lt;p&gt;N+1. &lt;strong&gt;Best and most important it is gluing of request&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Repository have a multiple examples for CLI/Fitter&lt;/p&gt;

&lt;h3&gt;
  
  
  Real world example of the problem
&lt;/h3&gt;

&lt;p&gt;Last week my friend need to monitor pool on some crypto stock. So here his problem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First of all you need get all user positions &lt;a href="https://docs.saucerswap.finance/v/developer/saucerswap-v2/liquidity-operations/get-user-positions"&gt;https://docs.saucerswap.finance/v/developer/saucerswap-v2/liquidity-operations/get-user-positions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;After that all stock pool &lt;a href="https://docs.saucerswap.finance/v/developer/saucerswap-v2/liquidity-operations/fetch-all-pools"&gt;https://docs.saucerswap.finance/v/developer/saucerswap-v2/liquidity-operations/fetch-all-pools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;After that you should check if pool has user positions you should send notification.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's see how Fitter can solve this problem:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Let me explain what is here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;environment variables:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;TELEGRAM_TOKEN&lt;/strong&gt; - line 95&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;USER_ID&lt;/strong&gt; - line 37&lt;/p&gt;

&lt;p&gt;So my friend need just run Fitter and add UserIds for Telegram notification(line 95):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TELEGRAM_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xxx &lt;span class="nv"&gt;USER_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xxx ./fitter &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;What happens in config:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.1 Creating Reference(line 3) on all pools and caching on 60 seconds(line 4). We take the response and create an array of the objects with two fields tokenA and tokenB.&lt;/p&gt;

&lt;p&gt;2.2 Creating Reference(line 33) on AccountId will be just string from ENV.&lt;/p&gt;

&lt;p&gt;2.3 We create items for monitoring every 10 seconds(line 88) which take values from the server via injecting AccountIdRef(line 52). Response it is array of objects with two field: first it is (line 66) - template string with injecting token name; second is boolean field which show if pair in pool(line 71)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Next we will inform if some of the values in array is true(line 93).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We will receive notification in Telegram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tokenA=USDC tokenB=USDC[hts]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tokenA=USDC tokenB=USDT"&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>programming</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>go</category>
    </item>
    <item>
      <title>SafeStorageBot - keep’s your secrets in Telegram</title>
      <dc:creator>Iurii Panarin</dc:creator>
      <pubDate>Fri, 20 May 2022 15:42:09 +0000</pubDate>
      <link>https://forem.com/pxyup/safestoragebot-keeps-your-secrets-in-telegram-1i5l</link>
      <guid>https://forem.com/pxyup/safestoragebot-keeps-your-secrets-in-telegram-1i5l</guid>
      <description>&lt;p&gt;The Telegram team announced the Saved Messages tab quite a while ago. Over time, my friends and I noticed that some of our passwords from services began to appear there as well, and “Saved Messages” is already being used as a password repository.&lt;/p&gt;

&lt;p&gt;It’s quite convenient, but there are some disadvantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Passwords are not encrypted.&lt;/li&gt;
&lt;li&gt;It is hard to search without tags, because there is other information&lt;/li&gt;
&lt;li&gt;It’s inconvenient to associate the service with the password&lt;/li&gt;
&lt;li&gt;You have to select when copying (which is not always convenient when there are special characters)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Solve this problem securely for passwords with a bot, before the release of Telegram WebApp was impossible with one bot(you can encrypt separately and send the result):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No client side(code that can be verified)&lt;/li&gt;
&lt;li&gt;Send unencrypted passwords to server is unsafe&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the advantage of WebApp this can be done (the main thing is to think up and remember the master-password):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Encrypt the password with a master password using Javascript (crypto API/crypto-JS) on the client side&lt;/li&gt;
&lt;li&gt;Send the encrypted password to the server (there we encrypt the password a couple more times to secure the database)&lt;/li&gt;
&lt;li&gt;When we need a password, we request it and decrypt it using the master password on the client side&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s how this bot came about.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/SafeStorageBot"&gt;BOT LINK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below I will show a short video of the bot:&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/VEZt9bAXH74"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You add a password with the title&lt;/li&gt;
&lt;li&gt;You enter the master password for encryption&lt;/li&gt;
&lt;li&gt;Send title + encrypted password to the server (master-password is never sent)&lt;/li&gt;
&lt;li&gt;On the server, encrypt the password and userId a second time with the server master-password&lt;/li&gt;
&lt;li&gt;The entry is saved in the database
……&lt;/li&gt;
&lt;li&gt;You request the password&lt;/li&gt;
&lt;li&gt;The entry is retrieved from the database and decrypted with the server master-password&lt;/li&gt;
&lt;li&gt;Sent to the client side&lt;/li&gt;
&lt;li&gt;You enter your master password and decrypt on the client side using javascript&lt;/li&gt;
&lt;li&gt;You see the decrypted password and can copy it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The client part of the application is posted in the repository:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/SafeStorageBot"&gt;
        SafeStorageBot
      &lt;/a&gt; / &lt;a href="https://github.com/SafeStorageBot/frontend_bot"&gt;
        frontend_bot
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Frontend for bot
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
TelegramPasswords&lt;/h1&gt;
&lt;p&gt;This project was generated with &lt;a href="https://github.com/angular/angular-cli"&gt;Angular CLI&lt;/a&gt; version 13.3.5.&lt;/p&gt;
&lt;h2&gt;
Development server&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;ng serve&lt;/code&gt; for a dev server. Navigate to &lt;code&gt;http://localhost:4200/&lt;/code&gt;. The application will automatically reload if you change any of the source files.&lt;/p&gt;
&lt;h2&gt;
Code scaffolding&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;ng generate component component-name&lt;/code&gt; to generate a new component. You can also use &lt;code&gt;ng generate directive|pipe|service|class|guard|interface|enum|module&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
Build&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;ng build&lt;/code&gt; to build the project. The build artifacts will be stored in the &lt;code&gt;dist/&lt;/code&gt; directory.&lt;/p&gt;
&lt;h2&gt;
Running unit tests&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;ng test&lt;/code&gt; to execute the unit tests via &lt;a href="https://karma-runner.github.io" rel="nofollow"&gt;Karma&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
Running end-to-end tests&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;ng e2e&lt;/code&gt; to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.&lt;/p&gt;
&lt;h2&gt;
Further help&lt;/h2&gt;
&lt;p&gt;To get more help on the Angular CLI use &lt;code&gt;ng help&lt;/code&gt; or go check out the &lt;a href="https://angular.io/cli" rel="nofollow"&gt;Angular CLI Overview and Command Reference&lt;/a&gt; page.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/SafeStorageBot/frontend_bot"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;With the command &lt;strong&gt;/version&lt;/strong&gt; you can always see the commit number of the client part of the application and see the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SafeStorageBot/frontend_bot/blob/master/src/app/utils/crypto.ts"&gt;Frontend encryption module&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have long thought about monetisation and after consulting with friends I settled on the option 3 passwords can always be stored, and for a donation of 3 euros a month you can store any number&lt;/p&gt;

&lt;p&gt;Thank you for your attention!&lt;/p&gt;

&lt;p&gt;PS: Let me take advantage of the opportunity to be promoted again:&lt;br&gt;
&lt;a href="https://t.me/SafeStorageBot"&gt;BOT LINK&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bot</category>
      <category>telegram</category>
      <category>opensource</category>
      <category>angular</category>
    </item>
    <item>
      <title>How I built a super fast JS/TS framework</title>
      <dc:creator>Iurii Panarin</dc:creator>
      <pubDate>Fri, 26 Apr 2019 14:52:46 +0000</pubDate>
      <link>https://forem.com/pxyup/how-i-built-a-super-fast-js-framework-4agb</link>
      <guid>https://forem.com/pxyup/how-i-built-a-super-fast-js-framework-4agb</guid>
      <description>&lt;h1&gt;
  
  
  How do other frameworks operate?
&lt;/h1&gt;

&lt;p&gt;What if we didn't use Virtual DOM at all, instead work with real DOM instead? To answer this, we first need to understand how most frameworks work, to better illustrate this I drew a small example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg25b38qhbuf2se3ultxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg25b38qhbuf2se3ultxp.png" alt="img"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Violet are DOM/VDOM nodes, Blue = state, Red = diffing, Green = patching. I should explain what happens in this picture. So most of the frameworks that have state and DOM, act like this when something in the state is modified. In this example, state.bg has changed. So now we iterate through all of the nodes (those 5 steps) and renders them. If something is changed, then patching happens where rendered stuff goes to actual DOM (green action). Ok, that's cool, but why do we need to iterate every single node (note that here come those diffing algorithms that compete with each other and some does diff differently) when only state.bg changes?!..&lt;/p&gt;

&lt;p&gt;So back to my original question “Why do we need Virtual DOM ?”, the answer is to iterate through all of DOM more quickly. Ok, so what if we didn't iterate?&lt;/p&gt;

&lt;h1&gt;
  
  
  Utopia way of doing this
&lt;/h1&gt;

&lt;p&gt;But I want to show you the way that in my head it should work without diffing nor iterating, nor Vnodes for that matter as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdqb4xxm4q2w1w4oemihe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdqb4xxm4q2w1w4oemihe.png" alt="img"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So in this utopia way we changed the same state.bg and there is no iteration (so no need for Virtual DOM), only one render (that single red dot), only one single parameter/attribute/node modifies which is affected by state.bg changes. Much less unnecessary iteration, unnecessary memory usage for virtual nodes, much less rendering = much faster.&lt;/p&gt;

&lt;h1&gt;
  
  
  Motivation
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;1. Small bundle size&lt;/em&gt;&lt;br&gt;
Many of the modern frameworks are very large. I honestly do not believe that the application “Hello World” should weigh more than 10kb. &lt;br&gt;
To solve this problem, I decided to use a declarative way to describe the components. This has a positive effect on the final size of the application and allows you to use the tree-shaking directly in the component template.&lt;br&gt;
&lt;a href="https://stackblitz.com/edit/typescript-cuat9d" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. Truly reactive&lt;/em&gt;&lt;br&gt;
I really wanted to implement reactivity as it was done in VueJS. If you change the entity of something, then the data on the page also changes, and if you change the data, the entity changes.&lt;br&gt;
&lt;a href="https://stackblitz.com/edit/typescript-ddsu5c" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3. Pure reusable components&lt;/em&gt;&lt;br&gt;
Any framework should be able to create life-cycle-aware components. This removes duplication of code and allows the component to be reused in several places.&lt;br&gt;
&lt;a href="https://stackblitz.com/edit/typescript-cf54fk" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;4. Conditional render and list render directives&lt;/em&gt;&lt;br&gt;
I really like the ReactJS, very straight, the first acquaintance, it was just wonderful. However, if you need nested conditional rendering, you will have to either use component wrappers or make ternary expressions that are difficult to read.&lt;br&gt;
&lt;a href="https://stackblitz.com/edit/typescript-gssmle" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Benchmark application
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/edit/typescript-p35cgr" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Another frameworks
&lt;/h2&gt;

&lt;p&gt;React (Stack) — &lt;a href="https://claudiopro.github.io/react-fiber-vs-stack-demo/stack.html" rel="noopener noreferrer"&gt;https://claudiopro.github.io/react-fiber-vs-stack-demo/stack.html&lt;/a&gt;&lt;br&gt;
React (Fiber) — &lt;a href="https://radi.js.org/fiber/Fiber%20Example.htm" rel="noopener noreferrer"&gt;https://radi.js.org/fiber/Fiber%20Example.htm&lt;/a&gt;&lt;br&gt;
Stencil.js — &lt;a href="https://stencil-fiber-demo.firebaseapp.com/perf.html" rel="noopener noreferrer"&gt;https://stencil-fiber-demo.firebaseapp.com/perf.html&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Performance test
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://pxyup.github.io/Revact/" rel="noopener noreferrer"&gt;https://pxyup.github.io/Revact/&lt;/a&gt; - try with throttling x6 times.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rawgit.com/krausest/js-framework-benchmark/master/webdriver-ts-results/table.html" rel="noopener noreferrer"&gt;https://rawgit.com/krausest/js-framework-benchmark/master/webdriver-ts-results/table.html&lt;/a&gt; (old name faster-dom)&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Link
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/PxyUp/Revact" rel="noopener noreferrer"&gt;https://github.com/PxyUp/Revact&lt;/a&gt; - source&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pxyup.github.io/Revact/" rel="noopener noreferrer"&gt;https://pxyup.github.io/Revact/&lt;/a&gt; - DEMO&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/RyuuGan/html2FastDom" rel="noopener noreferrer"&gt;https://github.com/RyuuGan/html2FastDom&lt;/a&gt; - Html transpiller&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Lightweight replacement of React + MobX</title>
      <dc:creator>Iurii Panarin</dc:creator>
      <pubDate>Mon, 25 Mar 2019 18:47:23 +0000</pubDate>
      <link>https://forem.com/pxyup/lightweight-replacement-of-react--mobx-22gd</link>
      <guid>https://forem.com/pxyup/lightweight-replacement-of-react--mobx-22gd</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/PxyUp/FastDom"&gt;FastDom&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lightweight replacement of React + MobX (I hope in future Angular/Vue), which does not use the virtual DOM comparison, but the re-render of only the changed parts. Abandon the HTML template in favor of their interpretation in JS, give to us tree-shaking is components/templates and the speed of work increases since the time to parse the template is zero.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thepracticaldev.s3.amazonaws.com/i/kedjptyl326dy2xwqycj.png"&gt;DEMO LINK&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackblitz.com/edit/typescript-wgjbzf"&gt;DEMO at StackBlitz&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Size - &lt;strong&gt;4.1 kB&lt;/strong&gt; or &lt;strong&gt;1.38 kB&lt;/strong&gt; gzipped.&lt;/li&gt;
&lt;li&gt;The library rewrites only changes and only when it is necessary.&lt;/li&gt;
&lt;li&gt;Performance - &lt;strong&gt;guarantee 60 fps&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Names of imported functions and classes are not finally and &lt;em&gt;can be discussed&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;There is &lt;strong&gt;a tree-shaking for components and templates !!!&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Vue conditional render based on breakpoint</title>
      <dc:creator>Iurii Panarin</dc:creator>
      <pubDate>Tue, 23 Oct 2018 08:35:31 +0000</pubDate>
      <link>https://forem.com/pxyup/vue-conditional-render-based-on-breakpoint-3a73</link>
      <guid>https://forem.com/pxyup/vue-conditional-render-based-on-breakpoint-3a73</guid>
      <description>&lt;p&gt;Good day all! I was create directive for conditionals renders based on screen size, support resize event.&lt;br&gt;
&lt;a href="https://github.com/PxyUp/vue-not-visible"&gt;https://github.com/PxyUp/vue-not-visible&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/vue-not-visible"&gt;https://www.npmjs.com/package/vue-not-visible&lt;/a&gt;&lt;br&gt;
Demo: &lt;a href="https://pxyup.github.io/vue-not-visible/index.html"&gt;https://pxyup.github.io/vue-not-visible/index.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>npm</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Angular Virtual Table</title>
      <dc:creator>Iurii Panarin</dc:creator>
      <pubDate>Mon, 22 Oct 2018 23:54:22 +0000</pubDate>
      <link>https://forem.com/pxyup/angular-virtual-table-321o</link>
      <guid>https://forem.com/pxyup/angular-virtual-table-321o</guid>
      <description>&lt;p&gt;Good evening, I created virtual scroll table based on material virtual scroll. This table support filtering, sorting and you can easy customize that. Demo included&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/PxyUp/ng-virtual-table"&gt;https://github.com/PxyUp/ng-virtual-table&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://pxyup.github.io/ng-virtual-table"&gt;https://pxyup.github.io/ng-virtual-table&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In future planned so many options like drag and drop, more filter types and more like that. Thanks for any help :)&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>rxjs</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
