<?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: Anton Mendelson</title>
    <description>The latest articles on Forem by Anton Mendelson (@anton_mendelson).</description>
    <link>https://forem.com/anton_mendelson</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%2F2804395%2F6adbaf06-a320-46fe-a118-a2a11192240c.jpg</url>
      <title>Forem: Anton Mendelson</title>
      <link>https://forem.com/anton_mendelson</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/anton_mendelson"/>
    <language>en</language>
    <item>
      <title>Setting Up new MacBook for Web Development and DX</title>
      <dc:creator>Anton Mendelson</dc:creator>
      <pubDate>Sat, 15 Feb 2025 16:05:11 +0000</pubDate>
      <link>https://forem.com/anton_mendelson/setting-up-new-macbook-for-web-development-and-dx-b4n</link>
      <guid>https://forem.com/anton_mendelson/setting-up-new-macbook-for-web-development-and-dx-b4n</guid>
      <description>&lt;p&gt;Inspired by &lt;a href="https://www.robinwieruch.de/mac-setup-web-development/" rel="noopener noreferrer"&gt;robinwieruch's setup&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  System Preferences
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Appearance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enable Dark Mode for reduced eye strain&lt;/li&gt;
&lt;li&gt;Show scrollbars only when scrolling for a cleaner UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dock Configuration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Remove default apps (keep only essential ones like Launchpad, Mail, Calendar)&lt;/li&gt;
&lt;li&gt;Enable automatic hide&lt;/li&gt;
&lt;li&gt;Disable showing suggested and recent apps&lt;/li&gt;
&lt;li&gt;Apply faster Dock hiding:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable faster hiding&lt;/span&gt;
defaults write com.apple.dock autohide-delay &lt;span class="nt"&gt;-float&lt;/span&gt; 0
defaults write com.apple.dock autohide-time-modifier &lt;span class="nt"&gt;-int&lt;/span&gt; 0
killall Dock

&lt;span class="c"&gt;# To undo faster hiding&lt;/span&gt;
defaults write com.apple.dock autohide-delay &lt;span class="nt"&gt;-float&lt;/span&gt; 0.5
defaults write com.apple.dock autohide-time-modifier &lt;span class="nt"&gt;-int&lt;/span&gt; 0.5
killall Dock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trackpad &amp;amp; Accessibility
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enable tap to click&lt;/li&gt;
&lt;li&gt;Set tracking speed to level 9&lt;/li&gt;
&lt;li&gt;Disable unnecessary gestures&lt;/li&gt;
&lt;li&gt;Set scroll speed to maximum for faster navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Keyboard Settings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Disable smart quotes&lt;/li&gt;
&lt;li&gt;Turn off automatic capitalization&lt;/li&gt;
&lt;li&gt;Disable spelling correction&lt;/li&gt;
&lt;li&gt;Configure fn key for dictation&lt;/li&gt;
&lt;li&gt;Set custom shortcuts:

&lt;ul&gt;
&lt;li&gt;Input sources: cmd + space&lt;/li&gt;
&lt;li&gt;Disable Spotlight shortcuts&lt;/li&gt;
&lt;li&gt;New iTerm tab here: cmd + ;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Finder Optimization
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set screenshots to JPG format&lt;/span&gt;
defaults write com.apple.screencapture &lt;span class="nb"&gt;type &lt;/span&gt;jpg

&lt;span class="c"&gt;# Prevent Preview from opening previous files&lt;/span&gt;
defaults write com.apple.Preview ApplePersistenceIgnoreState YES

&lt;span class="c"&gt;# Show Library folder&lt;/span&gt;
chflags nohidden ~/Library

&lt;span class="c"&gt;# Show hidden files&lt;/span&gt;
defaults write com.apple.finder AppleShowAllFiles YES

