<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Leonard Sangoroh</title>
    <description>The latest articles on DEV Community by Leonard Sangoroh (@leonardsangoroh).</description>
    <link>https://dev.to/leonardsangoroh</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%2F1070608%2Fa619aa5e-36ff-433c-a685-6c91bf2a188f.jpeg</url>
      <title>DEV Community: Leonard Sangoroh</title>
      <link>https://dev.to/leonardsangoroh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leonardsangoroh"/>
    <language>en</language>
    <item>
      <title>My chats disappeared on Chatgpt</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Wed, 30 Jul 2025 19:13:04 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/my-chats-disappeared-on-chatgpt-54fp</link>
      <guid>https://dev.to/leonardsangoroh/my-chats-disappeared-on-chatgpt-54fp</guid>
      <description>&lt;p&gt;Today, something odd happened. I logged into ChatGPT on my laptop—like I always do, with a warm cup of tea in one hand and a hundred thoughts bouncing around in my head—and... nothing. No history. No trail of the endless conversations I’ve had over the past few month, maybe years. It was all blank.&lt;/p&gt;

&lt;p&gt;For a moment, I panicked. Had I been logged out? Had my account been reset? Or worse—had all those brilliant (and some &lt;em&gt;very&lt;/em&gt; dumb) ideas, ramblings, and questions I’d shared with ChatGPT just... disappeared?&lt;/p&gt;

&lt;p&gt;ChatGPT has slowly become a sort of ritual for me. It’s my thinking companion when I’m stuck, my brainstorming partner for weird app ideas, my therapist when I’m spiraling, and my cheerleader when I finally get something right. So losing all that felt strangely personal. Like walking into your favorite coffee shop only to find it boarded up, with no warning.&lt;/p&gt;

&lt;p&gt;But here’s where it gets weird.&lt;/p&gt;

&lt;p&gt;I opened the ChatGPT mobile app—and &lt;em&gt;bam&lt;/em&gt;, there it was. &lt;strong&gt;My entire chat history was intact on mobile.&lt;/strong&gt; Conversations going back days, weeks. All right there. I could scroll through them, search them, read them like nothing had ever happened.&lt;/p&gt;

&lt;p&gt;So what’s going on?&lt;/p&gt;

&lt;p&gt;Probably a bug. Maybe something temporary with the web interface. I’ve seen others mention it too, so I’m hoping it’s just a hiccup on OpenAI’s side. But it got me thinking about how much these chats actually mean to me now. They’re not just “conversations with AI” anymore. They’re a digital breadcrumb trail of my thoughts, curiosities, and half-built dreams.&lt;/p&gt;

&lt;p&gt;It’s funny how quickly something becomes part of your day. How a tool turns into a ritual. And how much you notice when it’s missing—even if just for a moment.&lt;/p&gt;

&lt;p&gt;So for now, I’ll keep using the mobile app. I’ll trust that the desktop history will come back when it’s ready. And I’ll keep showing up, one chat at a time.&lt;/p&gt;

&lt;p&gt;After all, it’s not just about the answers—it’s about the conversation.&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>openai</category>
      <category>ai</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Database Normalization Summary</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Mon, 21 Apr 2025 08:22:38 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/database-normalization-summary-1jgk</link>
      <guid>https://dev.to/leonardsangoroh/database-normalization-summary-1jgk</guid>
      <description>&lt;h2&gt;
  
  
  Normalization
&lt;/h2&gt;

&lt;p&gt;The process of structuring data in a way to curb redundancy and ensure data integrity&lt;/p&gt;

&lt;h3&gt;
  
  
  1NF
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Using row order to convey information violates 1NF, e.g., arranging numbers from smallest to largest without indexing&lt;/li&gt;
&lt;li&gt;Mixing data types within a column violates 1NF&lt;/li&gt;
&lt;li&gt;Designing a table without a primary key violates 1NF&lt;/li&gt;
&lt;li&gt;Storing a repeating group of data items on a single row violates 1NF&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2NF
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each non-key attribute must depend on the entire primary key&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3NF
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Every non-key attribute in a table should depend on the (primary) key, the whole key, and nothing but the key. There should be no dependency between non-key columns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Boyce-Codd Normal Form
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Every &lt;del&gt;non-key&lt;/del&gt; attribute in a table should depend on the (primary) key, the whole key, and nothing but the key. There should be no dependency between non-key columns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4NF
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multivalued dependencies in a table must be multivalued dependencies on the (primary) key. (multivalued dependency - e.g. a sweater can be available in more than one color)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5NF
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The table, which must be in 4NF, can’t be described as the logical result of joining some other tables together&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>databasedesign</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>TimeSync: Ensure Enhanced Communication Efficiency for Remote Workers</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Mon, 02 Sep 2024 02:09:45 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/timesync-ensure-enhanced-communication-efficiency-for-remote-workers-3bho</link>
      <guid>https://dev.to/leonardsangoroh/timesync-ensure-enhanced-communication-efficiency-for-remote-workers-3bho</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/nylas"&gt;Nylas Challenge&lt;/a&gt;: AI Expedition.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built and Why
