<?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: Aexol</title>
    <description>The latest articles on Forem by Aexol (@aexol-studio).</description>
    <link>https://forem.com/aexol-studio</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%2Forganization%2Fprofile_image%2F5154%2F4c5f81f8-d029-4aca-b8d8-5e96ab106442.png</url>
      <title>Forem: Aexol</title>
      <link>https://forem.com/aexol-studio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aexol-studio"/>
    <language>en</language>
    <item>
      <title>URL - what is it?</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Wed, 21 May 2025 06:48:39 +0000</pubDate>
      <link>https://forem.com/aexol-studio/url-what-is-it-4ja7</link>
      <guid>https://forem.com/aexol-studio/url-what-is-it-4ja7</guid>
      <description>&lt;p&gt;Let's start with the basics. A URL (Uniform Resource Locator) is simply a unique address that allows you to find a particular page, file or resource on the web. By typing in a URL in your browser, you end up exactly where you want to go - whether it's to a shop homepage, a blog article or an image. Without URLs, the internet would be a pure chaos, because there would be no way to pinpoint where the content is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a URL and what does it consist of?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're wondering: what is a URL and what does it look like, it's worth knowing that each URL is made up of several elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a protocol (usually https or http)&lt;/li&gt;
&lt;li&gt;domain (e.g. twojastrona.pl)&lt;/li&gt;
&lt;li&gt;path (e.g. /blog/what-to-address-url)&lt;/li&gt;
&lt;li&gt;sometimes parameters (e.g. ?sort=desc)&lt;/li&gt;
&lt;li&gt;excerpt (e.g. #section1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An example URL might look like this:&lt;br&gt;
&lt;a href="https://aexol.com" rel="noopener noreferrer"&gt;https://yourpage.com/blog/adres-url?sort=desc#section1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;URLs and SEO - why is it important?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OK, but what is a URL in the context of SEO? It turns out that the URL is one of the first elements that both search engines and users look at. A well-constructed URL helps Google understand what the page is about, and helps the user decide more quickly whether to click on a search result.&lt;/p&gt;

&lt;p&gt;A friendly URL, i.e. one that is short, readable and contains keywords, can improve a page's visibility in Google. An example? If you run a blog about travel, it's better to use url: &lt;em&gt;yourwebsite.co.uk/blog/japan-trip than yourwebsite.co.uk/blog/?id=1234&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important rules for creating URLs for SEO&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before going into the specific rules, it is worth emphasising that proper URL design is the basis for effective SEO optimisation. A friendly and well-thought-out URL not only makes it easier for search engine robots to index your site, but also improves the user experience, increasing your chances of ranking higher in search results. Below, you will find key tips to help you create URLs that follow SEO best practices.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the https protocol - this builds trust and is a signal of quality to Google.&lt;/li&gt;
&lt;li&gt;Use short, concise and logical paths.&lt;/li&gt;
&lt;li&gt;Include keywords related to the content of the page, but don't overdo it.&lt;/li&gt;
&lt;li&gt;Separate words with hyphens (not underscores).&lt;/li&gt;
&lt;li&gt;Avoid Polish characters and special characters.&lt;/li&gt;
&lt;li&gt;Don't change URLs for no reason - it can hurt SEO.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;URL - what does it mean for the user?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A well-designed URL is not only a nod to search engines, but also a convenience for visitors. A clear url is easier to remember, copy and share. This makes users more likely to return to the site and recommend it to others.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;URL is an online address through which anyone can reach a specific page or file. In the context of SEO, the URL is one of the key elements influencing SEO and user perception of a website. It is worth ensuring that it is clear, unique and complies with SEO best practices. A well thought-out url can be your ally in the fight for better positions in Google.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>seo</category>
    </item>
    <item>
      <title>How To Reach Out On LinkedIn: Tips &amp; Tricks</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Mon, 12 May 2025 14:38:28 +0000</pubDate>
      <link>https://forem.com/aexol-studio/how-to-reach-out-on-linkedin-tips-tricks-3o1b</link>
      <guid>https://forem.com/aexol-studio/how-to-reach-out-on-linkedin-tips-tricks-3o1b</guid>
      <description>&lt;p&gt;LinkedIn is the world's largest professional networking platform, with over 900 million users worldwide. It serves as a space for professionals to connect, share content, and explore career opportunities. Many LinkedIn users are decision-makers, making it a powerful platform for marketing, recruiting, and sales outreach. Its focus on professional networking makes it ideal for B2B lead generation and relationship building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does LinkedIn outreach work?
&lt;/h2&gt;

&lt;p&gt;Yes! LinkedIn outreach is highly effective when done correctly. It helps users expand their network, warm up leads, and build meaningful professional relationships. However, response rates typically range between 10% and 25%, so success depends heavily on personalization, clarity, and relevance of the message, as well as having a well-optimized LinkedIn profile that builds trust instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to reach out to people on LinkedIn
&lt;/h2&gt;

&lt;p&gt;Reaching out on LinkedIn usually involves sending a connection request followed by direct messages once the connection is accepted. Connection requests allow up to 300 characters to craft a personalized message referencing mutual connections, shared groups, or relevant interests. After acceptance, you can send longer direct messages (up to 8,000 characters) to engage in more detailed conversations.&lt;/p&gt;

&lt;p&gt;To make your LinkedIn outreach easier and more effective, consider using &lt;a href="https://krul.app/" rel="noopener noreferrer"&gt;krul.app&lt;/a&gt;. KRUL is a tool that automates and personalizes LinkedIn outreach campaigns, helping you manage connection requests and follow-ups efficiently. It saves time while maintaining a personal touch, increasing your chances of successful engagements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important things to focus on in LinkedIn Outreach
&lt;/h2&gt;

&lt;p&gt;Key focus areas for successful LinkedIn outreach include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Profile Optimization:&lt;/strong&gt; Have a professional photo, clear headline, and compelling summary to build trust before reaching out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personalization:&lt;/strong&gt; Tailor your messages by mentioning mutual connections, shared groups, or specific content the recipient has posted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear Purpose:&lt;/strong&gt; Be upfront about why you’re reaching out without sounding overly salesy. Use polite, direct asks like suggesting a quick call or sharing valuable resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conciseness:&lt;/strong&gt; Keep messages short and to the point, as shorter messages tend to get higher reply rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow-up Strategy:&lt;/strong&gt; Plan a series of messages that gradually build the relationship rather than pushing for immediate sales - don't be to pushy!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Examples of outreach templates
&lt;/h2&gt;

&lt;p&gt;Having explored the theory, it’s time to take action! Below, you’ll find two practical LinkedIn outreach message templates designed to serve as valuable examples and inspiration for your own outreach efforts, of course, make sure to tweak it to adjuts your neeed. Here we go:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Template 1: Soft ask for a call&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Hi [Name],Thanks for connecting! I’ve been following your work at [Company] and am impressed by [specific achievement]. I’d love to have a quick chat to explore how we might collaborate or share insights.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Template 2: Knowledge sharing&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi [Name],I’ve helped businesses in [Industry] achieve [measurable results releveant to your prospect]. I’d love to connect and share a step-by-step guide on how you can achieve similar results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;LinkedIn is a powerful platform for professional networking and lead generation with a vast user base of decision-makers. Effective outreach relies on personalization, a strong profile, clear messaging, and respectful follow-ups. Tools like krul.app can help automate and personalize your outreach, saving time and improving results. Use thoughtful connection requests and direct message templates focused on building genuine relationships to increase your LinkedIn outreach success.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to translate whole i18n folders?</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Tue, 15 Oct 2024 14:42:13 +0000</pubDate>
      <link>https://forem.com/aexol-studio/how-to-translate-whole-i18n-folders-4dcd</link>
      <guid>https://forem.com/aexol-studio/how-to-translate-whole-i18n-folders-4dcd</guid>
      <description>&lt;h1&gt;
  
  
  Streamline Your Website Localization with DevTranslate’s New “Translate Folders” Feature
&lt;/h1&gt;

&lt;p&gt;When it comes to making your website or application truly global, localization is a must. &lt;a href="https://devtranslate.app/" rel="noopener noreferrer"&gt;DevTranslate&lt;/a&gt;, a tool designed specifically for developers, has introduced an exciting &lt;strong&gt;“Translate Folders”&lt;/strong&gt; feature that can significantly speed up and simplify the translation process. This powerful addition allows users to easily translate entire folders of files in just a few clicks, making it a game-changer for app and website localization.&lt;/p&gt;

&lt;p&gt;In this post, we’ll explore how this new feature works, why it’s valuable, and how you can take full advantage of it to streamline your translation workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the “Translate Folders” feature?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;“Translate Folders”&lt;/strong&gt; feature in DevTranslate enables developers to upload and translate entire directories of resource files at once. This means you no longer need to translate individual files manually — instead, the tool handles the entire batch at once. Whether your project includes multiple JSON, XML, or ARB files, this feature supports bulk translation into 26 languages with seamless accuracy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bulk Translation&lt;/strong&gt;: Save hours of work by translating entire folders in one go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-Saving&lt;/strong&gt;: Drastically reduce the time spent on localization by letting the tool handle multiple files simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;: By translating everything at once, you ensure that your translations are uniform across all languages and platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;Using the &lt;strong&gt;“Translate Folders”&lt;/strong&gt; feature is incredibly simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload your folder&lt;/strong&gt;: Drag and drop your folder containing files such as &lt;code&gt;.json&lt;/code&gt;, &lt;code&gt;.xml&lt;/code&gt;, &lt;code&gt;.arb&lt;/code&gt;, or &lt;code&gt;.strings&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select files that need to be translated&lt;/strong&gt;: If the folder contains files that don't need translation, select only those that should be translated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select input &amp;amp; output languages&lt;/strong&gt;: Choose the source language of your content and the languages you want the files to be translated into.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click translate&lt;/strong&gt;: &lt;a href="https://devtranslate.app/" rel="noopener noreferrer"&gt;DevTranslate&lt;/a&gt; will process your folder in a matter of minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download Translated Files&lt;/strong&gt;: Once the translations are complete, you can download the fully localized folder and integrate it back into your project.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why it’s so cool?
&lt;/h2&gt;

&lt;p&gt;For developers working on large-scale apps or websites with regular updates, this feature is a game-changer. Instead of manually translating new content every time an update is rolled out, DevTranslate automates the process. This is especially beneficial for teams managing multi-language websites or apps where updates happen frequently, ensuring that the translated content is always up-to-date and consistent across different languages.&lt;/p&gt;

&lt;p&gt;Here’s why &lt;strong&gt;folder translations&lt;/strong&gt; stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Effortless integration&lt;/strong&gt;: Upload your folder, select the languages, and let DevTranslate do the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid manual errors&lt;/strong&gt;: Automating translation eliminates the risk of human error, ensuring accuracy and consistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple to use&lt;/strong&gt;: Whether you need to translate one file or a hundred, DevTranslate’s folder translation scales effortlessly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Translate your website with ease
&lt;/h2&gt;

&lt;p&gt;If you’re looking to localize your website or app with minimal hassle, the &lt;strong&gt;“Translate Folders”&lt;/strong&gt; feature is your best bet. By leveraging this feature, you can streamline your workflow, ensure consistency, and reduce the time spent on localization. Best of all, you can maintain a localized experience for users across the globe with just a few clicks.&lt;/p&gt;

&lt;p&gt;Don’t miss out on reaching new audiences — try DevTranslate today and take your localization efforts to the next level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to Get Started?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://devtranslate.app/" rel="noopener noreferrer"&gt;DevTranslate&lt;/a&gt; &lt;strong&gt;“Translate Folders”&lt;/strong&gt; feature is designed to make your website or app localization easier, faster, and more efficient. Whether you’re an individual developer or part of a larger team, this feature helps you seamlessly scale your app to new markets.&lt;/p&gt;

&lt;p&gt;Optimize your localization strategy by giving the &lt;strong&gt;Translate Folders&lt;/strong&gt; feature a try today! Visit DevTranslate to get started.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>marketing</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to send lead emails from your website form?</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Mon, 12 Aug 2024 08:45:26 +0000</pubDate>
      <link>https://forem.com/aexol-studio/how-to-send-lead-emails-from-your-website-form-253p</link>
      <guid>https://forem.com/aexol-studio/how-to-send-lead-emails-from-your-website-form-253p</guid>
      <description>&lt;p&gt;Web forms reign supreme as a lead generation tool for small businesses. Their popularity stems from several key advantages, one in particular that is overwhelmingly emphasized by all sources - the ease with which they can be integrated into any website. It sounds sensible, but is that where the work with forms ends? Certainly not, on the contrary, this is just the beginning and the hardest part is yet to come.&lt;/p&gt;

&lt;h2&gt;
  
  
  I have added form to my website, now what?
&lt;/h2&gt;

&lt;p&gt;So you've added a form to your site and are hoping that momentarily leads will start flowing to .... just where? To get responses from online forms you should use two approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interfacing with the form of one of the many &lt;strong&gt;CRM platforms&lt;/strong&gt; available on the market.&lt;/li&gt;
&lt;li&gt;send them as an &lt;strong&gt;email&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like everything, each of these has its pros and cons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros and cons
&lt;/h2&gt;

&lt;p&gt;Let's start with CRM. Undoubtedly, it is a convenient way to receive content from online forms, allowing you to define and build a sales process, but CRMs can be very expensive which is often a no go for small companies. Another downside is that it's another tool you have to add to your daily routine and monitor so you don't miss out on new leads.&lt;/p&gt;

&lt;p&gt;And how about sending emails? The plus side is that they go straight to your mailbox, so the place you check regularly and the chance of missing them is really low. So far, the biggest drawback has been the difficulty of integration, as setting this up correctly requires integration on the frontend side, but also playing with SMTP server, its correct configuration so as not to fall into blacklists etc.  On the other hand, this is no longer a problem because ...&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution - &lt;a href="https://mailik.dev/" rel="noopener noreferrer"&gt;Mailik.dev&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Mailik is a small and easy to use library that allows you to send emails directly from the code of your site with minimal effort &lt;a href="https://mailik.dev/docs/introduction/" rel="noopener noreferrer"&gt;(see the documentation)&lt;/a&gt;. Basically, all you need to do is sign up for a free account, create a project for which Mailik automatically generates a unique key and you point it at your implementation (see example below) ... and you're done.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Mailik&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@mailik/sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MailInputType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;replyTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MailInputType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nc"&gt;Mailik&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;YOURS_API_KEY&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;replyTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;`
          Name: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,
          Message: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,
          Phone:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
        `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mail subject&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Replies from your website's forms will go straight to the designated mailbox and you will be able to respond to your potential customers (as long as you would collect their emails :)) and convert them into leads for your company!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqs5utx8efgcz4qcnxiz0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqs5utx8efgcz4qcnxiz0.png" alt="Mailik dashboard" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final words
&lt;/h2&gt;

&lt;p&gt;These forms serve as a critical point of contact, converting casual browsers into potential customers or subscribers with minimal friction, which is why every online business should make every effort to make this channel of lead acquisition work flawlessly - &lt;a href="https://mailik.dev/" rel="noopener noreferrer"&gt;Mailik.dev&lt;/a&gt; has just made it very easy!&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>marketing</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Apple DMA changes - for better or for worse?</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Fri, 26 Jan 2024 10:41:32 +0000</pubDate>
      <link>https://forem.com/aexol-studio/apple-dma-changes-for-better-or-for-worse-40i1</link>
      <guid>https://forem.com/aexol-studio/apple-dma-changes-for-better-or-for-worse-40i1</guid>
      <description>&lt;p&gt;Yesterday (25 Jan 2024) Apple announced some major changes to iOS, Safari, and the App Store operating model that would impact developers' apps in the European Union. The motivation for the changes is to comply with the Digital Markets Act (DMA) that came into force in Nov 2022. Let's have a look at the most interesting ones, or if you want to see the full list of changes go to &lt;a href="https://www.apple.com/newsroom/2024/01/apple-announces-changes-to-ios-safari-and-the-app-store-in-the-european-union/"&gt;Apple's official announcement&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new for iOS
&lt;/h2&gt;

&lt;p&gt;For iOS, Safari and App Store to become DMA compliant Apple has been forced to significantly loosen many of its previous restrictive operating rules which will result in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New framework and APIs for browser engines&lt;/strong&gt; — which will allow developers to use browser engines, other than the default iOS WebKit, for browser apps and apps with in-app browsing, which is a huge impact on developers, as it should give them some more options when dealing with WebView.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interoperability request form&lt;/strong&gt; — through which developers can apply to unlock additional iPhone, iOS hardware and software functionalities which should lead to some cool new products see daylight&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of you might say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey, what about the alternative app marketplace deregulations?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;so it looks like we should indeed get some new APIs &amp;amp; tools for publishing, downloading &amp;amp; even updating apps from alternative marketplaces, but this comes with even more safeguards (regulations?) in the form of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notarization for iOS apps&lt;/li&gt;
&lt;li&gt;App installation sheets&lt;/li&gt;
&lt;li&gt;Authorization for marketplace developers&lt;/li&gt;
&lt;li&gt;Additional malware protections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;which is hardly surprising as this could pose a risk for iPhone end users. I honestly believe that the majority of users and app download traffic will remain in the App Store anyway. It's a tidy, familiar &amp;amp; trustworthy environment, so nothing should change until a high-trust alternative emerges.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new for the App Store
&lt;/h2&gt;

&lt;p&gt;Changes to the App Store terms cause, to put it mildly, mixed feelings. So we're getting a tool which lets us estimate fees, better understand metrics associated with Apple's &lt;strong&gt;new business terms for apps in the EU&lt;/strong&gt; (which will be covered in a minute) &amp;amp; a bunch of new really nice deregulations like the ability to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;use 3rd party payment service providers&lt;/strong&gt; - we're finally getting a way to process payments for digital goods and services directly from our iOS app (no additional fee to Apple),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;process payments via link-out&lt;/strong&gt; - users can finally complete a transaction for digital goods and services on developer's external website (no additional fee to Apple),&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and there is one but. This leads us to...&lt;/p&gt;

&lt;h3&gt;
  
  
  New Business Terms for Apps in the EU
&lt;/h3&gt;

&lt;p&gt;Let's start with the fact that we can choose to accept these new business terms or stay on Apple's existing terms, but of course, the previously mentioned deregulations are &lt;strong&gt;only&lt;/strong&gt; included in the new business terms.&lt;/p&gt;

&lt;p&gt;Now let's see what's inside. It starts nicely with two eye-catchers in the form of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced commission&lt;/strong&gt; — iOS apps on the App Store will pay a reduced commission of either 10 percent (for the vast majority of developers, and subscriptions following their first year) or 17 percent on transactions for digital goods and services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment processing fee&lt;/strong&gt; — iOS apps on the App Store can use the App Store's payment processing for an additional 3 percent fee. Developers can use a payment service provider within their app or link users to their website to process payments for &lt;strong&gt;no additional fee to Apple&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;but then we're getting hit with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core Technology Fee&lt;/strong&gt; — iOS apps distributed from the App Store and/or an alternative app marketplace will pay €0.50 for each first annual install per year over a 1 million threshold,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;since we're getting a cool new tool to "&lt;em&gt;estimate fees, better understand metrics associated with Apple&lt;/em&gt;" let's do the math. As it was put nicely by Nikita Bier on his Twitter (&lt;a href="https://twitter.com/nikitabier"&gt;@nikitabier&lt;/a&gt;) an app that would work &amp;amp; sell digital goods under new terms that generate 10 000 000 installs per year and is forecast to reach 10 000 000$ in sales can expect to pay a whooping 500 000$ in monthly fees. OK, the yearly APRU of 1$ is a bit higher (or a lot higher?) than the sector average, but as you can see in the breakdown below most of the fee is coming from the so-called "Technology Fee" which is tied to your install volume.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1750592825060921353-937" src="https://platform.twitter.com/embed/Tweet.html?id=1750592825060921353"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1750592825060921353-937');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1750592825060921353&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Considering all the above are we really getting a batch of deregulations or just DMA-compliant illusion of an alternative solution which in comparison with the current one comes out so poorly that few will want to use it? Apple boldly estimates that the new business terms would reduce or maintain the current level of fees paid to Apple for 99% of developers and that less than 1% would need to pay a Core Technology Fee on their EU apps. Let's wait and see.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h2&gt;
  
  
  About Aexol
&lt;/h2&gt;

&lt;p&gt;Need help with software development? At &lt;a href="https://aexol.com/"&gt;Aexol&lt;/a&gt;, we develop mobile and web applications helping our clients grow. We are TypeScript and GraphQL focued company.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aexol.com/"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhly8jryrh4aww3yra3ya.png" alt="Hire Aexol developers" width="700" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>ios</category>
      <category>apple</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>GraphQL AI Platform for developers</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Fri, 10 Nov 2023 15:07:36 +0000</pubDate>
      <link>https://forem.com/aexol-studio/graphql-ai-platform-for-developers-1hgm</link>
      <guid>https://forem.com/aexol-studio/graphql-ai-platform-for-developers-1hgm</guid>
      <description>&lt;p&gt;Hey there! We're building a developer-oriented AI tool suite called - GraphQL AI&lt;/p&gt;

&lt;h2&gt;
  
  
  What is GraphQL AI?
&lt;/h2&gt;

&lt;p&gt;Basically we're creating a GraphQL-based playground where you can train your own chatbot instances, link them into a network, generate images using various models, and do other cool stuff faster than you can say &lt;code&gt;"Hello, World!"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We're on the brink of release (hopefully) and have created a waitlist you can join to get notified when the tool is ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much does it cost?
&lt;/h2&gt;

&lt;p&gt;NOTHING - it's currently FREE. I guess we would need to think about monetization at some point but definitely not in the nearest future.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;We provide the infrastructure to build things but you need to use your own OpenAI and Replicate keys. OpenAI's throwing in a free ~20$ worth of API credit for new users so you can basically play with it 100% free.&lt;/p&gt;

&lt;p&gt;Check out the landing page for a sneak peek: &lt;a href="https://graphqlai.com/"&gt;GraphQLAI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Direct waitlist link here: &lt;a href="https://app.graphqlai.com/en/soon/"&gt;Join the Waitlist&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See you on the flip side of GraphQL innovation!&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>ai</category>
      <category>api</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Aexol shines at Europe's biggest hackathon - HackYeah 2023!</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Thu, 19 Oct 2023 09:13:24 +0000</pubDate>
      <link>https://forem.com/aexol-studio/aexol-shines-at-europes-biggest-hackathon-hackyeah-2023-j02</link>
      <guid>https://forem.com/aexol-studio/aexol-shines-at-europes-biggest-hackathon-hackyeah-2023-j02</guid>
      <description>&lt;p&gt;Over the past weekend, the Tauron Arena in Krakow was hosting the biggest hackathon in Europe - Hackyeah 2023. The competition brought together talented minds from Poland and all of Europe and served as a battleground for IT experts. Of course, participating in such an event isn't only about work and competition, it's also a chance to meet tons of different people from the IT sector and exchange ideas, thoughts and experiences. That said everyone was there to see the main event - tackling technology challenges within a 24-hour time-frame. The category the AEXOL team participated in required the creation of a solution to modernize the education sector using technology.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9OVuzo4V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pkj7rtwd2pigjwu9lzoi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9OVuzo4V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pkj7rtwd2pigjwu9lzoi.jpg" alt="Aexol Team" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our team utilized artificial intelligence to create a complete MVP (Minimum Viable Product) for the GovTech task, combining various tools, skills and technologies. This earned them the third spot in the "Education in Innovation" category and their project caught the attention of both participants and competition judges due to its innovative approach to educational challenges. I'm proud to say that our team created one of the most recognizable projects to emerge from this exceptional event.&lt;/p&gt;

&lt;h3&gt;
  
  
  The team
&lt;/h3&gt;

&lt;p&gt;The award-winning team includes Aleksander Bondar (frontend developer), Arkadiusz Kuryło (backend developer), Adam Michałowski (frontend developer), Jakub Sowa (3D graphic designer - external to AEXOL), Adrianna Gregorczuk (leader), and Monika Szypurska (graphic designer - external to AEXOL). Their stack consisted of React, Next.js, TypeScript, GraphQL, Stucco.js, mongoDB, Figma and Blender. It served to combine the various skills of team members and was key in reaching the goal of the challenge. This achievement is the result of a combined effort that took many hours of hard work and dedication from the entire team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DogSGFsM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/efujyik2ddjgj2o28aad.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DogSGFsM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/efujyik2ddjgj2o28aad.jpg" alt="the Arena" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project was all about the implementation of artificial intelligence to help students pick a university course to study. An effective tool to assist in making crucial life decisions can be a great help in today's world, especially when it comes to decisions as important as choosing the right educational institution or course of study. Our team took on the challenge by using our trained chatGPT model and designing an application around it - allowing users to easily and accurately find schools, educational institutions, or study programs that best suit their individual needs. Their solution could become part of the Education and Science Portal - edukacja.gov.pl!&lt;/p&gt;

&lt;h3&gt;
  
  
  Research - Generations Z &amp;amp; Alpha
&lt;/h3&gt;

&lt;p&gt;We know the issues addressed and the goals of the project, but we didn’t really talk about the first step. How did the team come up with the idea for the app, where did it come from, and what research on the topic did they do?&lt;/p&gt;

&lt;p&gt;The demographic significance of Generation Z cannot be underestimated. Comprising a substantial 15.4% of Poland's population, this generation faces a slew of unique challenges. Research suggests that the dissatisfaction experienced by young individuals can have far-reaching consequences, making it imperative to address their concerns in a timely manner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IZPrWom_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l9q40zbf12m6av7684ur.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IZPrWom_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l9q40zbf12m6av7684ur.jpg" alt="hard at work" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Numerous psychological studies have delved into the impact of unrealized aspirations on mental well-being. The weight of unfulfilled dreams can lead to feelings of frustration and disillusionment, underscoring the importance of providing avenues for young people to pursue their ambitions. Social psychology research consistently highlights the significance of a robust support system. Young individuals who lack adequate support from their immediate surroundings may face hurdles in their personal and professional growth. Initiatives designed to offer mentorship and guidance during the transition to adulthood are vital for their development.&lt;/p&gt;

&lt;p&gt;As we look toward Generation Alpha, often labeled as "Always on," early economic and socio-scientific projections indicate a preference for highly personalized experiences, empowerment, and innovations. Understanding these evolving preferences is essential for shaping the future landscape. Emerging as a potential remedy to the multifaceted challenges faced by both Generation Z and Generation Alpha, competent AI administration offers guidance and support in navigating complex life and career decisions. Harnessing the power of AI can be a game-changer in addressing the needs of these tech-savvy generations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y8cJO2fo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/norqvgb1r7nwvvspnd31.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y8cJO2fo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/norqvgb1r7nwvvspnd31.jpg" alt="arena was packed!" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In crafting their solution, the team drew inspiration from the immersive qualities observed in popular gaming platforms like Roblox and Minecraft. These virtual environments have been studied extensively in the context of user engagement and experience. By incorporating elements of immersion and CAVE, they aimed to create a product that not only captures attention but also evolves in multiple directions, all while preserving its original MVP concept.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fine-tuning
&lt;/h3&gt;

&lt;p&gt;Now that we have learned about the issues our friends faced, we can move on to technical matters. As we know the team turned their minds and capacities towards so-called fine-tuning. In the ever-evolving landscape of artificial intelligence, fine-tuning has emerged as a crucial technique for enhancing the capabilities of pre-trained models. Fine-tuning is a process that allows us to adapt these models to perform specific tasks with greater accuracy and relevance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UtGG4unp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6kckpldkc3fq2ufbzc04.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UtGG4unp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6kckpldkc3fq2ufbzc04.jpg" alt="getting the award" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we dive into the intricacies of fine-tuning, it's essential to grasp the concept of pre-trained models. These models are AI systems that have been trained on vast amounts of data, typically from the internet, to learn the patterns and structures of natural language or images. A well-known example of a pre-trained model is OpenAI's GPT (Generative Pre-trained Transformer) series for natural language processing, which includes GPT-3.5, the foundation of this AI.&lt;/p&gt;

&lt;p&gt;Pre-trained models are designed to perform a wide range of tasks, from text generation to language translation, sentiment analysis, and more. However, they might not be optimal for specific, domain-specific, or fine-grained tasks. This is where fine-tuning comes into play.&lt;/p&gt;

&lt;p&gt;Fine-tuning is akin to the process of "specialization" for pre-trained models. It is the process of taking a general-purpose, pre-trained model and adapting it to excel in a specific task or domain. Think of it as giving a versatile tool a sharpened edge for a specific job. Instead of starting from scratch and training an entirely new model, fine-tuning leverages the existing knowledge of the pre-trained model, saving time, computation resources, and data. In the world of artificial intelligence, fine-tuning has emerged as a critical technique for enhancing the capabilities of pre-trained models. It bridges the gap between generic AI and task-specific AI, offering an efficient and effective way to adapt models to specific needs. As AI continues to play a pivotal role in various domains, the importance of fine-tuning cannot be overstated, as it enables us to unlock the full potential of these powerful AI systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z1VgRFhn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vpbluutn1lfubyyukwcs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z1VgRFhn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vpbluutn1lfubyyukwcs.jpg" alt="HackYeah!" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Congratulations
&lt;/h3&gt;

&lt;p&gt;I want to extend my heartfelt congratulations to our team for winning a prestigious award and achieving widespread recognition for their efforts. Hopefully, their project will make a significant contribution to the Polish education sector through the use of the latest technologies, including artificial intelligence. The integration of AI into educational processes holds immense potential to greatly improve the quality and accessibility of education.&lt;/p&gt;

&lt;p&gt;Thanks to your efforts, we saw how students can have the opportunity to use AI in an engaging and effective manner while preparing for a future where technology plays an increasingly vital role. Getting a well-deserved 3rd place in our first go at such a large event serves as a recognition of your hard work and commitment. It also serves as an encouragement to participate in similar events in the future for everyone at Aexol. So once again: congratulations!&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>news</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Quick Guide to App Localization</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Thu, 22 Dec 2022 11:17:53 +0000</pubDate>
      <link>https://forem.com/aexol-studio/a-quick-guide-to-app-localization-2j95</link>
      <guid>https://forem.com/aexol-studio/a-quick-guide-to-app-localization-2j95</guid>
      <description>&lt;p&gt;When developing a new app there are quite a lot of challenges waiting for you behind every corner as well as questions you need to answer yourself to make your app successful. One of those questions is how to make it scale, so that it is a global success. One of the key factors that open your apps for new markets is app localization.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is app localization?
&lt;/h2&gt;

&lt;p&gt;Application localization is the process of adapting your application to the culture &amp;amp; language of each target market in which you would like to succeed. The process of localizing an application usually begins with what is called internationalization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why app localization is so important?
&lt;/h2&gt;

&lt;p&gt;App localization should be one of the first  things that chould come to mind when looking for ways to expand the audience base of your app. After all, while most mobile users are at least familiar with English, many prefer using their local language for their apps which significantly broadens the number of potential users you can reach by localizing your app into various other languages. If your app is in a different language, then the benefits of translating into English, in terms of potential audience, should be even more obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  App localization strategy
&lt;/h2&gt;

&lt;p&gt;The usual approach when localizing is going for the so called ‘tier 1 countries' which usually includes US, Canada, France, Germany, UK and Japan. While tier 1 countries are definitely the most profitable, they are also the most competitive and can be a tough market to crack. As such, additionally targeting less popular, but also less competitive markets can actually be a more effective approach. After all, casting a wider net and trying to rake in audiences from more countries can yield better results and without complex market research it’s hard to even tell where you might find potential users for your app. You might find that by translating your app into less popular languages you find a niche that your competitors have overlooked and gain a lot more users than you expected. Who to rely on? If you’ve decided on localization, the next question is how to do it. Mobile app companies often rely on either community translators, freelancers or localization companies. Each have advantages and disadvantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;volunteer/community translators&lt;/strong&gt;: While the obvious advantage is the cost (or lack thereof) the drawbacks are also significant, often both in terms of time and quality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;freelance translators&lt;/strong&gt;: Relying on native speakers or translators working as freelancers is a lot more reliable, you can usually be sure the work will be done in a timely and professional manner. Though you will still likely have to micromanage translators for each added language and for every future update.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;localization company&lt;/strong&gt;: The best solution if you’re looking for a consistent professional translation service that will save you all the hassle and micromanagement. You can be sure of the quality and constant support, but it will also most likely be expensive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What about localization tools?
&lt;/h2&gt;

&lt;p&gt;Various localization tools are becoming more and more popular, despite preconceived notions about their quality mainly due to how unreliable they used to be in the past. You can be sure the days of google translate spitting out unintelligible gibberish are long gone though, and modern algorithms have gotten a lot better at the job. If you’re having doubts you should know a simple fact: all those professional translators use them too. Even if you rely on freelancers or a professional translation company they will also utilize popular translation tools for one simple reason: it significantly speeds up their work. While those tools are not 100% perfect yet, the key advantages are clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;no hassle&lt;/strong&gt;: no outsourcing or micromanaging freelancers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ad hoc usage&lt;/strong&gt;: use only when actually needed, save yourself the trouble of repeatedly looking for freelancers with each new release or constantly paying a localization company for continuous translation services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;consistency&lt;/strong&gt;: build a glossary to ensure all translations are consistent with your app and brand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;automate&lt;/strong&gt;: take advantage of automatic translations as you update your app with new features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;efficiency&lt;/strong&gt;: translate into many different languages instantly without the need for weeks of translations by a host of freelancers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are the main benefits of app localization?
&lt;/h2&gt;

&lt;p&gt;If you are asking yourself whether you should localize your application then the answer is very simple - yes! What benefits will it bring to your application? Let's look at some of the most important ones&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New markets&lt;/strong&gt;: App localization is vital if you want to conquer global markets as making your app more appealing to people in different countries allows you to increase your reach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engaging to users&lt;/strong&gt;: Users react more positively to content that respects their cultural norms and is tailored to their expectations. Localized user experience can drastically boost their engagement and brand loyalty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More app downloads&lt;/strong&gt;: Studies show that app store descriptions written in a local language can bring up to 40% more downloads as you are boosting your App Store Optimization (ASO) by getting access to totally new keywords &amp;amp; search phrases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More revenue&lt;/strong&gt;: Localization is a part of your app expansion. With every market your app is present in, you are gaining access to new potential revenue streams (new users, new ad partners etc.)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Speed up your apps &amp;amp; websites translation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevTranslate&lt;/strong&gt; online JSON, XML, STRINGS &amp;amp; ARB files translator app for developers, product managers, content creators. Use automated multi language translation instead of wasting time copy-pasting all your text into online translators. &lt;strong&gt;&lt;a href="https://devtranslate.app"&gt;Try DevTranslate for free!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devtranslate.app"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkchvi5c8vv4ix6aahxsu.png" alt="Try DevTranslate" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mobile</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Unstated Next vs Redux, which is better for managing state in React</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Wed, 06 Jul 2022 05:18:24 +0000</pubDate>
      <link>https://forem.com/aexol-studio/unstated-next-vs-redux-which-is-better-for-managing-state-in-react-2ph9</link>
      <guid>https://forem.com/aexol-studio/unstated-next-vs-redux-which-is-better-for-managing-state-in-react-2ph9</guid>
      <description>&lt;p&gt;&lt;em&gt;Blog post by &lt;a href="https://aexol.com/"&gt;Michał Tyszkiewicz - Aexol&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;State management in React, despite being a key aspect of development and having a ton of useful tools and libraries, is still not solved, or even close to that. Most have stuck with Redux over the years, but the ever growing number of new state management libraries suggests there is a lot of space for improvement. Over the years React has dropped in a lot of help, like the Context API or Hooks. While this was initially seen by some as the end of Redux, that has not materialized to say the least, and Redux remains the most widely used state management tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everyone uses Redux
&lt;/h2&gt;

&lt;p&gt;Redux has been the much maligned and yet still most widely used state management tool ever since it came out victorious from the so called flux wars, a period when various libraries based on Facebook’s Flux architecture vied for the title of the top state management solution in React. That turned out to be Redux as it overshadowed the other libraries. Over the years however, there have been a lot of complaints about it, mostly relating to boilerplate and performance issues as Redux is not meant to be quick or simple, its purpose is being predictable, i.e. making it easy to see state updates.&lt;/p&gt;

&lt;p&gt;In fact a lot of the complaints are a product of its wide adaptation as it has led to overuse. Since Redux focuses on making it easy to read state updates not every app even needs it (or might be better off with a different state management library) On top of that because of the whole ‘single source of truth’ approach a lot of people tend to just stick everything in their app into Redux which isn't the best idea either. Additionally as Redux is the go to solution for state management it means you are somewhat forced to use it and it does have a learning curve and some issues that might not be to everyone's liking, especially those used to Object Oriented Programming.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is Unstated Next better?
&lt;/h2&gt;

&lt;p&gt;On the other hand some newer libraries have chosen to make full use of the new tools provided by React. One of them is Unstated Next which was basically built on top of the React Context API. It's a spiritual successor to Unstated and its main focus is keeping everything as simple and small as possible. How? It relies on simply using React and the tools it provides like Hooks and Context to the fullest, while also providing the useful addition of Containers. These are just like components, but only for state. You simply put a piece of state into a Container, other components can subscribe to it and any change to the state in the Container triggers a rerender of the subscribed components. Let’s look at a simple comparison with Redux:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;smaller and faster&lt;/strong&gt;: Unstated-Next pretty much boils down to built-in React functionalities and componentizing everything, which makes it a number of times smaller as well as significantly faster than Redux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;way simpler&lt;/strong&gt;: There's almost no learning curve, it will take you maybe 5 minutes if you know how to use &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useContext&lt;/code&gt; and custom Hooks (which lets be real, you do if you’re using React) Additionally the containers also make it easier to get around everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;written in Typescript&lt;/strong&gt;: Typescript support out of the box means type-checking and less need for testing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;built around containers&lt;/strong&gt;: This means less boilerplate and simply relying on the Context API under the hood. It also makes integrating with any react library a simple process by doing it one component at a time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overuse is not a good idea
&lt;/h2&gt;

&lt;p&gt;Many saw the addition of Hooks as something that will make Redux obsolete (or maybe were eager for an opportunity to ditch it) The thought was that the &lt;code&gt;useContext&lt;/code&gt; and &lt;code&gt;useReducer&lt;/code&gt; hooks would be used for state management instead of using a global state container like Redux. This has not materialized and it remains the go to tool for state management. It even has its own Hooks API now making use of the new things React has provided. While Redux is much maligned for the above mentioned reasons it isn't bad, it's simply overused and relied on too heavily due to being so widely adopted for so long. Instead of complaining about having to use Redux with all its issues we should instead focus on figuring out when we can use alternatives like Unstated Next which will fit our project better. The React state management ecosystem is constantly changing so we don't have to ditch one tool for the other. We can simply keep on relying on Redux when/if needed and try to get on with some newer solutions which can be better in other cases. Additionally although Hooks have not made Redux obsolete some new thing always can, so its good to keep an eye out for that!&lt;/p&gt;




&lt;h2&gt;
  
  
  Hire us
&lt;/h2&gt;

&lt;p&gt;Need help with software development? In &lt;a href="https://aexol.com/"&gt;Aexol&lt;/a&gt;, we work with bleeding-edge new technologies. Our stack is based on many different languages and technologies. We can help you with what we’re best at: TypeScript, React Native, ReactJS, Angular, GraphQL, Docker, Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aexol.com/estimate/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MSx8SOfo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhnt704wjj2rkisnin71.png" alt="Hire Aexol developers" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Unstated: a light &amp; simple state management library for React</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Wed, 20 Apr 2022 05:50:45 +0000</pubDate>
      <link>https://forem.com/aexol-studio/unstated-a-light-simple-state-management-library-for-react-3b4e</link>
      <guid>https://forem.com/aexol-studio/unstated-a-light-simple-state-management-library-for-react-3b4e</guid>
      <description>&lt;p&gt;&lt;em&gt;Blog post by &lt;a href="https://aexol.com/posts/perks-of-native-app-development/"&gt;Michał Tyszkiewicz - Aexol&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;State management is a bit of a boogeyman when it comes to React, if you ask those who don't want to get into it, that will probably be the reason they’ll give you. State management does become quite a bit of work as your app grows and you often need libraries to help with that. That’s what turns a lot of people off as most devs experienced with React have their top 5 state management libraries if not a top 10. Either that or they simply stuck with Redux and never bothered looking for some other option.&lt;/p&gt;

&lt;p&gt;Redux is the most popular library for state management, but far from the only one and some of them are based on one another like Rematch is on Redux, which makes it hard to wonder why it all serves as a major turn off for people who are looking to get into React. The whole thing seems complicated with a lot of learning required to find the right solution and even then you might still have to deal with a lot of boilerplate or need to jump on some other more advanced library built on the one you were using. This creates the often seen view that state management in React is bothersome as you either have to stick with the most commonly used tool (which is widely criticised in the community) or need to engage in a never ending cycle of looking for the newest library with all the additional features and functions. If that sounds like a hassle, fortunately there is one much simpler library that might just be what you’re looking for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yjNRecxG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c6cwytctk5jr5x8t3umv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yjNRecxG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c6cwytctk5jr5x8t3umv.png" alt="Unstated logo" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Unstated
&lt;/h2&gt;

&lt;p&gt;In React state basically lives on components and that makes it predictable, transparent and easy to work with or test. Even if you’re not familiar with React, a brief look at those components will usually give you a pretty good idea of what they're supposed to do. Continuing with this approach everything, including state, is shared through Context, you pass some state into a Provider component and a Consumer component will receive it. This makes for a simple and efficient solution as it doesnt need to pass through the entire tree and ends up exactly where you want it. While this is great, what if you want to share state across multiple components? Well this is where Unstated comes in, it's all about combining Component State and Context while keeping things simple. It's a really small library comprised of three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Containers&lt;/strong&gt;: these are a class which is basically like components but used only for state. You simply paste a piece of your state into a Container and components can subscribe to the state in it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscribers&lt;/strong&gt;: components which are used to deliver the state to the components that need it. Any change in the state in the container automatically triggers a re-render of the subscriber components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Providers&lt;/strong&gt;: components which hold all of the instances of your containers and allow its children to subscribe to them. They are used at the top level around components that you want to subscribe to a container.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Unstated-next
&lt;/h2&gt;

&lt;p&gt;As you can see Unstated was a great tool and helped share logic and state in a quick and simple way, something that was sorely missing in React. That said, React later introduced Hooks which basically filled the niche Unstated was in and to be brutally honest kinda made it redundant. The creator of Unstated Jamie Kyle realised that, but also saw another niche for a library and that’s how he came up with the idea for Unstated-next. The niche was that a lot of devs didn't see how to use Hooks to share state and logic so the goal was a spiritual successor to Unstated which would help understand shared state and logic in React by using the same base concept.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;keep it simple&lt;/strong&gt;: Unstated-next just wants you to use React Hooks and Context to their fullest using the same container system Unstated did&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;keep it small&lt;/strong&gt;: at around 200 bytes and needing only a few minutes to get a hang on the library is really miniature&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;componentize everything&lt;/strong&gt;: having everything in components does wonders for performance and especially testing, integrating with any other React library will also be smooth since you can do it one component at a time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  It's all about React
&lt;/h2&gt;

&lt;p&gt;The key thing about Unstated is that it encourages you to simply use React and just throws in a clever solution like Containers for you to use when needed. When used correctly with Hooks and Context, which are powerful tools by themselves, it will make state management much easier without the need for learning to use some more complicated state management libraries or dealing with lots of boilerplate code. While there are obviously cases where you might need a more complex tool and the minimalistic approach of Unstated-next simply wont be enough it is definitely the way to&lt;br&gt;
 go if you’re just starting with React or if you just want to keep state management a simple and easy affair.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hire us
&lt;/h2&gt;

&lt;p&gt;Need help with software development? In &lt;a href="https://aexol.com/"&gt;Aexol&lt;/a&gt;, we work with bleeding-edge new technologies. Our stack is based on many different languages and technologies. We can help you with what we’re best at: TypeScript, React Native, ReactJS, Angular, GraphQL, Docker, Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aexol.com/estimate/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MSx8SOfo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhnt704wjj2rkisnin71.png" alt="Hire Aexol developers" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Native mobile development</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Tue, 05 Apr 2022 06:49:52 +0000</pubDate>
      <link>https://forem.com/aexol-studio/native-mobile-development-1kbe</link>
      <guid>https://forem.com/aexol-studio/native-mobile-development-1kbe</guid>
      <description>&lt;p&gt;&lt;em&gt;Blog post by &lt;a href="https://aexol.com/posts/perks-of-native-app-development/"&gt;Michał Tyszkiewicz - Aexol&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;According to the latest data, mobile device users spend almost 90% of their time on apps and only around 10% on browsing the internet. With the growing popularity of mobile devices in general and apps in particular, almost everyone wants to make one, and as quickly as possible. Due to this hybrid development has been growing in popularity, as its advantages are primarily related to cost efficiency and faster time-to-market. However getting your app out quickly is far from a guarantee that people will want to actually use it and that's where a different approach might prove to be more sensible ie. native app development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native mobile apps - perks overview
&lt;/h2&gt;

&lt;p&gt;Once you look past the basics native development does have quite a few advantages worth taking into account. Hybrid technologies have made great strides recently in the areas of optimization, security, and user experience, and are constantly working to definitively bridge the gap between native and hybrid approaches in these areas. A well-built React Native or Flutter application will not differ much from a native one, still native apps offer better benchmarks in some areas out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; -  native app performance is still significantly better as they are optimized for a specific platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Experience&lt;/strong&gt; - for the same reason they are more intuitive and interactive, resulting in an overall better user experience. Although the look and feel of UI components is more or less the same in native and hybrid applications, there are still some aspects where differences are noticeable such as visual interactions, gesture controls that are seamlessly integrated in native apps and match the style of the operating system to which a user is familiar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning curve&lt;/strong&gt; - once a user learns to use their device, they don't want to do it again with every new app they install, native app development results in an app that is more embedded in the feel of the particular platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; - native apps offer the best in class security and that’s why they are still usually preferred by fintech apps&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Initial app launch - does your app need to be available on both Android and iOS right away?
&lt;/h2&gt;

&lt;p&gt;There is a common belief in the business world that their company's app must be immediately available on both iOS and Android.&lt;/p&gt;

&lt;p&gt;Of course, it is true that being present on both platforms has its advantages and if you absolutely need your app delivered in the shortest possible time on both platforms, you should consider using hybrid technologies such as React Native or Flutter instead of native ones.&lt;/p&gt;

&lt;p&gt;However, if you think that native technologies offer what your product needs, ask yourself if you really need to have your app available on both platforms at once?&lt;/p&gt;

&lt;p&gt;No one is perfect and software development is a process. Be sure that no matter how well prepared you are, your application will need constant adjustments, the features will change after being confronted with the needs and preferences of users, it will also need to be improved and adapted to the constantly changing technological environment. Starting with one platform lets you avoid duplicating mistakes in the fields of functionality, technology and business assumptions on a second platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  The platform question - which platform you should start with?
&lt;/h2&gt;

&lt;p&gt;The first choice in regard to native development is obviously picking the platform you want to develop the app for: iOS or Android. iOS dominates the European and Asian markets with about 70-80% market share and the US market is split about 50-50. Obviously you don't have to pick one and can develop your app for both platforms, but this is where the costs and time constraints come in. While the overall product will have the above mentioned advantages due to being developed natively, it will take more time and effort and most likely will need separate devs or teams for iOS and Android. So if you’re targeting a market dominated by iOS it might be prudent to focus on that and leave getting out an Android version of your app for later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native mobile platforms - the overview
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apple ecosystem - iOS
&lt;/h3&gt;

&lt;p&gt;If you’re picking iOS the first choice is picking the language, Objective-C or Swift. Good old Objective-C has been around since the 80s and Apple has been using it since the mid 90s, it still does have its uses and has been tried and tested over the years. The truth though is that everyone is moving on from it because Swift just has it beat. Apple developed it specifically as an improvement and it's faster (2.6 times faster according to Apple) safer, less complex and easier to maintain.&lt;/p&gt;

&lt;p&gt;The choice obviously comes down to personal preference and if you want to stick with Objective-C because you or your team are familiar with it or you already have a project with a large Objective-C codebase you can do so, but Swift is simply better if you’re starting out. With the language picked you have a number of tools that will help you with development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swift Playgrounds&lt;/strong&gt;: a platform for learning to code with Swift in a fun way&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xcode&lt;/strong&gt;: the official integrated development environment (IDE) for iOS development, with extensive documentation, interface builder, simulator, graphical debugger and a bunch of other features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS SDK&lt;/strong&gt;: a package of tools which helps you with native app development by providing access to various functions and services of iOS devices, like hardware and software attributes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TestFlight&lt;/strong&gt;: an online testing service for iOS devs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Google ecosystem - Android
&lt;/h3&gt;

&lt;p&gt;For Android the choice of language is somewhat similar, its Java or Kotlin and once again one language is much older and the other has some new improvements. It's not as easy here though, as although Kotlin has been gaining traction and has recently been adopted by Google as the official language for Android, it is still far less popular than Java and will likely remain so for the foreseeable future. Java is well established for good reason as it is a great multi purpose language, Kotlin on the other hand does bring in quite a few new features. It combines object oriented and functional programming, requires less code and is faster to compile. Java on the other hand has a much larger community, is way more widespread and supports almost every server, device and operating system. Even Android itself was written in Java, so while Kotlin is the better language for Android app development, sticking with Java is perfectly understandable. Whichever language you choose Android also has a few useful tools which will help with development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Android SDK&lt;/strong&gt;: a package of useful tools which includes various libraries, a debugger, tutorials, documentation, a handset emulator and code samples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android Jetpack&lt;/strong&gt;: a suite of libraries to help developers follow best practices, reduce boilerplate code and write code that works consistently across Android versions and devices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  User experience vs time-to-market
&lt;/h2&gt;

&lt;p&gt;If you’re looking to make a test or demo app hybrid is definitely the way to go. That said native does have many advantages especially considering user experience so if you know what you want and you’re looking for quality it will most likely deliver. Platforms and market dynamics are important factors to consider though, while many are scared off by the fact you usually need separate teams for Android and iOS you might not even need an Android version of your app if you’re targeting a market dominated by iOS devices. Additionally the tools are also getting constantly improved by two tech giants in Apple and Google, which will have a further impact on the time and ease of native development in the future. Plus with millions of apps already on the market it might be better to focus on how yours will compete with them, rather than simply looking at costs and development time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hire us
&lt;/h2&gt;

&lt;p&gt;Need help with software development? In &lt;a href="https://aexol.com/"&gt;Aexol&lt;/a&gt;, we work with bleeding-edge new technologies. Our stack is based on many different languages and technologies. We can help you with what we’re best at: TypeScript, React Native, ReactJS, Angular, GraphQL, Docker, Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aexol.com/estimate/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MSx8SOfo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhnt704wjj2rkisnin71.png" alt="Hire Aexol developers" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>ios</category>
      <category>android</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>React `useImperativeHandle` Magic</title>
      <dc:creator>Tomek Poniatowicz</dc:creator>
      <pubDate>Sat, 26 Feb 2022 06:22:21 +0000</pubDate>
      <link>https://forem.com/aexol-studio/react-useimperativehandle-magic-m4g</link>
      <guid>https://forem.com/aexol-studio/react-useimperativehandle-magic-m4g</guid>
      <description>&lt;p&gt;&lt;em&gt;Blog post by &lt;a href="https://dev.to/aexol/"&gt;Artur Czemiel - Aexol&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;I am a full-stack TypeScript developer and I've been learning the Elm language a lot recently. Will I switch to Elm? Definitely not. However, the learning process helped me understand and demand more things in React.&lt;/p&gt;

&lt;p&gt;Today I will show you a React anti-pattern that will allow you to &lt;strong&gt;share state outside components&lt;/strong&gt;. Why would you do this? Why not use a hook? etc. etc. I will show you an example with a small form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is not a "real-world" example. In production env I am using this hook to create synchronized S3 File browser, but it might be too much for the sake of this article.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hook
&lt;/h3&gt;

&lt;p&gt;So this combination of State and Callback is to connect the ref function later and listen when the ref changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useImperativeRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;() =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;refState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setRefState&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;setRefState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;refState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The form
&lt;/h3&gt;

&lt;p&gt;We don't need anything fancy for this example so we will use a simple form with 2 inputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;useImperativeHandle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;FormValues&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;MyFormHandle&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormValues&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forwardRef&lt;/span&gt;&lt;span class="p"&gt;(({},&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ForwardedRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyFormHandle&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;setValues&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FormValues&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;useImperativeHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="nx"&gt;values&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
            &lt;span class="nx"&gt;setValues&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
            &lt;span class="nx"&gt;setValues&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using the form
&lt;/h3&gt;

&lt;p&gt;Et voila! We can listen to state changes of components underneath:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;setRef&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useImperativeRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyFormHandle&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Values changed!, Values: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MyForm&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, we can pass change functions and values, but let's be true - that's Yuck! In my opinion, this way is much more elegant and codeless in many cases.&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>tutorial</category>
      <category>elm</category>
    </item>
  </channel>
</rss>