&lt;span class="c"&gt;# Enable path bar&lt;/span&gt;
defaults write com.apple.finder ShowPathbar &lt;span class="nt"&gt;-bool&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Show status bar&lt;/span&gt;
defaults write com.apple.finder ShowStatusBar &lt;span class="nt"&gt;-bool&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Set list view as default&lt;/span&gt;
defaults write com.apple.finder FXPreferredViewStyle &lt;span class="nt"&gt;-string&lt;/span&gt; &lt;span class="s2"&gt;"Nlsv"&lt;/span&gt;

killall Finder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Essential Software Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install Homebrew
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/bin/bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Add Homebrew to PATH&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(/opt/homebrew/bin/brew shellenv)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zprofile
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;/opt/homebrew/bin/brew shellenv&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Update Homebrew&lt;/span&gt;
brew update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Applications
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Development Tools&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; visual-studio-code
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; iterm2
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; webstorm
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; docker
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; postman

&lt;span class="c"&gt;# Browsers&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; google-chrome
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; firefox
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; arc
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; zen-browser

&lt;span class="c"&gt;# Productivity&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; raycast
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; rectangle
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; notion
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; slack

&lt;span class="c"&gt;# Communication&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; zoom
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; skype
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; telegram

&lt;span class="c"&gt;# Cloud Storage&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; google-drive
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; idrive

&lt;span class="c"&gt;# Security&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; 1password
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; protonvpn

&lt;span class="c"&gt;# Utilities&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; vlc
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; calibre
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; folx
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; karabiner-elements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Terminal Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install Oh My Zsh
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Starship Theme
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;starship
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(starship init zsh)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Nerd Font
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap homebrew/cask-fonts
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; font-hack-nerd-font &lt;span class="c"&gt;# currently I use Pragmasevka font for IDE's and terminals&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js Setup with NVM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nvm

&lt;span class="c"&gt;# Add NVM to shell&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"source &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;brew &lt;span class="nt"&gt;--prefix&lt;/span&gt; nvm&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/nvm.sh"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc

&lt;span class="c"&gt;# Install LTS version&lt;/span&gt;
nvm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--lts&lt;/span&gt;

&lt;span class="c"&gt;# Update npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; npm@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Git Configuration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set global config&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"you@your-domain.com"&lt;/span&gt;

&lt;span class="c"&gt;# Set better git log&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.lg &lt;span class="s2"&gt;"log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&amp;lt;%an&amp;gt;%Creset' --abbrev-commit"&lt;/span&gt;

&lt;span class="c"&gt;# Set default branch to main&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; init.defaultBranch main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SSH Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa
&lt;span class="c"&gt;# Copy public key&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Application-Specific Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Arc
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install chrome extension - Youtube Playback Speed Control &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Raycast
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install essential extensions (color picker, kill process, ScreenOCR)&lt;/li&gt;
&lt;li&gt;Set clipboard history shortcut to option + cmd + c&lt;/li&gt;
&lt;li&gt;Configure hyperkey as caps lock&lt;/li&gt;
&lt;li&gt;Set up application quick launch shortcuts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  iTerm2
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set as default terminal&lt;/li&gt;
&lt;li&gt;Configure transparency (5%)&lt;/li&gt;
&lt;li&gt;Enable natural text editing&lt;/li&gt;
&lt;li&gt;Install Oh My Zsh plugins:

&lt;ul&gt;
&lt;li&gt;zsh-completions&lt;/li&gt;
&lt;li&gt;zsh-autosuggestions&lt;/li&gt;
&lt;li&gt;zsh-syntax-highlighting&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  WebStorm
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add alias to .zshrc&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'alias ws="open -na \"WebStorm.app\""'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Disable reopening projects on startup&lt;/li&gt;
&lt;li&gt;Enable preview tab&lt;/li&gt;
&lt;li&gt;Enable single-click file opening&lt;/li&gt;
&lt;li&gt;Enable compact mode&lt;/li&gt;
&lt;li&gt;Install SuperMaven plugin for AI completions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup BlackHole audio driver to record app's sound via QuickTime
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open Audio MIDI Setup&lt;/li&gt;
&lt;li&gt;Create new Multi-Output Device&lt;/li&gt;
&lt;li&gt;Use BlackHole 2ch as Input &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Touches
&lt;/h2&gt;