&lt;/h2&gt;

&lt;p&gt;TimeSync is a productivity tool designed to enhance communication among remote colleagues or those spread across different time zones. The primary motivation behind this project was to address the challenges of coordinating communication across various time zones, which often affects remote workers and results in inefficiencies and missed messages. TimeSync leverages the Nylas contacts APIs and intelligent decision-making to suggest the optimal communication method—be it a call, text, email, or meeting request—based on the current time, recipient availability, and additional user context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The video demonstration of TimeSync can be found &lt;a href="https://www.youtube.com/watch?v=2jRobUvUssI" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/2jRobUvUssI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmarkdown-videos-api.jorgenkh.no%2Fyoutube%2F2jRobUvUssI" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The source code for TimeSync can be found &lt;a href="https://github.com/leonardsangoroh/TimeSync" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Journey
&lt;/h2&gt;

&lt;p&gt;This idea/application is as a result of a problem I have faced before while working remotely as a freelancer. Every once in a while, a client would use the phrase, "sorry, I was asleep, or, I couldn't pick your call because it was late in the night where I am." &lt;br&gt;&lt;br&gt;
This small problem that has been lingering in my mind, and the announcement of the Nylas challenge, led to the birth of TimeSync. I drew a plan to build the MVP and followed it to the latter. &lt;br&gt;&lt;br&gt;
Leveraging the Nylas API was a key part of the project. Through this integration, I was able to retrieve contact information, which is crucial for the functioning of TimeSync. The API made it easy to seamlessly import and organize contact information in the table view &lt;br&gt;&lt;br&gt;
This challenge also introduced me to unfamiliar grounds. For the first time, I incorporated an LLM into my project. This was another highlight for me! The role of the Gemini LLM is providing intelligent assistance in determining the best communication method based on contextual factors. This feature improved the application's ability to offer personalized advice and make more informed decisions. &lt;br&gt;&lt;br&gt;
I am happy to say that I will by my first user! The combination of Nylas, Gemini, and other technologies have brought out a great software that facilitates better communication and also enhances productivity by reducing the likelihood of mis-aligned communication times and channels. &lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank You!
&lt;/h2&gt;

&lt;p&gt;Thank you to the Dev and Nylas API teams. Thanks to you, I have been able to not only work on a solution that I will use, but also learnt a lot in the realm of API integration, LLM integration, and I have eventually added a skillset in mobile application development too.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>nylaschallenge</category>
      <category>api</category>
      <category>ai</category>
    </item>
    <item>
      <title>ForestWatch: An IoT-Based Forest Fire and Deforestation Detection System</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Tue, 20 Aug 2024 00:52:45 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/forestwatch-an-iot-based-forest-fire-and-deforestation-prevention-system-1n7e</link>
      <guid>https://dev.to/leonardsangoroh/forestwatch-an-iot-based-forest-fire-and-deforestation-prevention-system-1n7e</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/nylas"&gt;Nylas Challenge&lt;/a&gt;: Galaxy Brain.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built and Why
&lt;/h2&gt;

&lt;p&gt;This project is a comprehensive IoT-based system designed to detect and mitigate forest fires and illegal logging activities. The motivation behind this project stems from the alarming statistics surrounding deforestation and forest fires. &lt;br&gt;&lt;/p&gt;

&lt;p&gt;Globally, illegal logging accounts for up to 15-30% of all wood traded, contributing significantly to deforestation. Every year, approximately 15 billion trees are cut down, which leads to a loss of biodiversity, disruption of ecosystems, and increased carbon emissions. Forest fires, another critical threat, destroy nearly 4.2 million square kilometers of forested area annually, releasing massive amounts of carbon dioxide and other pollutants into the atmosphere. &lt;br&gt;&lt;/p&gt;

&lt;p&gt;The implementation of IoT systems like the one developed in this project can play a crucial role in reducing these devastating effects. By providing real-time monitoring and early detection of forest fires and illegal logging activities, such systems can enable quicker response times, potentially reducing forest fire damage by up to 50% and illegal logging by a significant margin. &lt;br&gt;&lt;/p&gt;

&lt;p&gt;Through this project, I aimed to build an integrated system that not only detects these activities but also automates the process of notifying relevant authorities, marking incidents on a calendar, and analyzing data through a user-friendly dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Below is a YouTube Video to a demonstration of the system.&lt;br&gt;
&lt;a href="https://youtu.be/bEa08EP9PCo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmarkdown-videos-api.jorgenkh.no%2Fyoutube%2FbEa08EP9PCo" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;You can find the complete codebase for ForestWatch project &lt;a href="https://github.com/leonardsangoroh/ForestWatch" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Feel free to create an issue suggesting new features you would like to see in the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Journey
&lt;/h2&gt;

&lt;p&gt;Throughout this project, integrating Nylas played a pivotal role in achieving the goal of creating an automated and responsive forest monitoring system. Leveraging the Nylas APIs enabled seamless communication and notifications, which are essential for real-time forest management and response to illegal activities. &lt;br&gt;&lt;/p&gt;

&lt;p&gt;I utilized the Nylas API to automate the process of notifying authorities whenever a potential forest fire or deforestation activity was detected. The API allowed me to fetch contact information (using contacts API) of relevant authorities dynamically and send them immediate email alerts (using email API). This integration was crucial in ensuring that the right people were informed at the right time, potentially reducing the response time to these incidents.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Furthermore, Nylas was instrumental in scheduling calendar events to log when illegal activities occurred(using calendar API). This automated tracking ensured that the timeline of events was meticulously recorded, helping in the analysis and understanding of patterns related to forest crimes.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;One of the most rewarding aspects of this journey was learning the intricacies of the Nylas API and understanding how it could be used to bridge the gap between IoT data and actionable responses. Implementing these features has given me a deeper appreciation for how technology, such as Nylas, can be harnessed to create meaningful impact in environmental conservation.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>nylaschallenge</category>
      <category>api</category>
      <category>nylas</category>
    </item>
    <item>
      <title>Key Concepts to Understand Before Diving into Nylas</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Mon, 12 Aug 2024 07:14:55 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/key-concepts-to-understand-before-diving-into-nylas-845</link>
      <guid>https://dev.to/leonardsangoroh/key-concepts-to-understand-before-diving-into-nylas-845</guid>
      <description>&lt;h2&gt;
  
  
  Must-Know Concepts Before You Dive into Nylas
&lt;/h2&gt;

&lt;p&gt;So, I was ready to get started with Nylas and its powerful APIs, but before I jumped in, it was worth taking a moment to make sure I got a good grasp of a few essential concepts. These are the building blocks that will not only helped me use Nylas effectively but also made my development process smoother and more secure.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Python Virtual Environment: Keeping Things Tidy
&lt;/h3&gt;

&lt;p&gt;Let’s start with Python virtual environments. Think of them as little bubbles where you can keep all the tools and packages your project needs, without them getting mixed up with others. If you’ve ever had a project break because of conflicting versions of a package, you’ll appreciate the magic of virtual environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why You Need It&lt;/strong&gt;: When working with Nylas, you’ll be installing specific libraries and dependencies. A virtual environment keeps all these in one place, ensuring that everything works together harmoniously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Create One&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run this command to set up your environment:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv myenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Then, activate it with:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="nb"&gt;source &lt;/span&gt;myenv/bin/activate  &lt;span class="c"&gt;# On Windows: myenv\Scripts\activate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now you can install Nylas and other dependencies without worrying about messing up your system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;.gitignore&lt;/code&gt; File: Keeping Secrets Secret
&lt;/h3&gt;

&lt;p&gt;Next up is the &lt;code&gt;.gitignore&lt;/code&gt; file. If you’re using Git, &lt;code&gt;.gitignore&lt;/code&gt; is your best friend. It tells Git which files to ignore, so you don’t accidentally share things like API keys, passwords, or those random files your editor generates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why It’s Important&lt;/strong&gt;: When you start working with Nylas, you’ll have some sensitive info—like API keys—that you don’t want to push to GitHub. The &lt;code&gt;.gitignore&lt;/code&gt; file helps you keep those under wraps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to Include&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add things like your &lt;code&gt;.env&lt;/code&gt; file, which we’ll talk about next, and other sensitive files:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; .env
 __pycache__/
 *.log
 node_modules/
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;.env&lt;/code&gt; File: Storing Your App’s Secrets
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;.env&lt;/code&gt; file is where you’ll store your app’s sensitive data, like API keys, in a safe and organized way. It’s like a vault where you keep all the important stuff your app needs but doesn’t want to share with the world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why You’ll Love It&lt;/strong&gt;: Instead of hard-coding sensitive data into your code (bad idea), you’ll put it in a &lt;code&gt;.env&lt;/code&gt; file. This way, your code stays clean, and your secrets stay secret.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting It Up&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file in your project and add your secrets:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; NYLAS_CLIENT_ID=your_client_id
 NYLAS_CLIENT_SECRET=your_client_secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Load these variables into your application with a library like &lt;code&gt;dotenv&lt;/code&gt; in Python:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
 &lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. OAuth 2.0: The Key to Secure Access