&lt;p&gt;I’m using WisprFlow as a speech-to-text tool, and I find it extremely helpful in my development workflow.&lt;/p&gt;

&lt;p&gt;Don't forget to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up Apple Mail and Calendar with all accounts&lt;/li&gt;
&lt;li&gt;Configure your IDE preferences&lt;/li&gt;
&lt;li&gt;Set up workspace organization in Arc browser&lt;/li&gt;
&lt;li&gt;Test all keyboard shortcuts and customize as needed&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>macos</category>
      <category>macbook</category>
    </item>
    <item>
      <title>Voice Journal with iPhone Action Button, GPT API, and Google Docs</title>
      <dc:creator>Anton Mendelson</dc:creator>
      <pubDate>Sun, 09 Feb 2025 08:48:38 +0000</pubDate>
      <link>https://forem.com/anton_mendelson/voice-journal-with-a-single-tap-on-iphone-gpt-api-and-google-docs-137b</link>
      <guid>https://forem.com/anton_mendelson/voice-journal-with-a-single-tap-on-iphone-gpt-api-and-google-docs-137b</guid>
      <description>&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;

&lt;p&gt;The main goal of this article is to show how to set up a personal voice note service that works with a single tap on the iPhone’s Action Button. If you don’t have an action button, no problem—this solution leverages Apple Shortcuts, ensuring it works on any iPhone.&lt;br&gt;
&lt;a href="https://github.com/s4ff0x/speech-to-docs" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I believe people avoid taking notes because the process requires too many steps from thought to text. I created a tool that lets you start recording a voice note with one tap, which is then automatically saved to your chosen destination—Google Docs in my case, but it can also be Notion or any other platform.&lt;/p&gt;


&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Part 1&lt;/strong&gt; will cover deploying a backend service on &lt;a href="https://railway.com/" rel="noopener noreferrer"&gt;railway.com&lt;/a&gt; (I consider Railway the easiest way to deploy such services at the moment). The main challenge in this section is correctly setting up environment variables for the Google Docs API and OpenAI API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt; will explain how to integrate the service with iPhone Shortcuts and the Action Button for a seamless user experience.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 1: Deploying backend service
&lt;/h2&gt;

&lt;p&gt;First, you need to fork the repository: &lt;a href="https://github.com/s4ff0x/speech-to-docs" rel="noopener noreferrer"&gt;s4ff0x/speech-to-docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then: Go to Railway and authenticate with your GitHub account.&lt;br&gt;
Click Deploy and select the forked repository from your GitHub account.&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%2Fri6h4exlox9f2i88e0xm.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%2Fri6h4exlox9f2i88e0xm.png" alt="Setup project from github" width="800" height="1025"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s okay if the deployment process fails at first—that’s expected. We haven’t set up the environment variables or configured the necessary settings yet&lt;/p&gt;

&lt;p&gt;After the deployment completes (even if it fails), click on the created project in Railway.&lt;br&gt;
Go to Settings → Networking and press Generate Domain.&lt;br&gt;
Enter port 3000 and press Generate Domain.&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%2Ffy9p2a9hqfuvmjh3o6on.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%2Ffy9p2a9hqfuvmjh3o6on.png" alt="Generate domain" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;In the Build section, the Dockerfile should be automatically selected.&lt;/p&gt;

&lt;p&gt;If it’s not, it probably means Railway has excluded this feature from the free plan. In that case, you can either subscribe to a paid plan, deploy the service manually, or use another platform. However, the next steps in this guide will continue using Railway for deployment.&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%2Fm57tv6x7main53bzcdhf.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%2Fm57tv6x7main53bzcdhf.png" alt="Automatic Dockerfile detection" width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Setup Env vars
&lt;/h2&gt;
&lt;h3&gt;
  
  
  OpenAI API Key