&lt;/h3&gt;

&lt;p&gt;OAuth 2.0 might sound a bit technical, but it’s all about making sure the right people have access to the right things—without sharing their passwords. It’s a secure way to let your app connect to services like Nylas on behalf of your users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why It Matters&lt;/strong&gt;: Nylas uses OAuth 2.0 for authentication, so knowing how it works is essential. This ensures your app can access users’ emails, calendars, and contacts securely and responsibly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users grant your app access, and in return, your app gets an access token.&lt;/li&gt;
&lt;li&gt;This token allows your app to interact with Nylas’s API on the user’s behalf, without ever seeing their password.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Google Cloud Platform (GCP): Where the Magic Happens
&lt;/h3&gt;

&lt;p&gt;Google Cloud Platform is like a giant toolbox for developers, offering everything from data storage to machine learning. If your app uses Google services (like Gmail or Google Calendar), you’ll likely need to interact with GCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why You Should Know It&lt;/strong&gt;: If you’re using Nylas to connect with Google services, you’ll need to set up and manage API keys and credentials through GCP. Knowing your way around this platform will make your life a lot easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Google Cloud Console: Your Control Center
&lt;/h3&gt;

&lt;p&gt;The Google Cloud Console is where you’ll manage everything on GCP. It’s like the dashboard of a car—everything you need is right at your fingertips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why It’s Handy&lt;/strong&gt;: When you’re setting up OAuth 2.0 credentials or managing APIs for Nylas, you’ll be spending some time here. Knowing how to navigate the console will save you time and headaches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Things You’ll Do Here&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create and manage OAuth 2.0 credentials.&lt;/li&gt;
&lt;li&gt;Monitor your API usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. JSON Web Tokens (JWT): Passing Information Securely
&lt;/h3&gt;

&lt;p&gt;Finally, we have JSON Web Tokens (JWTs). These are small, compact tokens that securely pass information between parties. They’re often used in conjunction with OAuth 2.0 to make sure data is shared safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why They’re Important&lt;/strong&gt;: When your app talks to Nylas, JWTs might be used to verify that everything is on the up-and-up. Understanding JWTs will help you implement secure authentication in your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What They Look Like&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A JWT is split into three parts: the header, payload, and signature.&lt;/li&gt;
&lt;li&gt;Together, these ensure that the data hasn’t been tampered with and that it’s coming from a trusted source.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  That's it!
&lt;/h2&gt;

&lt;p&gt;So, take a little time to brush up on these topics. Your future self will definitely thank you!&lt;/p&gt;

</description>
      <category>nylaschallenge</category>
      <category>jwt</category>
      <category>oauth</category>
      <category>python</category>
    </item>
    <item>
      <title>My Journey with Nylas: Embracing the Challenge</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Tue, 06 Aug 2024 21:00:00 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/my-journey-with-nylas-embracing-the-challenge-3ca2</link>
      <guid>https://dev.to/leonardsangoroh/my-journey-with-nylas-embracing-the-challenge-3ca2</guid>
      <description>&lt;p&gt;Welcome to the first blog series exploring the Nylas API! As an iOS developer, I am always on the lookout for tools that can enhance my skill set and improve the functionality of apps I build. &lt;br&gt;
Recently, I came across the Nylas API, a tool designed to simplify email, calendar, and contacts integration. This discovery coincides perfectly with the .DEV challenge that I am excited to participate in(I hope you are too! 🤩)&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Nylas?
&lt;/h2&gt;

&lt;p&gt;Nylas offers a unified API that supports multiple email providers, making it easier to integrate email communication and calendar functionalities into applications. &lt;br&gt;
In addition, it also has the contacts API which we could incorporate in some of our applications. &lt;/p&gt;

&lt;h2&gt;
  
  
  My Motivation
&lt;/h2&gt;

&lt;p&gt;Participating in the .DEV challenge is my primary motivation for diving into the Nylas API. Although I have used a number of APIs in the past, I have never used Nylas before. &lt;br&gt;
This challenge presents an excellent opportunity for me to push my boundaries, learn something new, and apply it in a practical context.&lt;br&gt;
By the end of this challenge, I aim to have a thorough understanding of the Nylas API and successfully integrate it into a project I am yet to build. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Plan
&lt;/h2&gt;

&lt;p&gt;Here is how I plan to approach this learning experience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Learning the basics&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;I will start by exploring the official Nylas API documentation which will help me understand the core functionalities of the Email, Calendar, and Contacts API.&lt;/li&gt;
&lt;li&gt;I will also supplement the documentation with YouTube tutorials provided by the Nylas team.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building a Project&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;For the .DEV challenge, I am considering building a productivity tool that integrates email and calendar functionalities. This will help me understand the practical applications of Nylas and also provide a good portfolio project. It is important to note that this is not the project I have decided to fully pursue as I have other projects in mind still.&lt;/li&gt;
&lt;li&gt;I will document progress made and share learnings through this blog series, providing insights and tips for those interested in using Nylas either for this challenge or in the future.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overcoming Challenges&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Since this is a new technology, I expect to encounter challenges along the way. I will use these opportunities to deepen my understanding and find creative solutions.&lt;/li&gt;
&lt;li&gt;However, I trust that with this community of developers, no task is insurmountable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;While my immediate goal is to excel in the .DEV challenge, I believe that mastering the Nylas API will have a long-term benefit for my iOS development journey. By integrating email, calendar, and contact functionality seamlessly into my apps, I can enhance user experiences and build more robust applications. Nylas' ability to support multiple providers through a single API will also save development time and effort, allowing me to focus on creating innovative features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join Me on This Journey
&lt;/h2&gt;

&lt;p&gt;Kindly let's joint this exciting journey as we explore the Nylas API and document our experiences. Stay tuned for my next post, where I will dive into the basics of the Nylas API and share my initial impressions and learnings.&lt;/p&gt;

</description>
      <category>nylaschallenge</category>
      <category>devchallenge</category>
      <category>api</category>
    </item>
    <item>
      <title>The Importance of Good Health for Indie Developers</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Sun, 09 Jun 2024 13:03:23 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/the-importance-of-good-health-for-indie-developers-55o2</link>
      <guid>https://dev.to/leonardsangoroh/the-importance-of-good-health-for-indie-developers-55o2</guid>
      <description>&lt;p&gt;Indie development is an exciting and sometimes, rewarding field as it offers the freedom to create and innovate. However, it also comes with unique challenges, especially when it comes to maintaining good health. In this post, we will explore why good health is crucial for us, Indie Developers, and look at how we can achieve a healthy work-life balance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who's an Indie Dev?
&lt;/h3&gt;

&lt;p&gt;An indie developer is simply someone who creates or intends to create software, games, or applications independently or as a part of a small team, without the financial backing of a large company. Indie devs often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work on passion projects&lt;/li&gt;
&lt;li&gt;Manage all aspects of development; from coding and design to marketing and distribution&lt;/li&gt;
&lt;li&gt;Face common challenges; limited resources, balancing multiple roles, and financial project sustainability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Focus on &lt;strong&gt;Our Health&lt;/strong&gt; as Indie Devs?
&lt;/h3&gt;

&lt;p&gt;The indie dev description above has clearly shown that we wear many hats. This multitasking can lead to long working hours and intense pressure, making it easy for us to neglect our health. Yet, maintaining good health is essential for sustaining productivity, creativity, and overall well-being. Focusing on our health as indie developers is crucial for several reasons;&lt;br&gt;
&lt;strong&gt;1. Sustained Productivity&lt;/strong&gt;&lt;br&gt;
Good health helps maintain high levels of energy and focus, which are essential for long coding sessions and creative problem-solving&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Enhanced Creativity&lt;/strong&gt;&lt;br&gt;
A healthy mind and body can improve cognitive functions and foster creativity, enabling you to come up with innovative solutions and ideas that can change the world for the better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Prevention of Burnout&lt;/strong&gt;&lt;br&gt;
Long hours and intense pressure can lead to burnout. Prioritizing our health helps prevent burnout, ensuring we can continue to work on our projects with enthusiasm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Longevity in Our Career&lt;/strong&gt;&lt;br&gt;
Maintaining good health is essential for a long and sustainable career. Imagine building a successful indie project that later reaches the global limelight but not being healthy enough to live and see its success. Neglecting our health can lead to this. Strive to live long so that you can see your once a little project, change this world for the better!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Better Decision-Making&lt;/strong&gt;&lt;br&gt;
Good health, especially &lt;strong&gt;mental health&lt;/strong&gt;, enhances decision-making, crucial for managing projects, deadlines, and business aspects of indie development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ways of Maintaining Good Health
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Physical Health
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Egonomics and Workspace Setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A proper ergonomic setup is crucial to prevent musculoskeletal issues. Invest in a good chair, desk, and monitor setup to promote a good posture.&lt;/li&gt;
&lt;li&gt;If you're blessed to have some extra coins, add ergonomic keyboards and a mouse to reduce strain on your hands and wrist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Regular Exercise&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regular physical activity boosts energy levels, improves mood, and has a positive impact on one's cognitive function.&lt;/li&gt;
&lt;li&gt;Simple exercises like walking can break up long periods of sitting on your desk and keep you active.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Healthy Eating&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A balanced diet is key to maintaining energy and concentration levels. &lt;/li&gt;
&lt;li&gt;Remember to always hydrate by drinking plenty of fluids throughout the day.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mental Health
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Stress Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If Indie development stresses you once in a while, then you are not alone, we are in this together. One coping mechanism I use is immediately noticing when I get stressed and start taking steps to manage it.&lt;/li&gt;
&lt;li&gt;Start healthy practices like mindfulness, meditation, and mental exercises. For me, they seem to work and I bet for you they might too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Work-Life Balance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set clear boundaries between work and personal life. This can be challenging when working from home, but it's essential to prevent burnout.&lt;/li&gt;
&lt;li&gt;As busy as our schedules are, make sure to allocate time for hobbies, socializing, and relaxation to recharge your mental batteries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Healthy Sleep Patterns&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quality sleep is vital for cognitive function and overall health. Establish a regular sleep schedule and create a restful sleep environment.&lt;/li&gt;
&lt;li&gt;Avoid screens before bedtime and consider relaxation techniques to improve sleep quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Parting Shot
&lt;/h3&gt;