&lt;/h3&gt;

&lt;p&gt;Create your OpenAI API key by visiting &lt;a href="https://platform.openai.com/account/api-keys" rel="noopener noreferrer"&gt;OpenAI API Keys&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Google Docs API Credentials
&lt;/h3&gt;

&lt;p&gt;Follow &lt;a href="https://developers.google.com/workspace/guides/create-credentials" rel="noopener noreferrer"&gt;Google’s guide&lt;/a&gt; to create API credentials for the Google Docs API.&lt;br&gt;
Download the credentials as a JSON file.&lt;/p&gt;
&lt;h3&gt;
  
  
  Set Environment Variables on Railway:
&lt;/h3&gt;

&lt;p&gt;Go to your project in Railway and open the Settings → Variables section.&lt;br&gt;
Add the required environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENAI_SPEECH_API_KEY=
DOC_ID=The ID of the Google document where the text will be saved
TIMEZONE=your_timezone (example: Asia/Jerusalem)
PERSONAL_AUTH_TOKEN=Create your personal key to use when calling the API from an iPhone.

# Google Service Account Credentials
TYPE=
PROJECT_ID=
PRIVATE_KEY_ID=
PRIVATE_KEY=
CLIENT_EMAIL=
CLIENT_ID=
AUTH_URI=
TOKEN_URI=
AUTH_PROVIDER_X509_CERT_URL=
CLIENT_X509_CERT_URL=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may experience problems setting the PRIVATE_KEY environment variable. Convert it to a single string using \n for new lines. For example:&lt;br&gt;
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nJNB3fAD..."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please don’t forget to enable the Google Docs API in your google console.&lt;/p&gt;

&lt;p&gt;Also, you need to share your Google document with the email of your service account and grant it edit permissions; otherwise, nothing will work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once all environment variables are set, click Deploy to restart the service with the correct configuration.&lt;/p&gt;


&lt;h2&gt;
  
  
  Let's test the api
&lt;/h2&gt;

&lt;p&gt;Download a file in m4a format containing speech to your PC (m4a is the default format for Apple audio recordings).&lt;/p&gt;

&lt;p&gt;Run the following curl command in your terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"audio=@[path to file].m4a;type=audio/m4a"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization:[your personal auth token]"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-X&lt;/span&gt; POST https://[your api url]/transcribe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now check your Google document. If everything was successful, you should see your text here.&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%2Fpvcmvp1ewrdhgl8qs1ky.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%2Fpvcmvp1ewrdhgl8qs1ky.png" alt="Google document with notes" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: Using API with Apple Shortcut + Action Button
&lt;/h2&gt;

&lt;p&gt;Apple Shortcuts allow us to call external APIs. This is exactly what we need.&lt;/p&gt;

&lt;p&gt;Create a new Apple Shortcut.&lt;br&gt;
Add the "Record Audio" block to capture audio.&lt;br&gt;
Insert the "Get Contents of URL" block and specify your API URL.&lt;br&gt;
In the "Get Contents of URL" block, configure the following:&lt;br&gt;
Method: POST&lt;br&gt;
Headers: Add an authorization header and set its value to your personal API token from your environment variables.&lt;br&gt;
Request Body Type: Choose Form.&lt;br&gt;
Add Form Field.&lt;br&gt;
Field name: audio&lt;br&gt;
Field value: Recorded Audio (the result of the "Record Audio" block).&lt;/p&gt;

&lt;p&gt;Then set this shortcut to the action button.&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%2Fapk2tacxwgmr3oxwx00u.jpg" 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%2Fapk2tacxwgmr3oxwx00u.jpg" alt="Apple Shortcut Example" width="800" height="1733"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;That’s it! Test your setup—it should work just like the curl command but with your voice note.&lt;/p&gt;

</description>
      <category>notetaking</category>
      <category>gpt</category>
      <category>voice</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