&lt;p&gt;Good health is the cornerstone of a successful and sustainable indie development career. By prioritizing physical and mental health, we as indie devs can enhance our creativity, productivity, and overall quality of life. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you have any other health dimensions that are relevant to Indie Devs? Feel free to share with us in the comment section!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>programmers</category>
      <category>mentalhealth</category>
      <category>developers</category>
    </item>
    <item>
      <title>ChatGPT for macOS is Here!</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Thu, 23 May 2024 20:40:47 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/chatgpt-for-macos-is-here-3h2l</link>
      <guid>https://dev.to/leonardsangoroh/chatgpt-for-macos-is-here-3h2l</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Artificial intelligence has taken another leap forward in making our lives easier and more efficient. ChatGPT, the powerful AI developed by OpenAI, is now available as a standalone application for macOS users. &lt;br&gt;
Here is essential information you need to know as you incorporate this priceless tool into your daily workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation requirements
&lt;/h2&gt;

&lt;p&gt;For you to be eligible to successfully install ChatGPT for macOS, your Apple product needs to have met the following requirements;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your Mac must be running on macOS &lt;a href="https://apps.apple.com/us/app/macos-sonoma/id6450717509?mt=12" rel="noopener noreferrer"&gt;Sonoma&lt;/a&gt; (14.x) &lt;/li&gt;
&lt;li&gt;Your Mac must have a Silicon (M1 or better) chip&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;: You must also have the .dmg for you to install the application. If you don't have it yet, &lt;a href="https://github.com/leonardsangoroh/ChatGPTMacOSApp" rel="noopener noreferrer"&gt;here&lt;/a&gt; is a copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Must you have chatGPT Plus?
&lt;/h2&gt;

&lt;p&gt;On the official website, it clearly states that the app has been launched for both free and paid users. However, in some cases, it rejects the free version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of the New ChatGPT Desktop App for macOS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Seamless Integration
&lt;/h3&gt;

&lt;p&gt;With a simple keyboard shortcut (Option + Space), you can instantly ask ChatGPT a question. This feature allows you to quickly access the AI without interrupting your workflow. Learn more about &lt;a href="https://help.openai.com/en/articles/9295241-accessing-the-launcher-chatgpt-macos-app" rel="noopener noreferrer"&gt;accessing the launcher&lt;/a&gt; on the macOS app.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Screenshot and Discussion Capabilities
&lt;/h3&gt;

&lt;p&gt;You can take and discuss screenshots directly in the app, making it easier to share and analyze visual information. Learn more about how to &lt;a href="https://help.openai.com/en/articles/9295245-chatgpt-macos-app-screenshot-tool" rel="noopener noreferrer"&gt;take a screenshot&lt;/a&gt; with the macOS app.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Photo Conversations
&lt;/h3&gt;

&lt;p&gt;The app also enables you to start new conversations with photos from your computer, or new photos you take. This feature is particularly useful for discussing visual content or sharing creative ideas.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Voice Conversations
&lt;/h3&gt;

&lt;p&gt;Now, you can engage in voice conversations with ChatGPT directly on your computer. Begin with the Voice Mode feature, available since ChatGPT's initial release. Future updates will introduce GPT-4's enhanced audio and video capabilities. Whether you're brainstorming new business ideas, preparing for an interview, or discussing specific topics, you can start a voice conversation by clicking the headphone icon located in the bottom right corner of the desktop app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share your experience
&lt;/h2&gt;

&lt;p&gt;I’d love to hear about your experiences with the ChatGPT desktop app! What features do you find most useful, and what improvements or new capabilities would you like to see in future updates? Share your thoughts in the comments below and I will surely read them.&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>ai</category>
      <category>macos</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Add a custom color to your XCode Project</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Wed, 08 May 2024 21:18:00 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/add-a-custom-color-to-your-xcode-project-1p</link>
      <guid>https://dev.to/leonardsangoroh/add-a-custom-color-to-your-xcode-project-1p</guid>
      <description>&lt;p&gt;Every application has a personality, and nothing brings that personality to life quite like a unique and consistent color scheme. &lt;br&gt;
Not only does your app acquire a personality when using color schemes, but also enhances user experience and strengthens your brand.&lt;br&gt;
This guide will walk you through the steps to add a custom color to your Xcode Project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three main steps in adding a custom color&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define Your Custom Color&lt;/li&gt;
&lt;li&gt;Adding Color to the Asset Catalog&lt;/li&gt;
&lt;li&gt;Using the Custom Color in Your Code&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Step 1: Define Your Custom Colors
&lt;/h2&gt;

&lt;p&gt;Before getting onto Xcode, you need to select the color or color combination that will represent your application. Tools like &lt;a href="https://color.adobe.com/" rel="noopener noreferrer"&gt;Adobe Color&lt;/a&gt; and &lt;a href="https://colorhunt.co/" rel="noopener noreferrer"&gt;Color Hunt&lt;/a&gt; can help you develop a palette that fits your application's brand and consequently appeals to your audience.&lt;br&gt;
Make sure to get the hexadecimal code for the respective color.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Adding Color to the Asset Catalog
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open your Xcode project&lt;/li&gt;
&lt;li&gt;Navigate to the Asset Catalog&lt;/li&gt;
&lt;/ul&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%2F8xtddgy15fxun694axv7.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%2F8xtddgy15fxun694axv7.png" alt="Image description" width="800" height="917"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on the '+' and select 'New color set' sign on the bottom left of your asset catalog&lt;/li&gt;
&lt;/ul&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%2Fm5u7gvtoso3petd5tpfg.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%2Fm5u7gvtoso3petd5tpfg.png" alt="Image description" width="800" height="917"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To adjust the color of the asset, open the inspector on the right. In the inspector;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;change the name of the color to your preferred name by replacing the default name with your preferred one. In this case, we will set it to 'background-color'&lt;/li&gt;
&lt;li&gt;change which devices this color will be used on in the 'Devices' section&lt;/li&gt;
&lt;li&gt;change the 'Any Appearance' color value. On the 'input Method' field, select '8-bit hexadecimal'&lt;/li&gt;
&lt;li&gt;Paste the RGB hexadecimal color code on the 'Hex' field&lt;/li&gt;
&lt;/ul&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%2F2hg9gq72foiwlslo0bah.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%2F2hg9gq72foiwlslo0bah.png" alt="Image description" width="800" height="917"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Using the custom color in Your Code
&lt;/h2&gt;

&lt;p&gt;Now that you have successfully added your color to the assets catalog, you can use it in your code. Below is a code block&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if let customColor = UIColor(named: "background-color") {
    yourView.backgroundColor = customColor
} else {
    yourView.backgroundColor = UIColor.systemBlue // Fallback color
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>xcode</category>
      <category>ios</category>
      <category>swift</category>
      <category>swiftui</category>
    </item>
    <item>
      <title>Add a Custom Font to Your XCode Project</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Sat, 04 May 2024 18:54:59 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/add-a-custom-font-to-your-xcode-project-np2</link>
      <guid>https://dev.to/leonardsangoroh/add-a-custom-font-to-your-xcode-project-np2</guid>
      <description>&lt;p&gt;Typography is an important design element that, when used well, can positively impact how users perceive and interact with your application.&lt;br&gt;
By the end of this post, you will have known or reminded yourself how to add a custom font to your XCode Project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps involved in adding a custom font&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose and download your font&lt;/li&gt;
&lt;li&gt;Add the Font File to your project&lt;/li&gt;
&lt;li&gt;Using the Font in your application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Choose and download font&lt;/strong&gt;&lt;br&gt;
When choosing a font for your application design, you need to consider the factors such as the font's readability, its contrast, how well it can scale on different devices, and whether it matches your application's brand and color scheme.&lt;br&gt;
After deciding the font, download its .tff files. One can get these files from &lt;a href="https://fonts.google.com/" rel="noopener noreferrer"&gt;Google Fonts&lt;/a&gt;. In this example, we will download 'Sedan SC' font.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Search for any font on the Search bar (circled in red)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on 'Get Font' either at the top or bottom right of you browser window (circled in green)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on 'Download all'. Note that you can download multiple fonts at once by clicking this button&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Flvmv82kdlixb1qzmpw7l.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%2Flvmv82kdlixb1qzmpw7l.png" alt="Image description" width="800" height="957"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add the Font File to Project&lt;/strong&gt;&lt;br&gt;
Once you have downloaded the folder, unzip it to get the .tff file(s). &lt;br&gt;
Add them to the project by dragging and dropping them to your open project. Make sure to check the 'add to targets' check box as shown below. &lt;br&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%2Fsiad7n9r9us1z8pw563y.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%2Fsiad7n9r9us1z8pw563y.png" alt="Image description" width="800" height="850"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the font file to the Info.plist under the key 'Fonts provided by application' (or UIAppFonts if the Xcode version is different). You will achieve this by clicking the '+' sign on the 'Fonts provided by application' row then paste the font name (including its extension).&lt;br&gt;
The info.plist file should look like this after adding the font to it.&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%2Fkom9achfn7wc1ptozu33.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%2Fkom9achfn7wc1ptozu33.png" alt="Image description" width="800" height="850"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using the Font in Your Application&lt;/strong&gt;&lt;br&gt;
Below is a code block that shows the use of the imported font to configure the text of a button&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    func configureCallToActionButton() {
        view.addSubview(callToActionButton)
        callToActionButton.addTarget(self, action: #selector(openTestamentsVC), for: .touchUpInside)
        callToActionButton.backgroundColor = UIColor(named: "accent-blue")
        callToActionButton.setTitle("Som Muma →", for: .normal)
        callToActionButton.layer.cornerRadius = 10
        callToActionButton.setTitleColor(UIColor(named: "text-black"), for: .normal)
        callToActionButton.titleLabel?.font = UIFont(name: "SedanSC-Regular", size: 30)


        callToActionButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            callToActionButton.topAnchor.constraint(equalTo: logoImageView.bottomAnchor, constant: 5),
            callToActionButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 50),
            callToActionButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -50),
            callToActionButton.heightAnchor.constraint(equalToConstant: 75)
        ])
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ios</category>
      <category>macos</category>
      <category>xcode</category>
      <category>swift</category>
    </item>
    <item>
      <title>How I embarked on a Career in iOS and Indie Development</title>
      <dc:creator>Leonard Sangoroh</dc:creator>
      <pubDate>Fri, 03 May 2024 09:06:59 +0000</pubDate>
      <link>https://dev.to/leonardsangoroh/how-i-embarked-on-a-career-in-ios-and-indie-development-49b</link>
      <guid>https://dev.to/leonardsangoroh/how-i-embarked-on-a-career-in-ios-and-indie-development-49b</guid>
      <description>&lt;p&gt;&lt;strong&gt;Who I am&lt;/strong&gt;&lt;br&gt;
Hi there 👋🏾, my name is Leonard Sangoroh, a vibrant and fairly enthusiastic learner from Nairobi, Kenya interested in software development within the iOS development niche.&lt;br&gt;
I studied Informatics and computer science in university (like all other devs 😅) and I will be graduating later in the year hopefully. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Journey&lt;/strong&gt;&lt;br&gt;
My journey into the iOS and Indie development world started during my final year in university, where I took a course (though I didn't finish 💔) on mobile development. This course opened my eyes to what we can build with a MacBook, commitment, passion, and consistency. I was intrigued, not just by coding, but by the entire process of bringing an idea to life.&lt;/p&gt;

&lt;p&gt;Since then, I have been working towards becoming an iOS developer and soon, an Indie developer. I have given myself a year to do so, and hopefully, by the end of 2024, a skilled iOS developer will be added to the community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So why am I blogging?&lt;/strong&gt;&lt;br&gt;
Through this blog, I plan to share every step of my journey...our journey I mean, from frustrating bugs to breakthrough moments. &lt;br&gt;
I hope that we can build a community here where we can learn from each other, share knowledge, and support each other's growth.&lt;br&gt;
Whether you are a seasoned developer or just starting, I'd love to hear about your experience too since we are learning from each other. What inspired you to get into development?&lt;br&gt;
Drop a comment below!&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>indie</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
