<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Web, Startups, Digitalisation - The Wingmen Journal]]></title><description><![CDATA[Writings on all things web, startups, digitalisation, business, and life]]></description><link>https://journal.wingmen.fi/</link><image><url>https://journal.wingmen.fi/favicon.png</url><title>Web, Startups, Digitalisation - The Wingmen Journal</title><link>https://journal.wingmen.fi/</link></image><generator>Ghost 5.24</generator><lastBuildDate>Wed, 15 Apr 2026 08:39:00 GMT</lastBuildDate><atom:link href="https://journal.wingmen.fi/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Postfix Relayhost Setup]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Cloud service providers such as Amazon often prevent email sending by default on their EC2 instances to stop spammers. This can be a nuisance when you want to send legit email. You can request for this restriction to be removed, but it can be a bit of a black box</p>]]></description><link>https://journal.wingmen.fi/postfix-relayhost-setup/</link><guid isPermaLink="false">61303845902c1d0b2be570a8</guid><category><![CDATA[Development]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Sat, 18 Sep 2021 05:04:42 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1586772002345-339f8042a777?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fHNlcnZlcnxlbnwwfHx8fDE2MzA3MzYwODA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1586772002345-339f8042a777?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fHNlcnZlcnxlbnwwfHx8fDE2MzA3MzYwODA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Postfix Relayhost Setup"><p>Cloud service providers such as Amazon often prevent email sending by default on their EC2 instances to stop spammers. This can be a nuisance when you want to send legit email. You can request for this restriction to be removed, but it can be a bit of a black box if and when they will accept your request.</p>
<p>Here&apos;s a quick guide how to configure your postfix with a relayhost to send emails through a third party email gateway such as Sendgrid, Mailgun, or Mandrill. The steps are for Ubuntu, but should be adaptable for most linux based systems.</p>
<ol>
<li>Install postfix <code>sudo apt-get install postfix</code></li>
<li>Copy and modify the config from the bottom of this post to <code>/etc/postfix/main.cf</code></li>
<li>Replace at least <code>relayhost</code> and <code>smtp_sasl_password_maps</code> in the config with your own configuration</li>
<li>Create /etc/mailname file if it&apos;s not there yet and put in your preferred hostname</li>
<li>Restart postfix <code>sudo systemctl restart postfix</code></li>
<li>Install sendemail <code>sudo apt install sendemail</code></li>
<li>Test sending an email <code>sendemail -f fromuser@fromdomain.com -t touser@todomain.com -u Subject -m &quot;message&quot; -o tls=no</code></li>
<li>Check your logs <code>tail /var/log/syslog -f</code> to see if any issues cropped up</li>
<li>Remember to configure the sending domain in your email service provider</li>
</ol>
<pre><code>smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no

smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname
relayhost = smtp.mailgun.org
smtp_sasl_auth_enable = yes=
smtp_sasl_password_maps = static:postmaster@yourdomain.com:your_secret_key
smtp_sasl_security_options = noanonymous
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
local_recipient_maps =</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Vim tips, tricks and plugins]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>This post is a note-to-self type of post on Vim tips &amp; tricks. You will also find a bunch of useful plugins listed in this post. This is the place where I write down and explaing things to my self whenever learning a new trick in Vim.</p>
<p>The tips and</p>]]></description><link>https://journal.wingmen.fi/vim-tips-tricks-plugins/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc31e</guid><category><![CDATA[Development]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Thu, 26 Mar 2020 06:47:13 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1550645612-83f5d594b671?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1550645612-83f5d594b671?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Vim tips, tricks and plugins"><p>This post is a note-to-self type of post on Vim tips &amp; tricks. You will also find a bunch of useful plugins listed in this post. This is the place where I write down and explaing things to my self whenever learning a new trick in Vim.</p>
<p>The tips and tricks are loosely organized under larger topics to try to provide some structure for the post. I hope you find something new and useful! :)</p>
<p>Tips are geared towards developing projects with a web focus. I am using <a href="https://neovim.io/">Neovim</a> and with VSCode through <a href="https://github.com/vscode-neovim/vscode-neovim">vscode-neovim</a> (previously <a href="https://github.com/onivim/oni2">Onivim 2</a>, which unfortunately died). To find more about my setup you can read <a href="https://journal.wingmen.fi/os-x-design-development-setup/">OS X Design and development setup</a>.</p>
<h2 id="regexsortingfilteringetc">Regex, sorting, filtering etc</h2>
<p>Knowing your regexes makes you feel like a magician.</p>
<h3 id="addanewlinebeforeeachcapitalletter">Add a new line before each capital letter</h3>
<p><code>%s/\u/\r\0/g</code> will find uppercase letters and add a newline in front. Note: this does not work in case you have scandinavian or other exotic characters in your data.</p>
<h3 id="removeemptylinesfromdocument">Remove empty lines from document</h3>
<p>Quite often you end up having to clean some data for one or other purpose and it can be nice to quikcly drop all empty lines in the current buffer. Here&apos;s how you can do it fast:</p>
<p><code>:g/^$/d</code></p>
<h3 id="wraplineswithsomething">Wrap lines with something</h3>
<p>When you want to turn a column of data from an excel sheet into an array, you can do it easily by wrapping each line with the required markup. For example doing <code>%s/.*/&quot;&amp;&quot;,/g</code> will convert nicely wrap each line with &quot; and add a comma to the end of each line.</p>
<h3 id="sortanduniquealllines">Sort and unique all lines</h3>
<p>For smaller files you can do it directly in Vim with <code>:sort u</code>. For larger files you might want to hop on to the command line and do <code>sort bigfile.txt | uniq &gt; bigfile_sorted.txt</code>.</p>
<h3 id="runashellcommandonrangeoflines">Run a shell command on range of lines</h3>
<p>This can be useful for example to run Prettier on the whole file or just part of the file.</p>
<p><code>:0,$ ! prettier</code> will run the whole buffer through prettier<br>
<code>:15-25 ! pretier</code> will run lines 15-25 through Prettier<br>
<code>:0,$ ! prettier --parser glimmer</code> will run whole buffer through prettier using the glimmer parser (gets those .hbs files sorted)<br>
<code>:0,$ ! sort | uniq</code> will sort the lines and then unique the lines</p>
<h2 id="macros">Macros</h2>
<p>Macros are an essential part of Vim. You can record a macro to run a sequence of actions by hitting <code>q + &lt;register&gt;</code>. It will record the macro to the selected copy-paste -register. When you&apos;re done recording the macro hit <code>q</code> again to stop recording.</p>
<p>To run a macro you do <code>@ &lt;register&gt;</code>.</p>
<h3 id="runningmacrosonasetoflines">Running macros on a set of lines</h3>
<p>You often need to run a macro against a set of lines. This is easily achievable with the normal command in EX mode. Some examples to get started with:</p>
<ol>
<li>Execute for lines 5-10 <code>:5,10norm! @&lt;register&gt;</code></li>
<li>Execute for all lines <code>:%norm! @&lt;register&gt;</code></li>
<li>Execute for 5-eof <code>:5,$norm! @&lt;register&gt;</code></li>
<li>Execute for lines matching a pattern <code>:g/pattern/norm! @&lt;register&gt;</code></li>
<li>Execute for a visual selection, select with <code>V + jk</code> and run <code>:norm! @&lt;register&gt;</code></li>
</ol>
<h2 id="switchingopeningfiles">Switching / opening files</h2>
<h3 id="ctrlp">CTRLP</h3>
<p>Switching files with keyboard only is hard, right? Not really with ctrlp. Ctrp is a full path, fuzzy, file, buffer, mru, tag, you name it, finder for Vim.</p>
<p>You hit <code>ctrp + p</code> and then start typing in the name of the file you want to get to. Vim will display a list of matching files for you which you can open fast. This is a much faster way of opening files than a filetree plugin or some other such antiquated solution. Of course, this is for projects you&apos;re familiar with - exploring new projects are better done some other way.</p>
<p>The commands:</p>
<ul>
<li>
<p><code>CTRL + p</code> - activate plugin</p>
</li>
<li>
<p><code>CTRL + f &amp; CTRL + b</code> - cycle modes</p>
</li>
</ul>
<p>You can find it at: <a href="https://github.com/ctrlpvim/ctrlp.vim">https://github.com/ctrlpvim/ctrlp.vim</a></p>
<h3 id="jumpbetweenlasttwoopenfiles">Jump between last two open files</h3>
<p>This is a huge timesaver. You should setup a quick shortcut for switching between last two open buffers. This is often the most used switch after all. I&apos;ve mapped <code>&lt;leader&gt;&lt;leader&gt;</code> for this action. The following config makes the magic work:</p>
<p><code>nnoremap &lt;leader&gt;&lt;leader&gt; &lt;c-^&gt;</code></p>
<p>Unfortunately this does not directly work in VSCode, so I&apos;ve created a VSCode plugin to enable this same behaviour. The plugin provides a keyboard shortcut to jump between the last two open files. You can find the plugin here: <a href="https://marketplace.visualstudio.com/items?itemName=wingmen.alternator">https://marketplace.visualstudio.com/items?itemName=wingmen.alternator</a></p>
<h3 id="jumpbetweenrelatedfiles">Jump between related files</h3>
<p>Often you have files that are related and you want to hop between them quikcly. Some common examples are header and source files and model/view/controller -files.</p>
<p>For this to work, you need to add the plugin called <a href="https://github.com/tpope/vim-projectionist">Projectionist</a> and setup some patterns that define what should be the alternate files. After that you can jump to an alternative file with <code>:A</code> or open the alternate in a new split for example <code>:AV</code>. The plugin can also create the alternate file when it&apos;s missing - powerful stuff.</p>
<h3 id="openallcertaintypeoffilesinproject">Open all certain type of files in project</h3>
<p>When you need to open all files of a certain type in the project, you can do this:</p>
<p><code>:args ./*.html</code></p>
<h3 id="reopencurrentfile">Re-open current file</h3>
<p>Sometimes Vim might not reload the file when it detects changes or you might accidentally cancel reloading. An easy way to get the latest version of the current file is to just re-open current file with the edit command. If you don&apos;t pass a file to the command it will default to the current file and hence you can do the following:</p>
<p><code>:edit!</code></p>
<h2 id="snippets">Snippets</h2>
<p>Every selfrespecting 1000x coder needs their own secret repo of snippets and a fast way to drop them into the code.</p>
<h3 id="neocomplete">Neocomplete</h3>
<p><a href="https://github.com/Shougo/neocomplete.vim">Neocomplete</a> is a nice plugin to use handy snippets in Vim. The usage is pretty simple. You expand the snippet with <code>c + k</code>, hit tab for the next field in the snippet until finished.</p>
<h2 id="ctagsforeasyjumping">CTAGS for easy jumping</h2>
<p>You need CTAGS installed on your system for this trick. With CTAGS and a bit of hackery you can easily jump from a html DIVs class name to the CSS or SCSS definition of that class. For similar jumping around from function and function definition JavaScript you could use <a href="https://github.com/marijnh/tern_for_vim">Tern</a>.</p>
<ol>
<li>
<p>Install Exuberant CTAGS with <code>brew install ctags</code> or however you install stuff on your system</p>
</li>
<li>
<p>You need to add some configs to your CTAGS configuration located at <code>~/.ctags</code>.</p>
</li>
</ol>
<p><code>--langdef=css --langmap=css:.css --regex-css=/^[ \t]*\.([A-Za-z0-9_-]+)/.\1/c,class,classes/ --regex-css=/^[ \t]*#([A-Za-z0-9_-]+)/#\1/i,id,ids/ --regex-css=/^[ \t]*(([A-Za-z0-9_-]+[ \t\n,]+)+)\{/\1/t,tag,tags/ --regex-css=/^[ \t]*@media\s+([A-Za-z0-9_-]+)/\1/m,media,medias/ </code></p>
<p><code>--langdef=scss --langmap=scss:.scss --regex-scss=/^[ \t]*\.([A-Za-z0-9_-]+)/.\1/c,class,classes/ --regex-scss=/^[ \t]*#([A-Za-z0-9_-]+)/#\1/i,id,ids/ --regex-scss=/^[ \t]*(([A-Za-z0-9_-]+[ \t\n,]+)+)\{/\1/t,tag,tags/ --regex-scss=/^[ \t]*@media\s+([A-Za-z0-9_-]+)/\1/m,media,medias/ --regex-scss=/^[ \t]*\$([A-Za-z0-9_-]+)/\$\1/v,var,variables/ </code></p>
<p><code>--recurse=yes --exclude=.git --exclude=vendor/* --exclude=node_modules/* --exclude=db/* --exclude=log/* --exclude=tmp/*</code></p>
<ol start="3">
<li>You might want to add &quot;tags&quot; to your .gitignore -file(s).</li>
</ol>
<p>Now you can index your (S)CSS with <code>:!ctags -R .</code>. And after that jumping around is a matter of <code>:tag /myClass</code>.</p>
<p>Sources:</p>
<ol>
<li><a href="https://gist.github.com/dreki/da853aeb4d80c03a4448">https://gist.github.com/dreki/da853aeb4d80c03a4448</a></li>
<li><a href="http://stackoverflow.com/questions/12833189/jump-to-css-selector-in-a-css-file-from-the-html-file-in-vim-using-a-single-keys/12924218#12924218">http://stackoverflow.com/questions/12833189/jump-to-css-selector-in-a-css-file-from-the-html-file-in-vim-using-a-single-keys/12924218#12924218</a></li>
</ol>
<h2 id="modifyingtextfast">Modifying text fast</h2>
<p>Where Vim really shines is blazing fast modifications to existing text.</p>
<h3 id="changingbetweeninside">Changing between/inside</h3>
<p>Change text quickly between quotes for example.</p>
<p><code>ci&quot;</code> (Change Inside &quot;)</p>
<p>Replace text between characters from the paste buffer.</p>
<p><code>vi&quot;p</code> (Visual Inside &quot; Paste)</p>
<p>This works for HTML tags or paragraphs too. For example you can select all text between tags by placing your cursor on one of the tags and then hitting.</p>
<p><code>vit</code> (Visual Inside Tag)<br>
<code>vip</code> (Visual Inside Paragrahp)</p>
<p>You can also insted of <code>i</code> use <code>a</code> for all of the above examples where Vim will also include the surrounding quote or tag into the selection. When the seletion is active, you can hit <code>o</code> to change cursor position between the start and the end of the selections.</p>
<h3 id="incrementdecrementnumbers">Increment &amp; decrement numbers</h3>
<p>You can use <code>ctlr+a</code> to increment and <code>ctrl+x</code> to decrement numbers in normal mode when the cursor is inside the number.</p>
<h3 id="thesurroundplugin">The surround plugin</h3>
<p>Change the surrounding double quotes (or any character) to single quotes.</p>
<p><code>cs&quot;&apos;</code> (Change Surrounding &quot; to &apos;)</p>
<p>To surround a visual selection with parentheses press:</p>
<p><code>S(</code> (Surround with ( )</p>
<p>Surround a word with quotes.</p>
<p><code>csw&apos;</code> ( Change Surroundings of Word to &apos;)</p>
<h3 id="searchreplacewithouthavingtoescapespecialcharacters">Search &amp; replace without having to escape special characters</h3>
<p>This trick comes in hand when you want to do simple text replacement without any fancy regexp magic. Saves quite a few keystrokes.</p>
<p><code>:%sno/search_string/replace_string/g</code></p>
<h3 id="replacealloccurrencesofthewordundercursor">Replace all occurrences of the word under cursor</h3>
<p>This is super useful for quickly refactoring some bad variable names and is similar to the above but way faster to execute.</p>
<ol>
<li>In normal mode press <code>*</code> to search for all occurences of the word under cursor</li>
<li>Hit <code>:%s//newVarName/</code> to quickly replace all the matches</li>
</ol>
<p>You might require a <code>g</code> in the end depending on your <code>gdefault</code> configuration.</p>
<h3 id="searchandreplaceinallopenfiles">Search and replace in all open files</h3>
<p>There are two ways of doing this that I know of. Either</p>
<p><code>:argdo %s/pattern/replace/gce</code></p>
<p>or</p>
<p><code>:bufdo %s/pattern/replace/gce | update</code></p>
<p>should do the trick!</p>
<h3 id="runanormalmodecommandininsertmode">Run a normal mode command in insert mode</h3>
<p>While in insert mode you can press <code>ctrl + o</code> which let&apos;s you run one normal mode command and it pops you back to insert mode. Super handy for deleting a word or jumping the cursor location quickly. Just do <code>ctrl + o + dw</code> and the pesky word is gone and you&apos;re still in insert mode.</p>
<h2 id="miscellaneoustipstricks">Miscellaneous tips &amp; tricks</h2>
<h3 id="easywaytoinsertnonstandardcharacters">Easy way to insert non-standard characters</h3>
<p>If you work with nordic languages but have an american keyboard layout it can be tough to get those special characteres such as &#xE4;,&#xF6;,&#xFC; etc. Vim has a special digraph mode that makes easy to use these.</p>
<p>For example, in insert mode pressing <code>ctrl + k</code> followed by <code>u:</code> prints out <code>&#xFC;</code>. This is super handy. You can hit <code>:dig</code> to see all the available digrahps for easy reference.</p>
<h3 id="easydebuggingwithconsolelogsinjavascript">Easy debugging with console.logs in JavaScript</h3>
<p>Inspired by the Turbo Console Log plugin for VS Code here&apos;s a short snippet for your vimrc to enable inserting console logs with ease. It is not quite as smart as TCL but at least it adds the line number in. :)</p>
<p>In your Vim config add the following ugly line:</p>
<p><code>nnoremap gll oconsole.log(&quot;LINE: &lt;C-r&gt;=line(&apos;.&apos;)&lt;Esc&gt;&quot;,&quot;&quot;)&lt;Esc&gt;F&quot;i</code></p>
<p>Then hit <code>gll</code> to produce <code>console.log(&quot;LINE: line&quot;,&quot;&quot;)</code>.</p>
<h3 id="filenamehintsininsertmode">Filename hints in insert mode</h3>
<p>Write any path in the editor in insert mode and hit <code>ctrl + x + f</code> and Vim will suggest files in that folder. Makes it easy to find those file names.</p>
<h3 id="checkthewordcount">Check the word count</h3>
<p>The following command shows info on current cursor position in the currently open buffer - including the word count.</p>
<p><code>press g and then ctrl + g</code></p>
<h3 id="reloadconfigwithoutclosing">Reload config without closing</h3>
<p>In case you do not want to loose your session when modifying your <code>init.vim</code>. Here&apos;s how you can reload the config without closing the editor:</p>
<p><code>:so %</code> - if you&apos;re currently editing the <code>init.vim</code> file<br>
<code>:so $MYVIMRC</code> - if you&apos;re not editing the config file itself</p>
<h3 id="vimsplitscheatsheet">Vim splits cheatsheet</h3>
<p>Splits are handy when working with multiple source code files, so it&apos;s important to be able to quickly create, navigate, and delete splits.</p>
<p><code>:vsp</code> or <code>ctrl + w + v</code> - to create vertical split<br>
<code>:sp</code> or <code>ctrl + w + s</code> - to create horizontal split<br>
<code>ctrl + w + HJKL</code> - to move between splits<br>
<code>ctrl + w + HJKL</code> - to move splits around<br>
<code>ctrl + w + w</code> - to jump to next split (loops around)<br>
<code>ctrl + w + c</code> - close current split<br>
<code>ctrl + w + =</code> - equalize splits</p>
<h3 id="changelineendings">Change line endings</h3>
<p>Files created on WIN/DOS machines have different line endings than files created on Unix based machines. DOS uses (&quot;\r\n&quot;) and Unix uses just (&quot;\n&quot;). With Vim you can easily change between line endings.</p>
<p><code>:set ff=dos</code><br>
<code>:set ff=unix</code></p>
<h3 id="saveas">Save as</h3>
<p>When you want to create a new file by starting with a copy of the existing one. You can save the currently open buffer as a new file by doing this:</p>
<p><code>:sav newfile.js</code></p>
<h3 id="repeatorreversemovements">Repeat or reverse movements</h3>
<p>Some movement commands can be repeated with ; and reversed with ,. The movements you can repeat/reverse are F, f, T, and t.</p>
<p>Navigating serach results forward and backwards can be achieved with <code>n</code> and <code>N</code>.</p>
<h3 id="overwritetextfromcopypasteregister">Overwrite text from copy/paste register</h3>
<p>Often times you have something on your clipboard and you want to overwrite a word or a sentence with the text. Doing this in Vim can be a hassle as when you delete the previous entry it replaces the latest register value.</p>
<p>Easy way around this is to use visual selection and then paste over that. E.g. you want to replace a word with another from the latest register.</p>
<p><code>vep</code></p>
<h3 id="understandingregisters">Understanding registers</h3>
<p>Vim has a register system that stores things you yank or delete/change from the document. Register <code>0</code> holds always the last yank and <code>1</code> holds the last delete or change, if you don&apos;t specify a specific register where you want to save things. Special default register <code>&quot;</code> always holds content of the last operation be it yank, delete or change.</p>
<p>To define a specific register you can do <code>&quot;ryy</code> for example to yank stuff to register <code>r</code>. To paste from a specific register <code>&quot;rp</code>.</p>
<p>To paste last yanked content you can do just <code>p</code>. But if you instead yank something and then delete something <code>p</code> would paste in the deleted text. So to actually paste the yanked texs you can can use <code>&quot;0p</code>.</p>
<h3 id="editingmultiplelinesatonce">Editing multiple lines at once</h3>
<p>If you need to edit multiple lines of text at once, you can use the block wise visual mode. To enter the mode hit <code>CTRL + v</code>. Now you can select block areas and perform operations on them. Supported operations are insert before (I), append (A), change (c) and various other operators.</p>
<h3 id="changingtheworkingdir">Changing the working dir</h3>
<p>Sometimes you might open a file deeper inside your project directly from the command line instead of opening Vim in the project root. Vim sets the directory where the opened file is as the working directory. This can limit the visibility of files you can jump to quickly using <code>ctrl + p</code>. For example to move the working directory two levels up you can just do: <code>:cd ../..</code></p>
<h2 id="plugins">Plugins</h2>
<p>This section lists a bunch of the most useful plugins for Vim. Some of them were already mentioned in the above tips and tricks. These work well with Neovim. Onivim2 does not support most of these yet, but then again it offers some of the features out of the box or via VSCodde plugins.</p>
<h3 id="colorizer">Colorizer</h3>
<p>Show CSS colors in the editor for those of us who don&apos;t yet see hex or rgb as colors.</p>
<p><a href="https://github.com/lilydjwg/colorizer">https://github.com/lilydjwg/colorizer</a></p>
<h3 id="ctrlp">Ctrlp</h3>
<p>Hit <code>ctrl + p</code> to open files and buffers quickly with a powerful fuzzy finder.</p>
<p><a href="https://github.com/ctrlpvim/ctrlp.vim">https://github.com/ctrlpvim/ctrlp.vim</a></p>
<h3 id="editorconfig">Editorconfig</h3>
<p>Make Vim respect the <code>.editorconfig</code> file.</p>
<p><a href="https://github.com/editorconfig/editorconfig-vim">https://github.com/editorconfig/editorconfig-vim</a></p>
<h3 id="emmet">Emmet</h3>
<p>Write HTML really, really fast.</p>
<p><a href="https://github.com/mattn/emmet-vim">https://github.com/mattn/emmet-vim</a></p>
<h3 id="indentobject">Indent object</h3>
<p>Adds a text object to manipulate stuff by indentation e.g. <code>viid</code> to delete everything in the current indent. This is very handy for example when working on Python.</p>
<p><a href="https://github.com/michaeljsmith/vim-indent-object">https://github.com/michaeljsmith/vim-indent-object</a></p>
<h3 id="gitgutter">Gitgutter</h3>
<p>Show GIT info in the gutter and manipulate hunks directly from your editor. You can also move between changes in the file by using <code>[c</code> and <code>]c</code>. Staging a hunk is as easy as hitting <code>&lt;leader&gt;hs</code> when your cursor is in it.</p>
<p>For more complex usage view the plugin docs.</p>
<p><a href="https://github.com/airblade/vim-gitgutter">https://github.com/airblade/vim-gitgutter</a></p>
<h3 id="lexical">Lexical</h3>
<p>Building on Vim&#x2019;s spell-check and thesaurus/dictionary completion\</p>
<p><a href="https://github.com/reedes/vim-lexical">https://github.com/reedes/vim-lexical</a></p>
<h3 id="multiplecursors">Multiple cursors</h3>
<p>More powerful way of having multiple cursors in your Vim.</p>
<p><a href="https://github.com/terryma/vim-multiple-cursors">https://github.com/terryma/vim-multiple-cursors</a></p>
<h3 id="projectionist">Projectionist</h3>
<p>Define alternative files with patterns and very quickly jump between or open them in a new split. The plugin also can create the missing alternative file.</p>
<p><a href="https://github.com/tpope/vim-projectionist">https://github.com/tpope/vim-projectionist</a></p>
<h3 id="repeat">Repeat</h3>
<p>Make repeating commands with <code>.</code> work as intended.</p>
<p><a href="https://github.com/tpope/vim-repeat">https://github.com/tpope/vim-repeat</a></p>
<h3 id="sortmotion">Sort motion</h3>
<p>Adds a motion to sort selections of texts.</p>
<p><a href="https://github.com/christoomey/vim-sort-motion">https://github.com/christoomey/vim-sort-motion</a></p>
<h3 id="surround">Surround</h3>
<p>Manipulate surroundings like a boss e.g. <code>cs&quot;&apos;</code> to change the surrounding <code>&quot;</code> --&gt; <code>&apos;</code>.</p>
<p><a href="https://github.com/tpope/vim-surround">https://github.com/tpope/vim-surround</a></p>
<h3 id="syntastic">Syntastic</h3>
<p>Teaches Vim to use external syntax checkers. To have it check JS, just install JSHint globally through NPM.</p>
<p><code>npm install jshint -g</code></p>
<p><a href="https://github.com/vim-syntastic/syntastic">https://github.com/vim-syntastic/syntastic</a></p>
<h3 id="tcomment">Tcomment</h3>
<p>Handle commeting in a sane way.</p>
<p><a href="https://github.com/tomtom/tcomment_vim">https://github.com/tomtom/tcomment_vim</a></p>
<h3 id="wildfiretextobjects">Wildfire: text objects</h3>
<p>Install wildfire plugin to enable quick selection of text objects in normal mode by pressing enter. Press enter a second time and it chooses one greater text object.</p>
<p><a href="https://github.com/gcmt/wildfire.vim">https://github.com/gcmt/wildfire.vim</a></p>
<h3 id="wordy">Wordy</h3>
<p>Uncover usage problems in your writing e.g. check text for business jargon.</p>
<p><a href="https://github.com/reedes/vim-wordy">https://github.com/reedes/vim-wordy</a></p>
<h2 id="vimconfiguration">Vim configuration</h2>
<p>In this section, you will find some interesting configurations to make life with Vim better.</p>
<h3 id="hybridlinenumbers">Hybrid line numbers</h3>
<p>Math is hard, so setting relative line numbers stops you from having to calculate the numbers for jumps and other operations. But it&apos;s still important to see the current line number. So using the below you will get a hybrid solution that is the best of the both worlds. The current line will show the absolute line number and the line numbers up and down show the relative numbers for easy jumps/operations.</p>
<p><code>:set number relativenumber</code></p>
<h3 id="makenavigatingsplitseasier">Make navigating splits easier</h3>
<p>I tend to work in splits and it&apos;s important to make it easy to move around the splits. The below configurations make it slightly easier to navigate splits.</p>
<p><code>nnoremap &lt;c-j&gt; &lt;c-w&gt;j</code><br>
<code>nnoremap &lt;c-k&gt; &lt;c-w&gt;k</code><br>
<code>nnoremap &lt;c-h&gt; &lt;c-w&gt;h</code><br>
<code>nnoremap &lt;c-l&gt; &lt;c-w&gt;l</code></p>
<h3 id="higlightyankedarea">Higlight yanked area</h3>
<p>Neovim comes with a built in function to higlight yanked area, which makes it nice and easy to see what you just yanked. You can enable it with following the following config:</p>
<p><code>vim.api.nvim_create_autocmd(&apos;TextYankPost&apos;, {   group = vim.api.nvim_create_augroup(&apos;highlight_yank&apos;, {}),   desc = &apos;Hightlight selection on yank&apos;,   pattern = &apos;*&apos;,   callback = function()     vim.highlight.on_yank { higroup = &apos;IncSearch&apos;, timeout = 200 }   end, })</code></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Digital Flightplan - Takeoff]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Are you fascinated by the idea of building mobile / web applications in a better way? Setting the focus on key business functions, preventing overspending, minimizing overhead, maximizing efficiency, and actually getting products shipped to users? If yes, then this guide is for you.</p>
<p>This guide is aimed at business and</p>]]></description><link>https://journal.wingmen.fi/flightplan-guide-outsourcing-your-mvp/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc33a</guid><category><![CDATA[Business]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Wingmen Guys]]></dc:creator><pubDate>Tue, 03 Mar 2020 17:15:00 GMT</pubDate><media:content url="https://journal.wingmen.fi/content/images/2020/03/airplane_Takeoff.svg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://journal.wingmen.fi/content/images/2020/03/airplane_Takeoff.svg" alt="Digital Flightplan - Takeoff"><p>Are you fascinated by the idea of building mobile / web applications in a better way? Setting the focus on key business functions, preventing overspending, minimizing overhead, maximizing efficiency, and actually getting products shipped to users? If yes, then this guide is for you.</p>
<p>This guide is aimed at business and project owners, who are keen to develop software like a lean startup. The tips &amp; tricks introduced are the distilled learnings from our work with 100s of digital projects ranging from multinational conglomerates to modest startups. We are confident our guides can save you time, help reduce risks and make your projects run smoother.</p>
<p>We we can help you make development projects great again! :)</p>
<h3 id="terminology">Terminology</h3>
<p>If you&apos;re not familiar with software development terms you might benefit from refrening this list for some of the terms used in the guide.</p>
<ul>
<li>DevOps = DevOps is a software engineering culture and practice that aims at unifying software development and software operation.</li>
<li>POC = Proof of Concept</li>
<li>MVP = Minimum Viable Product</li>
<li>Test / Code Coverage =  A measure used to describe the percentage of the application&#x2019;s source code that is executed when an automatic test suite is run</li>
<li>GDPR = General Data Protection Regulation, regulations to strengthen and unify data protection for EU citizens</li>
<li>User Interface / UI = The user interface is the space where interactions between humans and machines occur.</li>
<li>Wordpress = WordPress is a free, popular and open-source content management system.</li>
<li>WooCommerce = WooCommerce is an open source e-commerce plugin for WordPress</li>
</ul>
<p><img src="https://journal.wingmen.fi/content/images/2020/03/airplane_MVP-progressions-illustration.svg" alt="Digital Flightplan - Takeoff" loading="lazy"></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="1pocmvpwhatthedevil">1. POC, MVP, what the devil?</h2>
<h3 id="theproblem">The Problem</h3>
<p>We are living in the age of acceleration [1], where the rate of change is constantly accelerating and old methods of doing things fail to keep up. Software development methodologies are no exception. A large number of organizations still miss the flight when it comes to running their software application projects effectively.</p>
<p>This is evident in the staggeringly high number of IT projects failing in either all or some of the core measures like budget, time or shipped features. [2]</p>
<p>One reason for this is that software projects are typically run following the traditional waterfall model: (1) Setting the time frame and budget; (2) Proceeding to a planning stage, where designs and other legit-looking schematics are produced. Sure this model makes you feel well prepared. The thing is, these two steps take a lot of time and they all happen before any actual development work is done.</p>
<p>This approach could work if you are building something simple and you know exactly what you need. This is rarely the case. More often this sets up your project for failure by having a plan that is already deprecated when you start, a budget that is not tied to reality and a time frame that was pulled out of the hat. Most application projects are complex and have too many variables to be successfully run in this manner.</p>
<p>&#x201C;No business plan survives first contact with a customer.&#x201D;<br>
-- Steve Blank</p>
<p>Another common reason is that the development process gets detached from business needs. This results in a waste of resources as wrong features are being developed, and heavy process overhead is killing any potential for a turnaround.</p>
<p>You need an efficient way to communicate between the development and the business side. Otherwise, you&#x2019;re doomed to waste a lot of hours on heavy, soon-to-be useless specs and then still end up developing the wrong features.</p>
<h3 id="thesolutionenterleanstartupmethodology">The Solution: Enter Lean Startup Methodology</h3>
<p>Companies - large and small - have a great opportunity to learn from startups when it comes to running application development projects. By adopting startup-minded practices, you can run software projects with less risk and a better chance for success.</p>
<p>The guiding principles of lean startups are:</p>
<ul>
<li>Experimentation over planning</li>
<li>Customer feedback over intuition</li>
<li>Iterative design over design upfront</li>
</ul>
<p>You should be able to use minimum resources to learn from real user feedback and analytics to guide your process - no matter whether your users are internal stakeholders or external clients.</p>
<p>There is nothing quite like having the actual product at hand when discussing usability and features. We humans are not good at visualizing complex products and interactions by reading specs or looking at mockups.</p>
<p>&#x201C;If a picture is worth 1000 words, a prototype is worth 1000 meetings. &#x201C;<br>
-- A Saying at IDEO</p>
<p>To follow these ideas, you can approach building software in a better, more modern way. Taking a lesson from the lean startup approach you can approach a new project with a two-step process:</p>
<ol>
<li>Put together a Proof Of Concept (POC)</li>
<li>Build a Minimum Viable Product (MVP)</li>
</ol>
<p>Proof Of Concept (POC) is a project that tests the core ideas and concept internally for technical and business feasibility. By first building a POC, you get to start with minimal risk without a risky long term commitment.</p>
<p>The goals of your POC could be for example to:<br>
Learn if the technology works and is suitable to solve your business problem<br>
Be able to take that prototype to your next meeting with stakeholders so you can have less and better meetings<br>
Try working with a new team/vendor; test multiple teams with small POC projects and choose the best to work within the long term</p>
<p>Real-life example: We observed a great example illustrating how not to do things in a large-scale client application project. One of the project&#x2019;s development managers was describing his team&#x2019;s quarterly achievements having spent three months designing and developing a demo application. The big achievement was the 95% unit testing code coverage. Now the demo was ready by their terms, and in the next quarter, the goal would be to present the concept to stakeholders for the first time and get first test users in to gather feedback. In his own words: &#x201C;...To see if this application is of any use.&#x201D;.</p>
<p>By now you might see some issues with the approach highlighted in the example. Next time ensure you are building something of use by getting some real feedback earlier in the process. Especially before investing considerable effort on building a demo project with 95% test coverage.</p>
<p>After the POC, you&#x2019;ll want to build the Minimum Viable Product (MVP), which allows you to validate your software with actual customers. To explain what an MVP is, Eric Ries describes it: &#x201C;A minimum viable product is a product with just enough features to satisfy early customers, and to provide feedback for future product development.&#x201D;</p>
<p>Creating an MVP to gather insights is a far less expensive approach to product development than starting to build a complete product based on idea level guesstimates regarding what the end-users may find useful. Trying to build all the features you think you need all at once will increase costs and risks for project failure due to incorrect assumptions.</p>
<p>The goals of an MVP are to:</p>
<ul>
<li>Get real users &amp; gather insights with less risk</li>
<li>Validate possible business idea and value by asking for money or measuring time saved for example</li>
<li>Works as a case study and possible basis for the next stage of developments justifying further investment</li>
</ul>
<p>Remember, success can be also learning that something does not work - without having wasted big bucks on the learning.</p>
<p>The last step is to understand that there is no last step. A software project is never finished. The MVP should already be usable by real users and the development continues from there, adding intelligently more layers of complexity as the project grows towards more mature stages.</p>
<p>Even if you introduce more processes and complexity to the project, it is critical to keep iterations fast and closely tied to business needs. The slower the iterations, the more resources end up being wasted on developing things you and your users don&#x2019;t need.</p>
<p>In the next chapter, we will be looking into how you can take this from idea to implementation.</p>
<div class="wm-summary-box">
    <h4> SUMMARY</h4>
    <ul>
        <li>
            Do not lock in project details before getting feedback from users as that is a recipe for disaster
        </li>
        <li>
            Keep development cycles short and connected to business needs
        </li>
        <li>
            Start with a POC to test assumptions &amp; team/partners with minimal risk
        </li>
        <li>
            Continue with an MVP to validate ideas with real customers
        </li>
    </ul> 
</div>
<h4 id="sources">Sources</h4>
<ul>
<li>[1] <a href="https://www.amazon.com/Thank-You-Being-Late-Accelerations/dp/0374273537">https://www.amazon.com/Thank-You-Being-Late-Accelerations/dp/0374273537</a></li>
<li>[2] 67% of Large IT projects fail regarding budget, time &amp; features. - The Standish Group, Chaos report</li>
</ul>
<p><img src="https://journal.wingmen.fi/content/images/2020/03/airplane_Victorinox-illustration-1.svg" alt="Digital Flightplan - Takeoff" loading="lazy"></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="2letsgetthepartystarted">2. Let&#x2019;s get the party started</h2>
<p>Now that you know what you&#x2019;re building, whether you decide to start with a POC or to proceed straight to building an MVP, both share similarities when it comes to the actual development work. From this point on, we will be talking about MVP in general.</p>
<h3 id="developmentprinciples">Development Principles</h3>
<p>In short, you will want to find the shortest possible path to get the product (or a predefined part of the whole product) produced with sufficient quality. The required quality depends greatly on the context. In some cases, it might be as simple as a single static screen, while in others it might mean several integrations implemented between systems.</p>
<p>Let&#x2019;s assume the case at hand is somewhere in the middle. Based on our experience, the most common rock to stumble on and fall is created by over-analyzing and spending a few engineering years of work into creating too heavy designs before actually diving in and creating something that people can play with. The key point is that MVP reveals almost always things that were not properly thought out before. This might be new challenges, limitations or requirements that were not discovered in the design phase.</p>
<p>Now yes, a pedantic developer could well state that it then means bad design, but you see, people tend to get a better hold of products (or things in general) by seeing and testing them instead of reading the specification. And that&#x2019;s the whole point of MVP development. Keep things light, streamline development by cutting e.g. heavy testing baselines, and don&#x2019;t be afraid to cut corners where possible without compromising concept value.</p>
<p>Real-life example: You&#x2019;re building an MVP to convince your audience how a new User Interface (UI) with a cool statistics dashboard would help them reach their business goals. Usually, the data crunching part of development requires a lot of effort to get right. But since all you&#x2019;re building at this point is a UI to prove your point, you should not spend any more time on the data that is absolutely necessary. The development team can cut hundreds of hours on implementation by utilizing a temporary, simulated backend and using an out-of-the-box API-solution to access the data. For example, Google Sheets can be used as a simulated backend [1].</p>
<h3 id="theteam">The team &#x2122;</h3>
<p>What kind of team should you hire for the job? This part is perhaps the most crucial piece of the puzzle (well ok, in addition to the project making some sense in the first place). Here are some key handouts based on our experience:</p>
<h3 id="avoidgiants">Avoid giants</h3>
<p>Considering that the point is to streamline processes and cut corners in suitable places, don&#x2019;t hire a giant. We&#x2019;re not saying that giants don&#x2019;t have their place in the industry. Small teams specializing in MVPs tend to have the advantage of being multi-disciplined and accustomed to wearing multiple hats, which is especially important when the requirements might be loosely defined and you don&#x2019;t really know what you&#x2019;re building yet. Also, in small teams, there is usually more project ownership per person, compared to a big team having a very low ownership level. The level of ownership typically correlates with dedication, motivation and general knowledge of the project.</p>
<p>In MVP development, you rarely know all the requirements beforehand. Hiring a tiny team of MacGyvers (with perhaps an expensive-looking hourly rate tag) who can easily switch from coding to cloud environment configuration to UI design to demo video production, will usually be hugely beneficial in terms of cost-efficiency vs. a giant. A team like that can efficiently communicate with the business side and course-correct swiftly as the requirements move, giving you 10x the results with 1/5x the people.</p>
<h3 id="softwaremanagementframeworks">Software Management Frameworks</h3>
<p>Use a team that is not too rigorously requesting pedantic use of a specific software development framework (e.g. scrum). While frameworks usually sound nice on paper and provide nice buzzwords for developers&#x2019; CVs, they definitely have their downsides. Most of these are related to people starting to be more interested in completing their tasks within their todo-boards than actually reaching the actual goal.</p>
<p>Always ask yourself: What is the ultimate goal? At the end of the day, the MVP audience is not interested in how well your app is backed up by a perfect software process, or how well it&#x2019;s covered with automatic tests - they are interested in you shipping the thing and seeing some real-world business value.</p>
<p>Instead of spending a lot of man hours making sure that sprint goals are met - make sure that you get your plane off the ground.</p>
<h3 id="selectingtechnologiesandtools">Selecting technologies and tools</h3>
<p>Avoiding vendor trap is such cliche advice - yet, advice worth taking seriously. Even in this day and age, many organizations purchase projects with technologies locking them to one vendor. This creates an unhealthy situation where the vendor has way more leverage over you than they should.</p>
<p>Partner with a team that is using well-known and well-supported open-source components. This automatically means that the tech has a huge community backing it up, it&#x2019;s easy to do a third-party review on project quality and you can easily find other people to continue the work if things go sour with your original vendor.</p>
<h3 id="doeasythingsonestepatatime">Do easy things, one step at a time</h3>
<p>If you think you are re-inventing something, you probably are. You should not. Even if you were thinking of building the next Google, look first for ways to prove the business goals can be met using an MVP. It&#x2019;s best to use simulated backend services and mocked up (i.e. fake) data instead of developing heavy solutions from the get go.</p>
<div class="wm-summary-box">
    <h4> SUMMARY</h4>
    <ul>
        <li>
            Find the shortest path to a usable product and then iterate
        </li>
        <li>
            Sourcing an agile &amp; multi-disciplinary MacGyver team is key at the start
        </li>
        <li>
            Select well-known &amp; mature technologies that help speed up development and avoid vendor lock-in
        </li>
    </ul> 
</div>
<h4 id="sources">Sources</h4>
<ul>
<li>[1] Rapid Prototyping Hacks That Might Save Your Soul, <a href="https://docs.google.com/presentation/d/1zq2NUpd2iSQGZ0Sxq18dcFU-JYuF5hKBYQsSxyLyjtk/edit#slide=id.p">https://docs.google.com/presentation/d/1zq2NUpd2iSQGZ0Sxq18dcFU-JYuF5hKBYQsSxyLyjtk/edit#slide=id.p</a></li>
</ul>
<p><img src="https://journal.wingmen.fi/content/images/2020/03/airplane_Flightplan-illustration-1.svg" alt="Digital Flightplan - Takeoff" loading="lazy"></p>
<!--kg-card-end: markdown--><p></p><p></p><!--kg-card-begin: markdown--><h2 id="3whatcomesafterthemvp">3. What comes after the MVP</h2>
<p>You might be facing quite different scenarios at this stage. Perhaps you have produced a quick POC to prove your point inside your company and real development is about to kick off. Or, you may have produced an MVP of a mobile application for your own startup or your client, and that application could already be featured in e.g. Appstore (which typically means significantly more fine-tuning than a dead-simple POC). Whatever your situation might be, usually when it comes to either POC or MVP, the base work is done quick &amp; dirty to get things shipped, with sufficient quality as stated in the previous chapter, remember?</p>
<p>This is the stage where the concept should be thoroughly reviewed. Does the MVP prove its point? Does it successfully bridge the gap between expectations (= business needs) and reality? If not, it definitely doesn&#x2019;t directly indicate that your case isn&#x2019;t valid - it simply means that it hasn&#x2019;t been validated yet.</p>
<p>This chapter is not about validating the idea with an MVP, so let&#x2019;s assume that the validation is already done successfully. Let&#x2019;s assume you&#x2019;ve brought on the wow effects with your neat looking &amp; status-quo disrupting MVP and everyone is onboard &amp; ready to continue on to the next stage.</p>
<p>First, you&#x2019;ll have to consider what to do with the current MVP version of the product when moving towards more mature stages. On one hand, you have invested in it and the product is working, so it would be great if you can continue building on top of the current version. On the other hand, it might be a valid option to continue development by leaving the MVP as it is and starting the implementation of the next version from scratch.</p>
<p>When deciding whether to start again or continue from the existing MVP, you will want to evaluate if the code written for it is something that can even work for a real product. Often MVPs are created following best practises or might be using prototyping frameworks that are not suitable for an actual customer facing product. Thus it might be actually better to take the learnings from the MVP and start with a blank slate.</p>
<p>Real-life example: An emerging eCommerce startup built its first MVP using an out-of-the-box solution (WooCommerce on WordPress to be precise) to quickly get the first version out in the open. This allowed them to validate the core concept with minimal upfront investment. Once the actual integration and customization work began, they decided to switch to a completely tailor-made solution to prevent possible compromises brought about by the constraints of the platform used in MVP. This is not to say that there is anything wrong with out-of-the-box solutions in general but often, modifying them beyond their original purpose gets unwieldy and hard to maintain.</p>
<p>It is not unusual for enterprise software projects to be in what you could call a constant MVP mode. It is a state where new features are demanded to be developed by the business side constantly. And the project is always behind schedule since new features are expected to be live immediately once they have been introduced in the first place. It is common for this to end up in chaos and a lot of bugs.</p>
<p>Next, let&#x2019;s go over the common pitfalls of MVP projects when it comes to software quality in the traditional sense and talk about some concrete ways you can overcome them.</p>
<h3 id="ontheteam">On the team</h3>
<p>While we recommend a small team of experts for the MVP phase, you and they should both know their limits. Very few people can do it all. Have a realistic look into the requirements, and evaluate if you need to expand the team.</p>
<p>Mapping the requirements to the required team size might be difficult, and that&#x2019;s perfectly ok - it&#x2019;s not really supposed to be your task anyway. It often is cheaper to get an outside specialist to step in, analyze the resources needed and help compare business proposals from multiple vendors.</p>
<p>If your project is concentrated around specific technologies, consider hiring subject matter experts for those specific technologies in addition to the MacGyvers from the MVP. A good example of such an expert would be a test automation engineer, who has a lot of experience with setting up such systems. Hiring an expert will often save money in the long run and ensure your project follows best practices.</p>
<p>If you are looking for a refresher on what types of engineers are out there, <a href="https://www.browserstack.com/guide/what-are-the-different-types-of-software-engineer-roles">this</a> short article will help you understand the differences between different types of software engineers.</p>
<h3 id="corporatesoftwarethegoodbits">Corporate software, the good bits</h3>
<p>From the eyes of a seasoned corporate DevOps pro, the MVP development process looks like total chaos. Things like code coverage (e.g. unit tests) and automated testing they usually take for granted seem like a faraway dream when it comes to a lean MVP development process.</p>
<p>Here&#x2019;s some food for thought: you should review beforehand whether you are expecting to continue working with the MVP implementation, or whether you expect to start from scratch. If you are looking to trash your MVP once its proven its point, you may want to spend as little time with e.g. automated testing as possible and focus on shipping. But you still should use tools and practices that make the project testable in case you decide to stick with it after all.</p>
<p>A practical approach: While skipping all code coverage and other such thresholds, prepare your application to be both unit testable and end-to-end testable so you are prepared when it is time to climb that fence. Create sanity checks (e.g. check that all software components are defined) on the unit test side, but focus on manual testing for the main functionality. Set up a UI testing framework (e.g. Selenium), but again focus on a few sanity checks (e.g. checking that the UIs main elements are rendering) to make sure your application is rendered. This approach sets a healthy basis for continuing to add more extensive tests when needed.</p>
<p>DevOps is the utilization (or some might call it culture) of best practices in software development, unifying operations and development parts. These best practices are items like deployment pipelines, continuous integration, and versioning guidelines. There is no reason why these cannot be utilized already in MVP development.</p>
<p>Items that need to be addressed post MVP development include integrating enhanced testing baselines to the deployment pipelines. It is also very well possible that the culture will bring more review points when utilized after the MVP project.</p>
<h3 id="softwaremanagementprocessandbacklogprioritization">Software management process and backlog prioritization</h3>
<p>When developing your MVP, you may run into new business/feature ideas that you consider worth developing. You should write all of these down, but keep your eyes on the end goal - getting the first working version shipped.</p>
<p>Once you have a working product out, it&#x2019;s time to do the backlog prioritization with all the introduced feature ideas. Often, the learnings from the working product allow you to make more informed decisions on the prioritization. With the learnings in hand, you can plan versions, releases and define stage goals. Of course, this prioritization can be done during the MVP project, if it&#x2019;s possible time-wise.</p>
<p>This should also be the time to review your software management processes. We are not going to take a stand on any specific processes, given what works for one team and one project might not work for another. In many cases, the MVP stage is done wild west style, which can be ok to get things shipped. If you have already utilized a specific process framework during the MVP development, take a step back and think whether you can and should continue to use it.</p>
<h3 id="performanceandscalability">Performance and scalability</h3>
<p>Does it scale? That&#x2019;s probably the most common question when it comes to applications developed by startups and companies alike (next to how are you going to monetize it?). This is most often raised by the pedantic engineer type of guy in the meeting. We would argue that it&#x2019;s definitely more common to overthink than underthink scaling in an MVP project.</p>
<p>You definitely should not worry about supporting 10000 simultaneous users when you are looking to validate your idea and get started with your first test users. Having said that, it is also a well-established factor that you can and should be using well-known components with a large community backing it up. By doing this, you are basically getting a guarantee out of the box that someone else has already utilized the technical solution/approach on a real-world case and scale.</p>
<h3 id="securityandreliability">Security and reliability</h3>
<p>Unfortunately, some stakeholders cannot be bothered about security or proper testing...until it is too late. If you are collecting user data or any other sensitive data in your MVP, you should be already taking security into account.</p>
<p>This is not a guide for security guidelines though, so we&#x2019;ll simply leave you with this: Small does not mean secure - often the opposite. By that, what we mean is: it is often seen as a common excuse that a small startup should not have to take care of the security since no one would be interested in them. However, once your project is out in the open (e.g. domain, emails, registered users), security must be taken care of appropriately, along with new EU GDPR regulations. So make sure the team understands what this means.</p>
<div class="wm-summary-box">
    <h4> SUMMARY</h4>
    <ul>
        <li>
            Use a specialist to assess the project requirements properly, and scale the team up as needed
        </li>
        <li>
            Make the move from creative chaos to a more managed process
        </li>
        <li>
            Utilize automated testing to allow confident and fast iteration
        </li>
        <li>
            Continue to utilize well-known technologies and tools, and avoid over-thinking scaling capabilities
        </li>
    </ul> 
</div>
<p><img src="https://journal.wingmen.fi/content/images/2020/03/airplane_Flame-illustration-1.svg" alt="Digital Flightplan - Takeoff" loading="lazy"></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="4whatsnext">4.  What&#x2019;s Next</h2>
<p>Thank you for taking the time to read the Takeoff Guide. We hope we were able to provide you actionable ideas you can put to use in your organization. Perhaps you have realized that application development does not need to be a constant pain in the behind.</p>
<p>If the ideas in this guide sound intriguing to you, but you think you&#x2019;d need help to put them into action in your organization - feel free to in touch.</p>
<p>We are constantly learning and writing about our latest learnings. So unless you&#x2019;ve already unsubscribed, you&#x2019;ll be hearing from us in the form of more actionable advice around application development.</p>
<h3 id="aboutwingmen">About Wingmen</h3>
<p>Wingmen is a Helsinki and Singapore based consultancy helping companies solve game-changing business problems and test new digital business ideas by leveraging premade or custom solutions.</p>
<p>We are a small group of digital MacGyvers who love to solve real-world problems with design and technology. We have a very particular set of skills acquired over extensive careers. Skills that make us business-minded, full-stack makers, who can wear multiple hats to excel in quickly changing environments.</p>
<p>We push each other and our partners to the next level. And together, we are taking small, meaningful steps towards a better digital future.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Tech Startup Resources List]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>A grand list of resources and tools related to web/app development, business and startups.</p>
<h2 id="business">Business</h2>
<p>Business related resource for building your next startup or improving your current one.</p>
<p><a href="http://christophjanz.blogspot.com/2016/03/saas-financial-plan-20.html">SaaS Financial Plan</a> - A financial plan template for SaaS.<br>
<a href="https://fi.co/contents/fast">Founder / Advisor Standard Template</a> - Contract template for startup advisors.<br>
<a href="https://www.holloway.com/g/equity-compensation">Equity</a></p>]]></description><link>https://journal.wingmen.fi/startup-resources/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc338</guid><category><![CDATA[Business]]></category><category><![CDATA[ember]]></category><category><![CDATA[javascript]]></category><category><![CDATA[marketing]]></category><category><![CDATA[note-to-self]]></category><category><![CDATA[remote]]></category><category><![CDATA[sideproject]]></category><category><![CDATA[startups]]></category><category><![CDATA[work]]></category><category><![CDATA[wordpress]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Fri, 15 Nov 2019 07:25:04 GMT</pubDate><media:content url="https://journal.wingmen.fi/content/images/2019/11/todd-quackenbush-IClZBVw5W5A-unsplash.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://journal.wingmen.fi/content/images/2019/11/todd-quackenbush-IClZBVw5W5A-unsplash.jpg" alt="Tech Startup Resources List"><p>A grand list of resources and tools related to web/app development, business and startups.</p>
<h2 id="business">Business</h2>
<p>Business related resource for building your next startup or improving your current one.</p>
<p><a href="http://christophjanz.blogspot.com/2016/03/saas-financial-plan-20.html">SaaS Financial Plan</a> - A financial plan template for SaaS.<br>
<a href="https://fi.co/contents/fast">Founder / Advisor Standard Template</a> - Contract template for startup advisors.<br>
<a href="https://www.holloway.com/g/equity-compensation">Equity Compensation Guide</a> - Stock options, RSUs, job offers, and taxes &#x2014; a detailed reference<br>
<a href="https://startuptools.org/">Startup Tools</a> - Free contract templates for startups in the nordics.<br>
<a href="https://www.producthunt.com/founder-club/benefits">Producthunt Founder Club</a> - Lots of benefits for startup founders.<br>
<a href="https://about.gitlab.com/handbook/">Gitlab Handbook</a> - GitLab team handbook is a great resource on how to run a remote company.<br>
<a href="http://www.chowdhurysdigital.com/complete-mvp-success-guide/">MVP Success Guide</a> - A great guide on running building a minimum viable product for your startup.<br>
<a href="https://www.enterpriseready.io/">EnterpriseReady</a> - SaaS feature guides created for people who build SaaS products for enterprise customers.<br>
<a href="https://startupstash.com/">Startupstash</a> - A curated directory of tools and resources to build your startup.<br>
<a href="https://usefyi.com/templates/freelancer-templates/">Resources for Freelancers</a> - All the free resources and templates you need to get work done as a freelancer.<br>
<a href="https://github.com/VGraupera/1on1-questions">1 on 1 Meeting Questions</a> - Mega list of 1 on 1 meeting questions compiled from a variety to sources<br>
<a href="https://starthouse.xyz/">StartHouse</a> - A big collection of startup pitch decks.<br>
<a href="https://calv.info/how-to-sell-b2b">How to do B2B Sales</a> - A great article on doing B2B sales right.<br>
<a href="https://github.com/ksindi/managers-playbook">Managers Playbook</a> - Heuristics for effective (tech) management: coaching, hiring, one-on-ones etc.<br>
<a href="https://www.ycombinator.com/library">YC Startup Library</a> - Videos, podcasts and essays as resources for startup founders.<br>
<a href="https://www.founderlibrary.com/">Founder library</a> - Curated list of articles and resources for founders<br>
<a href="https://github.com/kuchin/awesome-cto">Awesome CTO</a> - Curated list of articles for CTOs, with the emphasis on startups and hyper-growth companies.<br>
<a href="https://gitlab.com/edouardklein/falsisign">Falsisign</a> - There comes a time when someone wants you to go through printing and signing and scanning a paper. Use this instead. :)</p>
<h3 id="aimachinelearning">AI / Machine Learning</h3>
<p>Every business can take advantage of the great progress made in the AI/ML field recently. The uses span from generating images for your blog posts to using ChatGPT as a pair programming partner.</p>
<p><a href="https://chat.openai.com/">ChatGPT</a> - Use ChatGPT as your personal knowledge base, assistant, programming helper and what not.<br>
<a href="https://github.com/f/awesome-chatgpt-prompts">ChatGPT Prompts</a> - A repo that includes ChatGPT promt examples to use ChatGPT better.<br>
<a href="https://openai.com/dall-e-2/">Dall-e 2</a> - Dall-e 2 is an image generation model useful for generating images for blog posts etc.<br>
<a href="https://github.com/openai/openai-cookbook">OpenAI Cookbook</a> - Examples and guides for using the OpenAI API.</p>
<h3 id="termsandconditions">Terms and Conditions</h3>
<p>If you&apos;re building a legit business sooner than later you will need to introduce some terms and conditions. Check these links for inspiration and advice.</p>
<p><a href="https://basecamp.com/rights">Basecamp Customer Bill of Rights</a> - The gold standard in ToS clarity and user friendliness.</p>
<h3 id="hiring">Hiring</h3>
<p>Hiring the best engineers is crucial for a tech startup because they are the ones who will build the product that will make the company successful. Without them, your startup&apos;s rocket is going to be a dud and end up in the junkyard.</p>
<p><a href="https://dropbox.github.io/dbx-career-framework/">Dropbox career framework</a> - How Dropbox organizes their technical roles.<br>
<a href="https://hiringengineersbook.com/post/why-your-job-description-fails-to-attract-senior-engineers/">Hiring Senior Engineers</a> - Tips to write better engineering job descriptions.<br>
<a href="https://github.com/yangshun/tech-interview-handbook">Tech Interview Handbook</a> - Curated coding interview preparation materials for busy software engineers.</p>
<h3 id="culture">Culture</h3>
<p>A handbook is not a culture. But these handbooks can be a great inspiration on how to set up yours.</p>
<p><a href="https://www.atlassian.com/team-playbook">Atlassian Team Playbook</a><br>
<a href="https://basecamp.com/handbook">Basecamp Handbook</a><br>
<a href="https://about.gitlab.com/handbook/">Gitlab Handbook</a><br>
<a href="https://works.hashicorp.com/">Hashicorp Works</a><br>
<a href="https://www.valvesoftware.com/company/Valve_Handbook_LowRes.pdf">Valve Handbook</a><br>
<a href="https://zapier.com/learn/remote-work/">Zapier Remote Guide</a></p>
<h3 id="workspace">Workspace</h3>
<p><a href="https://workfrom.co/">Workfrom</a> - Find coffee spots to work from in any city verified by other remote workers.</p>
<h2 id="designdevelopment">Design &amp; development</h2>
<p>Design and development related resources.</p>
<h3 id="appbuilders">App builders</h3>
<p>Too lazy to learn how to code or too cheap to pay for someone to do it for you? Here are some options to try.</p>
<p><a href="https://www.appgyver.com/">AppGyver</a><br>
<a href="https://www.adalo.com/">Adalo</a><br>
<a href="http://www.appmachine.com/">AppMachine</a></p>
<h3 id="apisanddocumentation">APIs and documentation</h3>
<p>Great APIs and documentation are a key to successful tech startup. It can be a good idea not to roll your own API standard and follow an existing standard and use the provided tools.</p>
<p><a href="https://jsonapi.org/">JSONAPI</a> - A specification for building APIs in JSON.<br>
<a href="https://openapi-generator.tech/">OpenApi</a> - The OpenAPI Specification (OAS) defines a standard, programming language-agnostic interface description for HTTP APIs.</p>
<h3 id="colorspatterns">Colors &amp; patterns</h3>
<p>Tools and resources on figuring out color palettes and finding patterns.</p>
<p><a href="http://www.colourlovers.com">Colourlovers</a> - A creative community where people from around the world create and share colors, palettes and patterns.<br>
<a href="https://coolors.co/">Coolors</a> - Easy and fast color schemes generator.<br>
<a href="https://draculatheme.com/">Dracula Theme</a> - Popular theme for editors/apps etc<br>
<a href="http://www.gradient-animator.com/">Gradient Animator</a> - Create CSS gradients easily.<br>
<a href="https://www.joshwcomeau.com/gradient-generator/">Gradient Generator</a> - A gradient generator that generates lush gradients avoiding the gray dead zone.<br>
<a href="https://www.nordtheme.com/">Nord Theme</a> - Theme for editors/apps etc<br>
<a href="http://subtlepatterns.com/">Subtle Patterns</a> - Yet another pattern library for your projects.<br>
<a href="http://thepatternlibrary.com/">The Pattern Library</a> - This project compiles patterns created by designers for use in your projects.</p>
<h3 id="data">Data</h3>
<p>Often you need some data to achieve your goals.</p>
<p><a href="https://dev.maxmind.com/geoip/geoip2/geolite2/">GeoLite2 Free Geolocation Data</a> - A free IP geolocation database.</p>
<h3 id="domainnamechecktools">Domain / namecheck tools</h3>
<p>These tools make it easy to check if the genious app name idea you came up with is available for general use in the internets.</p>
<p><a href="http://wordsafety.com/">Wordsafety</a> - Check a name for unwanted meanings in foreign languages<br>
<a href="https://domainr.com/">Domainr</a> - Instantly check if a domain is available.<br>
<a href="https://namechk.com/">Namechk</a> - Quickly check a name across multiple services.<br>
<a href="https://www.entri.com/">Entri</a> - Service &amp; api to manage custom domains.</p>
<h3 id="emberpluginsresources">Ember plugins / resources</h3>
<p>A bunch of the best resources and plugins we are using for Emberjs.</p>
<p><a href="https://emberobserver.com/">Ember Observer</a> - Ember addons listing<br>
<a href="https://ember-power-calendar.com">Ember Power Calendar</a> - Powerful and customizable calendar component for Ember.<br>
<a href="https://shipshapecode.github.io/ember-flatpickr/">Ember Flatpickr</a> - Implements the Flatpickr calendar for Ember.<br>
<a href="https://medium.com/@sarbbottam/the-ember-js-testing-guide-i-made-for-myself-c9a073a0c718">Ember Testing Tips</a> - A good article on how to do testing in Ember.<br>
<a href="https://github.com/stonecircle/ember-cli-notifications">Ember Cli Notifications</a> - A notifications system for Ember.<br>
<a href="https://github.com/runspired/ember-gestures">Ember Gestures</a> - Handle gestures in Ember apps nicely.<br>
<a href="https://github.com/html-next/vertical-collection">Vertical Collection</a> - Infinite Scroll and Occlusion at &gt; 60FPS for Ember.<br>
<a href="https://github.com/dockyard/ember-in-viewport">Ember In Viewport</a> - Detect if an Ember View or Component is in the viewport @ 60FPS.<br>
<a href="https://jkusa.github.io/ember-cli-clipboard/">Ember Cli Clipboard</a> - Copy text to clipboard.<br>
<a href="https://github.com/igorpreston/ember-cli-geo">Ember Cli Geo</a> - Integrating HTML5 Geolocation API into your Ember.js web app.<br>
<a href="https://github.com/Ember-Swiper/ember-cli-swiper">Ember Cli Swiper</a> - A nice swiper component for your apps.<br>
<a href="http://ember-concurrency.com/docs/introduction/">Ember Concurrency</a> - Ember Addon that makes it easy to write concise, robust, and beautiful asynchronous code.<br>
<a href="https://github.com/ember-animation/ember-animated">Ember Animated</a> - Core animation primitives for Ember<br>
<a href="https://github.com/offirgolan/ember-cp-validations">Ember CP Validations</a> - Ember computed property based validations<br>
<a href="https://github.com/kaliber5/ember-cli-bundle-analyzer">Ember Cli Bundle Analyzer</a> - Analyze and visually show the size and contents of your Ember app&apos;s bundles.</p>
<h3 id="designuxfontstypographysounds">Design, UX, fonts, typography, sounds</h3>
<p>Resources related to design, ux, fonts typography, and sounds.</p>
<p><a href="http://joelcrawfordsmith.com/closest-font/">Closest font</a> - Find closest font<br>
<a href="https://www.cssfontstack.com">CSS Font Stack</a> -  A collection of web safe CSS font stacks.<br>
<a href="https://principles.design/">Design Principles</a> - An open source collection of Design Principles and methods.<br>
<a href="https://devfonts.gafi.dev/">Devfonts</a> - Fonts for code editors.<br>
<a href="https://www.pierrickcalvez.com/journal/a-five-minutes-guide-to-better-typography">Inspirational Typohraphy Guide</a> - A Five-Minute Guide to Better Typography<br>
<a href="https://lawsofux.com/">Laws of UX</a> - Laws of UX is a collection of the maxims and principles that designers can consider when building user interfaces.<br>
<a href="http://practicaltypography.com">Practicaltypography</a> - Typography in ten minutes<br>
<a href="https://www.sketchappsources.com/">Sketch App Resources</a> - Lots of free resources for Sketch App.<br>
<a href="https://typ.io/">Typ</a> - Find fonts that go together<br>
<a href="https://freesound.org/">Freesound</a> - Freesound is a collaborative database of Creative Commons Licensed sounds.</p>
<h3 id="inspirationsources">Inspiration sources</h3>
<p>Resources for UI/design inspiration.</p>
<p><a href="https://dribbble.com">Dribbble</a> - The place to find &amp; showcase creative work.<br>
<a href="http://www.goodweb.design">Goodweb</a> - The best landing pages, organized by section.<br>
<a href="http://www.mobilemozaic.com">Mobilemozaic</a> - MobileMozaic is a gallery of the very best designed iphone applications.<br>
<a href="http://www.pttrns.com/">Pttrns</a> - Examples of common design patterns in apps.<br>
<a href="http://littlebigdetails.com">Littlebigdetails</a> - Little Big Details is a curated collection of the finer details of design.</p>
<h3 id="javascriptguides">JavaScript guides</h3>
<p>Guides for writing better JavaScript code.</p>
<p><a href="https://github.com/airbnb/javascript">AirBnb JavaScript Style Guide</a> - AirBnbs famous JavaScript style guide.<br>
<a href="https://github.com/mbeaudru/modern-js-cheatsheet">Modern JS Cheatsheet</a> - Cheatsheet for the JavaScript knowledge you will frequently encounter in modern projects.<br>
<a href="https://github.com/ryanmcdermott/clean-code-javascript">Clean Code JavaScript</a> - Software engineering principles, from Robert C. Martin&apos;s book Clean Code, adapted for JavaScript.<br>
<a href="https://github.com/leonardomso/33-js-concepts">33 JavaScript Concepts</a> - Repository of updated links to help developers master their concepts in JavaScript.</p>
<h3 id="javascriptlibsresources">JavaScript libs / resources</h3>
<p>A bunch of JavaScript libraries and resources that seem to come handy time after time.</p>
<p><a href="https://garlicjs.org/">GarlicJS</a> - Persist form state in localStorage to prevent those oopsie moments where user loses text.<br>
<a href="https://github.com/marak/Faker.js/">Faker.js</a> - Generate massive amounts of realistic fake data in Node.js and the browser.<br>
<a href="https://github.com/sindresorhus/awesome-nodejs">Awesome Node.js</a> - A huge list of delightful Node.js packages and resources.<br>
<a href="https://github.com/brianreavis/sifter.js/">Sifter</a> - A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.<br>
<a href="https://svelte-community.netlify.com/">Svelte Community</a> - Resources for Svelte framework.<br>
<a href="https://github.com/SGrondin/bottleneck">Bottleneck</a> - A library to throttle things.</p>
<p><strong>UI components</strong><br>
<a href="http://heelhook.github.io/chardin.js/">Chardin.js</a> - Simple overlay instructions / guide for your apps.<br>
<a href="https://gridstackjs.com/">GridStack</a> - Build interactive dashboards in minutes. Requires jQuery.<br>
<a href="https://github.com/Leaflet/Leaflet">Leaflet</a> - JavaScript library for mobile-friendly interactive maps.<br>
<a href="https://github.com/leongersen/noUiSlider/">noUiSlider</a> - noUiSlider is a lightweight JavaScript range slider library with full multi-touch support. It fits wonderfully in responsive designs and has no dependencies.<br>
<a href="https://github.com/rstacruz/nprogress/">nProgress</a> - Slim progress bars for Ajax&apos;y applications. Inspired by Google, YouTube, and Medium.<br>
<a href="https://github.com/sbstjn/timesheet.js">Timesheet.js</a> - JavaScript library for HTML5 &amp; CSS3 time sheets.<br>
<a href="https://github.com/ianstormtaylor/slate">Slate</a> - A completely customizable framework for building rich text editors.<br>
<a href="https://shepherdjs.dev/">Shepherd.js</a> - Create product guides/tours of your app easily.</p>
<p><strong>Date/time</strong><br>
<a href="https://github.com/moment/moment/">Moment</a> - Parse, validate, manipulate, and display dates in javascript.<br>
<a href="https://github.com/kylestetz/CLNDR">CLNDR</a> - a jQuery calendar plugin that uses HTML templates.<br>
<a href="https://github.com/amsul/pickadate.js">Pickadate</a> - The mobile-friendly, responsive, and lightweight jQuery date &amp; time input picker.<br>
<a href="https://github.com/Twipped/Kalendae">Kalendae</a> - A javascript date picker that just works.</p>
<p><strong>File</strong><br>
<a href="https://github.com/avoidwork/filesize.js">Filesize.js</a> - JavaScript library to generate a human readable String describing the file size.<br>
<a href="https://github.com/blueimp/jQuery-File-Upload">jQuery File Upload</a> - File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery.<br>
<a href="https://github.com/enyo/dropzone/">Dropzone</a> - Dropzone is an easy to use drag&apos;n&apos;drop library. It supports image previews and shows nice progress bars.</p>
<p><strong>Images</strong><br>
<a href="https://github.com/aFarkas/lazysizes">lazysizes</a> - High performance and SEO friendly lazy loader for images (responsive and normal), iframes and more, that detects any visibility changes triggered through user interaction, CSS or JavaScript without configuration.<br>
<a href="https://github.com/tholman/intense-images">Intense Images</a> - A simple library to view large images up close using simple mouse interaction, and the full screen.<br>
<a href="https://github.com/dimsemenov/photoswipe">Photoswipe</a> - JavaScript image gallery for mobile and desktop, modular, framework independent.<br>
<a href="https://github.com/galleriajs/galleria">Galleria</a> - Another JavaScript Image Gallery.</p>
<p><strong>Mouse/touch/keyboard</strong><br>
<a href="https://bevacqua.github.io/dragula/">Dragula</a> -  Drag and drop so simple it hurts.<br>
<a href="http://hammerjs.github.io">Hammer.js</a> - A javascript library for multi-touch gestures.<br>
<a href="https://github.com/ccampbell/mousetrap">Mousetrap</a> - Simple library for handling keyboard shortcuts in Javascript.<br>
<a href="https://github.com/nosir/cleave.js">Cleave.js</a> - Format input text content when you are typing.<br>
<a href="https://github.com/Shopify/draggable">Draggable</a> - The JavaScript Drag &amp; Drop library your grandparents warned you about.<br>
<a href="http://ScrollMagic.io">ScrollMagic</a> - A popular javascript library for magical scroll interactions.</p>
<p><strong>Visualisation</strong><br>
<a href="https://github.com/d3/d3">D3</a> - Bring data to life with SVG, Canvas and HTML.<br>
<a href="http://c3js.org">C3</a> - A D3-based reusable chart library.<br>
<a href="https://dmitrybaranovskiy.github.io/raphael/">Rapha&#xEB;l</a> - Rapha&#xEB;l is a small JavaScript library that should simplify your work with vector graphics on the web.<br>
<a href="https://github.com/svgdotjs/svg.js">SVG.js</a> - The lightweight library for manipulating and animating SVG.</p>
<h3 id="kubernetesdocker">Kubernetes / Docker</h3>
<p>Running your own cluster is the bomb these days.</p>
<p><a href="https://github.com/gravitational/gravity">Gravity</a> - Opinionated image-based Kubernetes packaging and management tools.<br>
<a href="https://helm.sh/">Helm</a> - The package manager for Kubernetes<br>
<a href="https://github.com/kubernetes/kops">Kops</a>  - Kubernetes Operations to handle production grade K8s installation, upgrades, and management<br>
<a href="https://github.com/SeldonIO/seldon-core">Seldon Core</a> - Handy tool to run your ML models on K8s.<br>
<a href="https://github.com/wagoodman/dive">Dive</a> - A tool for exploring a docker image, layer contents, and discovering ways to shrink the size of your Docker/OCI image.<br>
<a href="https://github.com/dokku/dokku/">Dokku</a> - Docker powered mini-Heroku. The smallest PaaS implementation you&apos;ve ever seen.<br>
<a href="https://gotenberg.dev/">Gotenberg</a> - A Docker-powered stateless API<br>
for PDF files.</p>
<h3 id="launchchecklists">Launch check lists</h3>
<p>Getting ready to launch a web application or site? Go through these check lists to make sure you got your bases covered.</p>
<p><a href="http://www.boxuk.com/blog/the-ultimate-website-launch-checklist">Box UK Checklist</a> - Extensive website launch checklist.<br>
<a href="http://www.smashingmagazine.com/2009/04/07/15-essential-checks-before-launching-your-website/">Smashing Mag Checklist</a> - Smashing magazines take on website launch checklist.<br>
<a href="http://www.webdesignerdepot.com/2010/02/using-a-pre-launch-checklist-for-your-website/">Webdesignerdepot Checklist</a> - Webdesignerdepots take on  website launch checklist.<br>
<a href="http://www.1stwebdesigner.com/design/web-design-checklists/">1stwebdesigner Checklist</a>  - 1stwebdesigners take on website launch checklist.</p>
<h3 id="opensourceexamplewebmobileapps">Open source example web/mobile apps</h3>
<p>It can be valuable to take a peek at other apps how they&apos;ve done things.</p>
<p><a href="https://github.com/bigcapitalhq/bigcapital">Bigcapital</a> - Bigcapital is intelligent cloud and open-source accounting software for small and medium businesses.<br>
<a href="https://github.com/bullet-train-co">Bullet Train</a> - Bullet Train is an MIT-licensed Rails-based framework that saves you months of development by starting you off with all the features that are the same in every product, so you can focus on what makes your app unique.<br>
<a href="https://github.com/calendso/calendso">Calendso</a> - The open-source Calendly alternative built using Next.js.<br>
<a href="https://github.com/inkandswitch/capstone">Capstone</a> - An experimental, tablet-based tool for developing your ideas.<br>
<a href="https://gourav.io/clone-wars">Clone Wars</a> -  Browse open-source clones or alternatives of popular sites like Airbnb, Amazon, Instagram, Netflix, Tiktok, Spotify, Trello, Whatsapp, Youtube, etc.<br>
<a href="https://github.com/Lissy93/dashy">Dashy</a> - A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, and a UI editor.<br>
<a href="https://github.com/docusealco/docuseal">Docuseal</a> - Open source DocuSign alternative. Create, fill, and sign digital documents.<br>
<a href="https://github.com/TrillCyborg/fullstack/blob/master/README.md">FullStack</a> - Full-stack boilerplate for you to learn some cool things or build your next app off of.<br>
<a href="https://github.com/dvasdekis/react-admin-hasura-firebase/">Hasura example app</a> - React admin with firebase auth and hasura graphql backend.<br>
<a href="https://github.com/hospitalrun">Hospitalrun</a> - Comprehensive OS app for hospitals.<br>
<a href="https://github.com/LaniJ/invoice-dragon">Invoice Dragon</a> - An application that simplifies the process of generating professional Invoices and Receipts for your business needs.<br>
<a href="https://github.com/yahoo/navi">Navi</a> - Navi is a production quality analytics reporting UI<br>
<a href="https://github.com/inkandswitch/pushpin">Pushpin</a> - A collaborative corkboard app.<br>
<a href="https://github.com/automerge/pixelpusher">Pixelpusher</a> - Real-time peer-to-peer collaboration with React.<br>
<a href="https://github.com/gothinkster/realworld">Realworld</a> - The mother of all demo apps&quot; &#x2014; Exemplary fullstack Medium.com clone powered by React, Angular, Node, Django, Ember etc.<br>
<a href="https://github.com/cowbell/sharedrop">Sharedrop</a> - Easy P2P file transfer powered by WebRTC - inspired by Apple AirDrop.<br>
<a href="https://github.com/johannesjo/super-productivity">Super Productivity</a> -  Super Productivity is a ToDo List / Time Tracker / Personal Jira Task Manager for Linux, MacOS and Windows.<br>
<a href="https://github.com/debiki/talkyard">Talkyard</a> - A combination of stackoverflow, wiki and slack.<br>
<a href="https://github.com/mapsme/omim">Maps.me</a> - MAPS.ME is an open source cross-platform offline maps application, built on top of crowd-sourced OpenStreetMap data.<br>
<a href="https://github.com/papercups-io/papercups">Papercups</a> - Papercups is an open source live customer chat web app written in Elixir.<br>
<a href="https://github.com/penpot/penpot">Penbot</a> - Penpot is the a design and prototyping platform meant for cross-domain teams.<br>
<a href="https://github.com/makeplane/plane">Plane</a> - Open Source JIRA, Linear and Height Alternative. Plane helps you track your issues, epics, and product roadmaps in the simplest way possible.<br>
<a href="https://github.com/Tablane/tablane">Tablane</a> - Tablane is a workspace that adapts to your needs. It&apos;s as minimal or as powerful as you need it to be. Built in React + Tailwind.<br>
<a href="https://github.com/upptime/upptime">Upptime</a> - A open-source uptime monitor and status page, powered entirely by GitHub Actions, Issues, and Pages.<br>
<a href="https://github.com/kochrt/qr-designer">QR-Designer</a> - QR designer web app with a novel method of designing qr codes that does not take advantage of error correction.<br>
<a href="https://www.langui.dev/">LangUI</a> - LangUI is an Open Source Tailwind library with free to use components tailored for your AI and GPT projects. Focus on building the next best project and let it handle the UI.</p>
<h3 id="reactlibsresources">React libs / resources</h3>
<p><a href="https://github.com/uber/react-map-gl">react-map-gl</a> - React friendly API wrapper around MapboxGL JS.<br>
<a href="https://uber.github.io/react-vis/">react-vis</a> - Data Visualization Components<br>
<a href="https://github.com/reakit/reakit">reakit</a> - Toolkit for building accessible rich web apps with React.<br>
<a href="https://github.com/plouc/nivo">Nivo</a> - A set of dataviz components, built on top of d3 and Reactjs libraries.</p>
<h3 id="templatesboilerplates">Templates / boilerplates</h3>
<p>Here is a bunch of templates and boiler plates for hitting the ground running in your next endeavour.</p>
<p><a href="https://bootstrapious.com/">Boostrapsious</a> - Free (and non-free) Bootstrap themes.<br>
<a href="http://bootswatch.com/">Bootswatch</a> - Free themes for Bootstrap.<br>
<a href="http://extensionizr.com">Extensionizr</a> - Start a chrome extension in 15 seconds.<br>
<a href="http://hosseinkarami.com/fastshell/">Fastshell</a> - Simple, quick front-end boilerplate and workflows.<br>
<a href="http://html5up.net/">Html5up</a> - Free HTML5 site templates.<br>
<a href="http://www.initializr.com/">Initializr</a> - HTML5 template generator to help you getting started with a new project fast<br>
<a href="https://andybrewer.github.io/mvp/">MVP CSS</a> - A minimalist stylesheet for HTML elements.<br>
<a href="http://startbootstrap.com/">Start Boostrap</a> - More free (and non-free) Bootstrap themes.<br>
<a href="http://underscores.me/">Underscores</a> - Wordpress theme starter kit.<br>
<a href="https://www.30secondsofcode.org/">30 Seconds Of Code</a> - Short code snippets for your development needs.</p>
<h3 id="testinganduserexperience">Testing and user experience</h3>
<p>Tools for testing and improving your web applications.</p>
<p><a href="https://www.browserstack.com/">Browserstack</a> - Test your projects on 2000+ real devices and browsers.<br>
<a href="https://www.fullstory.com/">Fullstory</a> - See how your users actually use your web application.<br>
<a href="https://www.fakenamegenerator.com/">Fake name generator</a> - Generate random realistic identities for testing.<br>
<a href="https://github.com/marmelab/gremlins.js">Gremlins.js</a> - Unleash the gremlins on your application or site to test it&apos;s robustness. :)<br>
<a href="https://gtmetrix.com/">Gtmetrix</a> - See how your site performs, reveal why it&apos;s slow and discover optimization opportunities.<br>
<a href="https://developers.google.com/speed/pagespeed/insights/">Pagespeed</a> - Googles pagespeed test can help you make your web pages fast on all devices.<br>
<a href="http://khan.github.io/tota11y/">Tota11y</a> - Tota11y helps visualize how your site performs with assistive technologies.<br>
<a href="https://usetrace.com/">Usetrace</a> - Mostly codeless UI test automation in the cloud.<br>
<a href="https://github.com/getgauge/taiko">Taiko</a> - A node.js library for testing modern web applications.<br>
<a href="https://testproject.io/">Testproject</a> - TestProject is an end-to-end test automation platform for web, mobile, and API.</p>
<h2 id="escapegoogleprivacy">Escape Google / Privacy</h2>
<p>Google removed &quot;Don&apos;t be evil&quot; clause from their code of conduct and got 200% more evil. Here are some alternatives to Google stuff and generally avoid tracking. Because <a href="https://jacquesmattheij.com/if-you-have-nothing-to-hide/">privacy matters</a>.</p>
<p><a href="https://github.com/sovereign/sovereign">Sovereign</a> - Run your own infrastructure for email, file sharing and what not.<br>
<a href="https://www.fastmail.fm/">Fastmail</a> - Alternative email provider for Gmail.<br>
<a href="https://www.privacytools.io/">PrivacyTools</a> - PrivacyTools provides services, tools and knowledge to protect your privacy against global mass surveillance.<br>
<a href="https://prism-break.org">Prismbreak</a> - Opt out of global data surveillance programs like PRISM, XKeyscore and Tempora.<br>
<a href="https://syncthing.net/">Syncthing</a> - Syncthing is a continuous file synchronization program aka. open source dropbox.<br>
<a href="https://github.com/tycrek/degoogle">DeGoogle</a> - A huge list of alternatives to Google products. Privacy tips, tricks, and links.<br>
<a href="https://www.ethicalads.io/">Ethical Ads</a> - Ads for developers in an ethical way.</p>
<h2 id="marketing">Marketing</h2>
<p>I know we tech wizards love getting lost in code and building the next big thing, but without marketing, all that hard work will be for nothing. It&apos;s like building a castle in the middle of the desert, sure it&apos;s impressive, but if no one knows it&apos;s there, what&apos;s the point?</p>
<h3 id="emailmarketing">Email marketing</h3>
<p><a href="https://smartblogger.com/email-list-incentives/">Email List Incentives</a> - A comprehensive article on using lead magnets to get subscribers for your blog.<br>
<a href="https://www.gmass.co/inbox">Gmass Inbox</a> - Test if Gmail considers your emails as spam or do they land in the inbox.<br>
<a href="https://www.mail-tester.com">Mail Tester</a> - Check your email messages before sending them out to ensure they are not considered spam.<br>
<a href="https://reallygoodemails.com/">Really Good Emails</a> - A huge collection of high quality emails for transactional/marketing email inspiration.<br>
<a href="https://www.za-zu.com/handbook">The Cold Outbound Handbook</a> - In depth guide to cold outreach</p>
<h3 id="guidesinspiration">Guides &amp; inspiration</h3>
<p><a href="https://marketingexamples.com/">Marketing Examples</a> - Long list of the finest real world marketing examples.<br>
<a href="https://github.com/LisaDziuba/Marketing-for-Engineers">Marketing For Engineers</a> - A curated collection of marketing articles &amp; tools to grow your product.<br>
<a href="https://www.mikesonders.com/saas-website-best-practices/">SaaS Website Best Practices</a> - Understand how to build a great SaaS Website.<br>
<a href="https://sizle.io/how-to-maximise-traffic-to-a-bootstrapped-product-hunt-launch/">Sizle directories list</a> - Mega list of submission directories to get exposure for your new project.</p>
<h3 id="socialmediaautomation">Social media automation</h3>
<p>Tools to help automate social media and make the bots take over the world.</p>
<p><a href="https://github.com/alexal1/Insomniac">Insomniac</a> - Instagram bot written in python that runs it&apos;s automation on a virtual device or on a real Android device.<br>
<a href="https://github.com/jaebradley/tinder-client">Tinder Client</a> - NodeJS based Tinder client.</p>
<h3 id="searchengineoptimizationseo">Search Engine Optimization (SEO)</h3>
<p>Tools and articles on handling of search engine optimization.</p>
<p><a href="https://ahrefs.com/">Ahrefs</a> - Excellent tools for monitoring and optimizing your site for SEO.<br>
<a href="https://www.mikesonders.com/saas-website-best-practices/">SaaS website best practices</a> - Actionable advice on how to have a great web presence as a SaaS startup.</p>
<h3 id="photosmockupsillustrationsvideos">Photos/mockups/illustrations/videos</h3>
<p>Resources for finding those juicy free photos, videos or icons for boostrapping your startup idea.</p>
<p><a href="https://visualhunt.com/">Visualhunt</a> - Creative commons photo search engine.<br>
<a href="http://thestocks.im">The Stocks</a> - Yet another stock search engine.<br>
<a href="https://www.mockupworld.co/">Mockupworld</a> - Find free Mockups from the Web<br>
<a href="http://unsplash.com/">Unsplash</a> - The place to find free, high quality photos<br>
<a href="http://compfight.com/">Compfight</a> - Locate visual inspiration<br>
you need.<br>
<a href="http://littlevisuals.co/">Littlevisuals</a> - Free, high resolution images<br>
<a href="http://picjumbo.com/">Picjumbo</a> - Free high-resolution images for personal and commercial use<br>
<a href="http://www.gratisography.com/">Gratisography</a> - Quirky, creative and free photos<br>
<a href="http://www.morguefile.com/">Morguefile</a> - Free images for creatives, by creatives<br>
<a href="http://www.freepik.com/">Freepik</a> - Graphic resources for everyone<br>
<a href="http://pixabay.com/">Pixabay</a> - Stunning free images &amp; royalty free stock<br>
<a href="http://jeshoots.com/">Jeshoots</a> - Free to use photography by Jan Va&#x161;ek, who wants to help to all of the artists.<br>
<a href="http://nos.twnsnd.co/">New Old Stock</a> - Vintage photos from the public archives. Free of known copyright restrictions.<br>
<a href="http://moveast.me/">Moveast</a> - This is a journey of a Portuguese guy moving to the east decided that every photo should be used for free.<br>
<a href="http://www.lifeofpix.com/">Life of Pix</a> - Another site with free high resolution photography.<br>
<a href="http://www.kaboompics.com/">Kaboompics</a> - Free stock photography and color palettes.<br>
<a href="http://www.designerspics.com/">Designerspics</a> - Free Hi-Res photos for your personal &amp; commercial use. Attribution not required!<br>
<a href="http://startupstockphotos.com/">Startup Stock Photos</a> - Startup themed free to use stock photos<br>
<a href="http://jaymantri.com/">Jaymantri</a> - CC0 photos by Ajay Mantri<br>
<a href="http://www.sitebuilderreport.com/stock-up">Stock Up</a> -  Free stock photo aggregator<br>
<a href="http://isorepublic.com/">Isorepublic</a> - Free high-resolution CC0 photos and videos<br>
<a href="https://www.pexels.com/">Pexels</a> - Free stock photos &amp; videos shared by talented creators.<br>
<a href="http://coverr.co/">Coverr</a> - Beautiful free stock video footage<br>
<a href="https://iconduck.com/">Iconduck</a> - Free icons, no email/signup required.<br>
<a href="https://iradesign.io">Iradesign</a>  - Build your own illustrations.</p>
<h3 id="offlinegoodiesswag">Offline goodies &amp; swag</h3>
<p>We do not yet live in a fully digital world and it can be cool to get some swag for your company.</p>
<p><a href="https://calepino.fr/en/product">Calepino</a> - Calepino offers great quality brandable office goodies<br>
<a href="http://colorplanpapers.com">Colorplan Paper</a> - Paper of epic quality from England for those extraordinary business cards<br>
<a href="https://www.gooten.com/">Gooten</a> - Build an online store and let Gooten produce the goodies and fulfill orders.<br>
<a href="http://www.thefatcloth.com/">Fatcloth</a> - The most epic pocket squares that double as screen or eyewear cleaning cloth. Also brandable to your own companys needs.<br>
<a href="https://www.realthread.com/">Realthread</a> - Makes it easy to order super soft, stylish custom printed t-shirts<br>
<a href="https://www.stickermule.com/">Stickermule</a> - Stickers and other swag with minimal hassle</p>
<h2 id="security">Security</h2>
<p>We can not forget security even in a busy startup.</p>
<p><a href="https://github.com/toniblyx/my-arsenal-of-aws-security-tools">AWS Security tools</a> - List of open source tools for AWS security: defensive, offensive, auditing, DFIR, etc.<br>
<a href="https://honest.security/">Honest Security</a> - A guide to endpoint security and device management that doesn&apos;t erode your values.</p>
<h2 id="studyingreferencetools">Studying / reference / tools</h2>
<p>Site / applications / references to help you study stuff to keep your mind sharp and fingers fast.</p>
<p><a href="https://0data.app/">0 Data App</a> - A specification for apps where users own their data.<br>
<a href="https://apps.ankiweb.net/">Anki</a> - Powerful, intelligent flash cards.<br>
<a href="https://crontab.guru/">Crontab Guru</a> - The quick and simple editor for cron schedule expressions.<br>
<a href="https://ihateregex.io/">Ihateregex</a> - The Regex Cheat Sheet<br>
<a href="https://www.keybr.com/">Keybr</a> - Take typing speed test, practice your touch typing skills, learn to type faster and with fewer errors with this free online typing tutor.<br>
<a href="https://www.shortcutfoo.com/">Shortcutfoo</a> - Practice shorcuts and become a  ninja through interactive learning and repetition.<br>
<a href="https://github.com/jlevy/the-art-of-command-line">The Art of Commandline</a> -  Master the command line, in one page.<br>
<a href="https://www.typelit.io/">Typelit</a> - Improve your typing for free online by practicing on classic literature.<br>
<a href="https://fpt.guide/">FTP</a> - The Ultimate Guide to First-Principles Thinking<br>
<a href="https://github.com/ossu/computer-science">Open Source Computer Science</a> - Path to a free self-taught education in Computer Science!<br>
<a href="https://gchq.github.io/CyberChef/">CyberChef</a> - A simple, intuitive web app for analysing and decoding data without having to deal with complex tools or programming languages.<br>
<a href="https://devdocs.io/">Devdocs</a> - DevDocs combines multiple API documentations in a fast, organized, and searchable interface.<br>
<a href="https://devhints.io/">Devhints</a> - Rico&apos;s collection of cheatsheets for all things programming.<br>
<a href="https://samwho.dev/load-balancing/">Load Balancing</a> - Understand load balancing.</p>
<!--kg-card-end: markdown--><p></p>]]></content:encoded></item><item><title><![CDATA[The guide to outsourcing a digital minimum viable product]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>This is a mega post on outsourcing a digital Minimum Viable Product to test the viability of your idea with real customers. This would be a great read if you&apos;re looking to build an MVP for your startup or enterprise and don&apos;t have much experience from</p>]]></description><link>https://journal.wingmen.fi/guide-outsourcing-digital-minimum-viable-product/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc334</guid><category><![CDATA[Business]]></category><category><![CDATA[outsourcing]]></category><category><![CDATA[startups]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Sun, 09 Apr 2017 11:44:37 GMT</pubDate><media:content url="https://journal.wingmen.fi/content/images/2020/03/airplane_MVP-progressions-illustration-1.svg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://journal.wingmen.fi/content/images/2020/03/airplane_MVP-progressions-illustration-1.svg" alt="The guide to outsourcing a digital minimum viable product"><p>This is a mega post on outsourcing a digital Minimum Viable Product to test the viability of your idea with real customers. This would be a great read if you&apos;re looking to build an MVP for your startup or enterprise and don&apos;t have much experience from outsourcing technical projects.</p>
<p>This post is divided into 6 chapters:</p>
<ol>
<li><a href="#1keepingitrealwithminimumviableproduct">Keeping it real with Minimum Viable Product</a></li>
<li><a href="#2scopingyourmvpusinguserstorymapping">Scoping your MVP using User Story Mapping</a></li>
<li><a href="#3writingarequestforproposal">Writing a request for proposal</a></li>
<li><a href="#4findingagreatpartnerforoutsourcingyourmvp">Finding a great partner for outsourcing your MVP</a></li>
<li><a href="#5tipsforwritinganoutsourcingcontract">Tips for writing an outsourcing contract</a></li>
<li><a href="#6managinganoutsourcingproject">Managing an outsourcing project</a></li>
</ol>
<h2 id="1keepingitrealwithminimumviableproduct">1. Keeping it real with Minimum Viable Product</h2>
<p>Let&apos;s take a look at how and why you should try to go minimal when building a minimum viable product (MVP) application. Yes, I know, it&apos;s in the name. But let&apos;s dig a bit deeper!</p>
<p>&quot;The minimum viable product is that version of a new product which allows a team to collect the maximum amount of validated learning about customers with the least effort.&quot; &#x2014; Eric Ries, Author of The Lean Startup</p>
<p>The purpose of an MVP is to test the market viability and learn about your customers. Your MVP should have just the bare minimum features needed to deliver that value and get your customer to part with their money.</p>
<h3 id="stayingfocused">Staying focused</h3>
<p>When you&apos;re close to the idea it is easy to get carried away and start adding cool features. Try to avoid this at all cost. I&apos;ve noticed that it is a good habit to write down the ideas for later to get them out of your head. This will help you let go and keep focused on the core value delivering features.</p>
<p>Keeping the scope small and manageable will maximize the chances of MVP project success. It is far easier to successfully execute a tight, well-defined MVP than a complex, monstrosity of an app. This will, as well, minimize your losses in case your MVP flops or turns out non-viable.</p>
<p>You should aim to get to an MVP which you can build and launch within a few weeks to a maximum of a couple of months. Generally, that should be enough time to build most MVPs. If it takes longer, you&apos;re likely building something that is too big i.e. a much riskier investment.</p>
<h3 id="exerciseinminimalism">Exercise in minimalism</h3>
<p>Let&apos;s assume you have a clear idea of what is the problem you are solving. Next, you will want to drill down to find the core of your product that is just enough.</p>
<p>Unfortunately, there is no secret shortcut or strategy that will let you come out with the correct feature set every time. Ultimately, you&apos;ll have to interact with your future customers to find out where the sweet spot is.</p>
<p>We&apos;ve used the following process successfully to establish which features should be included in an MVP:</p>
<ul>
<li>Create a list of product features that will solve your client&apos;s problem.</li>
<li>Step into your customers&apos; shoes and see what is the bare minimum feature set that will deliver the value.</li>
<li>Get in touch with your future users and see if they agree. If you can, try pre-selling to validate the value proposition of the minimal feature set.</li>
<li>Iterate points 2 and 3 until you have validated the minimum set of features.</li>
</ul>
<p>Essentially, you will be repeating this process after you have your first MVP out. Take in user feedback (learning) and release new versions to address that and better serve your users.</p>
<h3 id="detectingnonessentialfeatures">Detecting non-essential features</h3>
<p>Even with the best intentions of whittling down your product, you easily end up having too many features. Here are a couple of ways to spot features, which you should cut:</p>
<ul>
<li>For each feature you intend to put in your MVP, think: &#x201C;can I still deliver the value if I do not have this?&#x201D;. If you can, then cut the feature.</li>
<li>The feature was added as a result of &quot;It would be nice/cool/great to have X...&quot;. These are often nice-to-have features that are not critical to your MVP.</li>
<li>The customer is saying &quot;If your product had an integration with X, then I would pay...&quot;. The integration is probably not what you need. It might be a warning sign that the core value of your product is not high enough.</li>
</ul>
<p>This should help you keep it minimal when it comes to building your first MVP!</p>
<h2 id="2scopingyourmvpusinguserstorymapping">2. Scoping your MVP using User Story Mapping</h2>
<p>In the previous chapter, we took a look at why you want to keep your MVP scope minimal and some ways to come up with the core features. This chapter will dive into how you can put it down on paper following loosely the User Story Mapping method coined by Jeff Patton.</p>
<p>A solid product scope document is a critical part of an MVP project. You need to be able to describe your idea to stakeholders, be it people inside your company or an outsourcing partner. Especially if you are starting work with a new partner, you have to assume anything you have not written down in your scope document, will not get built.</p>
<p>Generally speaking, the less you pay for the outsourcing, the more effort you have to put into building a very detailed definition document and managing the development process to ensure quality output. We will get back to this in a later chapter when we talk about finding a partner.</p>
<h3 id="enteruserstorymapping">Enter user story mapping</h3>
<p>There are several ways to approach scoping your product. In this article, I will introduce you to user story mapping. User stories help you step into your user&apos;s shoes and see the product from their eyes.</p>
<p>This is a good technique to enable you to describe your product in great detail. Which is exactly what we are looking for. I will be using <a href="https://tinder.com">Tinder</a> as a fairly simple example here.</p>
<p>If you are right now going through the process, it&apos;s time to whip out your favorite word processor and start typing.</p>
<ol>
<li>Define the primary goal/benefit of your product and write it out. For Tinder,this could be: &quot;Users can find and connect with people, who find each other mutually romantically interesting.&quot;</li>
<li>Define the main high-level process to achieve the primary goal. Visualize how you as a user of your app would go through this process and write it down. In Tinder&apos;s case it could be:</li>
</ol>
<ul>
<li>User signs up</li>
<li>User sets their interests/settings</li>
<li>User can browse through profiles matching their interests/settings</li>
<li>User can indicate interest/disinterest per profile</li>
<li>User will get notified when there is a &quot;match&quot; indicating mutual interest</li>
<li>User can chat with matches</li>
</ul>
<ol start="3">
<li>Focus on each step of the process at a time and write down a list of features available in that step. You should try to visualize yourself using the app. It might help to draw each step on paper.</li>
</ol>
<ul>
<li>Identify and prioritize critical features and put them on top.</li>
<li>Clean up and add more details.</li>
</ul>
<p>You will want to be very specific about how each step works. For example, in the signup step, you have to answer questions like:</p>
<ul>
<li>How does the user initiate this step (e.g. opens app, tap a button)?</li>
<li>What does the user see first? Are there animations?<br>
What info should be collected at this stage (e.g. name, email, password)?</li>
<li>How will each piece of information be collected (e.g. text field, dropdown, third party integration like FB login)?</li>
<li>What happens when they submit the form? Possible error messages?</li>
</ul>
<p>This is the user story for the core flow of your application. Next, you will want to repeat this process for each feature of your MVP until you have described the whole app. In the end, you should have a document detailing all the possible use cases for your application.</p>
<h2 id="3writingarequestforproposal">3. Writing a request for proposal</h2>
<p>In the previous chapter, we looked at how you can scope your product using user stories. This chapter&apos;s topic is writing a request for proposal (RFP). This is the document you will be sending to potential outsourcing partners.</p>
<p>The purpose of the RFP is to describe the services you&apos;re looking to acquire in detail. You&apos;ll want to include your scope document as an attachment as well.</p>
<p>Next, we will go over the key sections a killer RFP should cover. Get your word processor warmed up!</p>
<h3 id="projectoverviewbackground">Project overview &amp; background</h3>
<p>This is the standard start, where you give an overview of your project and some background info. You should tell a bit about the project, your company, why this project is being considered and an overview of the goals.</p>
<h3 id="projectgoalsandtargetaudience">Project goals and target audience</h3>
<p>Explain what you plan to accomplish and what will be the expected outcome of the project. You should also describe your target audience as this will help the vendor to understand requirements better.</p>
<h3 id="scopeofwork">Scope of work</h3>
<p>The Scope of work describes the services you&apos;re looking to purchase. This will be the design and development of your MVP as well as any additional services you might wish to purchase. For example, you might want to include a landing page and a hosting solution on top of the design and development work.</p>
<h3 id="scopeofproducttechnicalrequirements">Scope of product &amp; technical requirements</h3>
<p>Here you&apos;ll want to reference your scope definition document that describes your product. In addition, you should describe the technical requirements of your project. E.g. device/browser support and testing, future scaling needs and the use of a viable technology stack for going forward.</p>
<p>One important MVP-specific technical requirement is tracking. The purpose of an MVP is to gather learnings about your users. You should have a way to track what your users do. This could go from a simple Google Analytics setup to a complex Mixpanel/Kissmetrics integration depending on your budget and needs.</p>
<p>This is a part where you should be looking for technical help to ensure things are in order. It could be a qualified friend or an outside consultant. In the full course, my RFP template includes some valid example technology stacks, with PROs and CONs listed. But still, every project is different and one size rarely fits all when it comes to building digital services.</p>
<h3 id="timeline">Timeline</h3>
<p>You should describe the timeline you&apos;d expect to get the project done in. A smart strategy is to ask the vendor to divide the whole project into small deliverable parts and have a deadline and separate payment for each stage. This enables you to see how things are progressing and if the work is satisfactory without investing in the whole thing at once.</p>
<h3 id="pointofcontact">Point of contact</h3>
<p>Here you will let them know who to be in touch with regarding the project and who has the final say on decisions. It is critical that your vendor has easy access to the person who can do the decisions.</p>
<h3 id="budget">Budget</h3>
<p>Yes, you should really put in a budget - at least a rough figure. MVPs are like cars or houses. You can get a crappy one on the cheap. For a luxurious end-product, you&apos;ll be paying a lot more of course.</p>
<p>You should be up-front about how much you&apos;re willing to spend, this saves time on both ends. You won&apos;t spend time reading proposals that are too expensive for you. And on the other hand, vendors do not waste time writing proposal out of your budget range.</p>
<p>If you cannot trust your future vendors to not screw you over with pricing, maybe you are looking at the wrong vendors. Trust is a key part of a successful outsourcing project. If you don&apos;t have that from the start, then you&apos;re already going down a perilous path.</p>
<p>Additionally, having all offers come in with similar price-points makes it much easier to compare the offers. For example, someone might throw in a round of user testing whereas the other just offers the features.</p>
<h3 id="supportretainer">Support/retainer</h3>
<p>Once the MVP is launched, you will want to secure help fixing bugs, improving existing features or adding new ones. In the future, you might be looking to hire your own team to work on the product. But to support the MVP and facilitate the transition, you should have the option to continue the relationship with the partner.</p>
<h3 id="criteriaforselection">Criteria for selection</h3>
<p>You should let the vendors know what are the key criteria for selection. Depending on your specific situation this might be a combination of cost, timeline, previous experience from similar projects, demonstratable know-how in some specific area etc.</p>
<h3 id="formatproposaltimeline">Format &amp; proposal timeline</h3>
<p>Here you should let the vendors know in what format and on what date you&apos;d be looking to get the proposals in.</p>
<p>Now you have an understanding of what a comprehensive RFP could look like. Writing a great RFP from ground-up is no small task. It could take you anywhere from four hours to a few days of work.</p>
<h2 id="4findingagreatpartnerforoutsourcingyourmvp">4. Finding a great partner for outsourcing your MVP</h2>
<p>In the previous chapter, we looked into what a comprehensive RFP should contain. In this chapter we will be going over how to find, vet and choose your future partner.</p>
<p>Finding the right partner for your MVP outsourcing is perhaps the most critical part of the process. This is going to be a long one.</p>
<h3 id="theprocess">The process</h3>
<p>A thorough process could look like this:</p>
<ul>
<li>Come up with a list of potential candidates</li>
<li>Do a preliminary round of vetting</li>
<li>Send out the RFP to the vendors who passed</li>
<li>Vet the received proposals and select the final candidates</li>
<li>Do further vetting on those</li>
<li>If you have the budget, run a proof of concept project with your favorite 2-5 candidates</li>
<li>Trust your instincts above all else. If something doesn&apos;t feel right, do not proceed :)</li>
</ul>
<p>But first, let&apos;s take a quick detour to right a common misconception people have about outsourcing development...</p>
<h3 id="cheapgoodfast">Cheap, good &amp; fast</h3>
<p>One of the major fallacies people have about outsourcing software is that all software is built equal. You cannot get something that is cheap, good quality and delivered fast - having all three qualities in one vendor is just a bit more likely than winning the lottery. You will have to be prepared to compromise on at least one of the qualities. Let&apos;s look at it through an analogy of building a house.</p>
<p>You can spend a little money on a cheap labor contractor to build your house. You&apos;ll have to probably describe your house in great detail to get what you want. If you do not specifically request you&apos;d like a roof and a door - you might be missing both! And still it will have problems like leaky pipes (you forgot to specifically say they should not be leaky), toilets not flushing and lights working only half of the time. The project ran late as well as you might have guessed... In the next year when you decide to build that second floor, the new contractor says that the foundings are not strong enough and the whole house needs to be rebuilt. It was cheap to start with, but in the end, you ended up paying more.</p>
<p>Alternatively, you reach out to a well-known, and yes expensive as well, contractor and let them know your wishes. They understand your demands and execute your vision with speed. You will have a beautiful house, where everything works. And the project is on time. They even went beyond expectations and included a beautiful hand-carved nameplate on your door. Next year, the second-floor project will be done at ease as the foundings are rock-solid.</p>
<p>This is how it is with software as well. You will VERY likely be getting what you pay for. There are exceptions to this, but that is leaving things to luck and guesswork.</p>
<p>The takeaway from this detour is - if you are looking to outsource to the cheaper developers, you really have to put in the effort beforehand to ensure there will be a door and a roof to your house. :)</p>
<h3 id="typesofvendors">Types of vendors</h3>
<p>Generally, there are three types of vendors to choose from when outsourcing your MVP. Any of the choices can work for your project, but I&apos;ll give you some pros and cons of each below to make it easier to pick the best for you.</p>
<p>Freelancers:</p>
<ul>
<li>[+] can be cheaper</li>
<li>[+] work with one person, easy to build a relationship</li>
<li>[+] fast-moving</li>
<li>[-] riskier, can disappear / no support going forward</li>
<li>[-] lack of resources building something larger</li>
</ul>
<p>Small agencies (~2-15)</p>
<ul>
<li>[+] move fast still</li>
<li>[+] work with a team, still able to build a relationship</li>
<li>[+] more resources</li>
<li>[-] can be more costly than a freelancer</li>
</ul>
<p>Large agencies/companies (15+)</p>
<ul>
<li>[+] lots of resources</li>
<li>[-] harder to have a good relationship, people change</li>
<li>[-] quality changes depending on the team (previous references not indicative of future success)</li>
<li>[-] more overhead, costly</li>
<li>[-] move slow</li>
</ul>
<h3 id="findingvendors">Finding vendors</h3>
<p>The best way to find great candidates is by a recommendation from somebody you know and trust. Especially if they have actually worked with the vendor before and are basing the recommendation on that experience. If it&apos;s just a word-of-mouth recommendation, then you might want to take the recommendation with a grain of salt - particularly if it&apos;s a larger company. As you might just get unlucky and have an incompetent team working on your product.</p>
<p>Another option is to use communities you&apos;re a part of to ask for recommendations. Think Facebook groups you&apos;re a member of, your housing association meeting or the folks at your yoga club for example.</p>
<p>If recommendations don&apos;t bring up anything, then you&apos;ll have to trust the internet. If you&apos;re looking to find a freelancer you&apos;ll have many, many sites available (Upwork, Elance, Craigslist, etc.). For finding agencies or companies, you can turn to google. You can find quite a few agencies focusing on building MVPs with a proven track record. Search terms could be &quot;startup agency&quot; or &quot;mvp startup agency&quot; for example.</p>
<h3 id="vettingvendorsbeforesendingrfp">Vetting vendors before sending RFP</h3>
<p>The first round of vetting should be a quick check to see if they have a decent website and some previous work shown. You should find links to actual live products you can play with. It&apos;s a definite red-flag if you cannot find any projects to play with. If you have a technical friend available, you could ask them to take a look at the technology side of the reference projects.</p>
<h3 id="vettingafterreceivingproposals">Vetting after receiving proposals</h3>
<p>When you start receiving proposals, you should carefully go over them and see how well they match your requirements. Then you&apos;ll pick the ones that seem to be the best fit for your project and proceed to vet them further. The further vetting would include contacting previous clients for comments and in-person meetings with the person/team you&apos;d be working with.</p>
<p>Next step would depend on your budget. Nothing really beats actually trying out each candidate for a small proof of concept project to see how they fare. If you have the budget, you should hire your top 2-5 candidates and have them all complete the same, small piece of your product. Then you can assess the work and the experience of working with each vendor.</p>
<p>With these steps completed, you should have a good chance of having found a great partner!</p>
<h2 id="5tipsforwritinganoutsourcingcontract">5. Tips for writing an outsourcing contract</h2>
<p>In the chapter we talked about finding and vetting your future partner. In this chapter, we&apos;ll be looking at how to seal the deal with a solid contract.</p>
<p>The project is starting to look good to go. Next, you must prepare for the case that despite all your efforts some problems arise during the project.</p>
<p>If you&apos;re working with an experienced partner, they will probably have their own contract that they will be looking to use. In fact, seeing their contract or lack of can be one more step in the vetting process. In case you&apos;re working with a freelancer, you might need to come up with your own contract.</p>
<p>In any case, it is wise to involve a lawyer in the process. Depending on the depth of your war chest, you might wish to engage an experienced contract lawyer from the get-go. A more economical option is to get the contract as far as possible just between you and your chosen partner. Then at the end of the process hire a lawyer to check and fix potential problems.</p>
<p>Let&apos;s go over some of the key points your contract should cover.</p>
<ul>
<li>The contract should explicitly state what you&apos;re hiring the vendor to do. This should summarize and reference the request for proposal as well as the definition document.</li>
<li>Define the responsibilities of each party and what happens when there are problems (delays, disagreements, etc.).</li>
<li>You will want to ensure the transfer of immaterial rights on payment. You will want to have the contract be very clear that you or your company will be owning the IP rights to all deliverables produced (code, graphics, etc.).</li>
<li>Non-disclosure. You will want to ensure your confidential information is not used in a way that you don&apos;t want.</li>
<li>Testing and fixing of bugs. You will want to touch on how your MVP is tested and how bugfixes are handled.</li>
<li>Dispute resolution. How and under which law and where are possible the disputes resolved.</li>
</ul>
<p>In case you have to come up with your own contract and lack the resources to hire a lawyer to do it, you can scour the internet for templates. With a lot of time and effort, you can put together a reasonable contract on your own as well. Still, it&apos;s best to involve a local lawyer to ensure it&apos;s valid in your and your vendor&apos;s countries. A very lightweight starting point could be <a href="https://stuffandnonsense.co.uk/projects/contract-killer/">Contract Killer</a> by Stuff &amp; Nonsense.</p>
<p>Especially if you&apos;re looking to get funded, it could be critical that your contract is well thought out and covers your bases properly. Investors could view the lack of proper contracts as a risk they don&apos;t want to take.</p>
<h2 id="6managinganoutsourcingproject">6. Managing an outsourcing project</h2>
<p>There are many ways to run a successful outsourcing project. Some principles, however, hold for most projects. I&apos;ve put down some key ideas here to help you tackle your project.</p>
<h3 id="buildarelationship">Build a relationship</h3>
<p>Building good relationships with your developers and designers will make or break the project. You will want to personally know the people working on your project. You should talk with each one to ensure they are on board with your vision. Having a good and easygoing relationship will ensure they will not keep you in the dark when there are problems - which are sure to come up in any project. You want your team to be open and upfront about problems so they can be sorted quickly.</p>
<p>Depending on the type of partner you are starting your work with, they might have a project manager manage your resources in their end. This can be riskier than building real relationships with the actual people, who are doing the heavy lifting in the project. Adding more layers will slow things down and you risk suffering from the broken phone effect where the extra layer of communication changes the message on the way.</p>
<p>In some cases, you might have a team of developers who need a manager because they don&apos;t understand your business or do not speak your language. Then there&apos;s no choice. But in that case, you really should consider another option/team.</p>
<p>To build relationships you need to communicate well. Meeting your team and treating them to dinner can be a powerful way to start the relationship. If this is not possible, try to arrange for a personal call with each member. Remember to give your team feedback and praise when appropriate.</p>
<p>The larger the project is, the more critical it will be to retain the people working on your project. Developers are not cogs in a machine. Having to replace people WILL slow your project - no matter what your outsourcing partner says. Also, the quality of work suffers greatly when there is no ownership of the code. You will want to keep your team together.</p>
<h3 id="remoteworkcommunication">Remote work &amp; communication</h3>
<p>When you are outsourcing your MVP development, it is likely you are working with a remote team. Below are some best practices on successful remote work:</p>
<ul>
<li>Get to know each person, it will make remote work much easier</li>
<li>Ensure sufficient timezone overlap (min. 2-4h would be best)</li>
<li>Use project management software to stay on top and monitor progress (Basecamp, Jira, Trello, Asana, Github Issues, Linear... anything that works for you)</li>
<li>Have set communication channels (e.g. Slack for day-to-day communication, Skype for facet-to-face meetings)</li>
<li>Communicate asynchronously, interrupting developers every time you want to ask something will cost money &amp; frustrate your team</li>
</ul>
<h3 id="theworkprocess">The work process</h3>
<p>You should ensure an open and interactive development process. This means that you should have access to the product being built from week one. You don&apos;t want to close yourself from your product and hope that all is well. You need to be involved in testing and using your future product. Have your friends and associates try it as well.</p>
<p>This enables you to see progress and help your team iterate on features as they are being built. It is much more efficient to fix things the moment they start going wrong.</p>
<p>Also, for usability testing on the cheap, you should let your mother and father try your product. This is a surefire way to find and fix a lot of usability problems. :)</p>
<h3 id="choosingtechnologies">Choosing technologies</h3>
<p>Choosing popular and opinionated technologies is especially critical for product owners with no technical background as you cannot evaluate your vendor&apos;s technology choices.</p>
<ol>
<li>Popular and open source means that you should have sane technologies and no vendor-lock in.</li>
<li>This will make your MVP more approachable for your own future team. Finding developers with relevant skills will be much easier.</li>
<li>A strongly opinionated framework (e.g. Next.js, Rails/Ember/etc.) will ensure that most choices regarding architecture are dictated by the framework (safer)</li>
<li>These frameworks often let you build faster as the focus is on business logic and not on the configuration.</li>
</ol>
<p>You can find some inspiration at <a href="http://techstacks.io/">TechStacks</a>.</p>
<p>With these tips, you should have a better chance to outsource your startups or enterprises MVP. :)</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[5 min to a mobile app with Ember & Cordova]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>This is a quick guide for going from zero to a working app with all the bells and whistles like livereload, app icons and splash screens setup in about 5 minutes. If all goes to plan. ;)</p>
<p>Thanks to <a href="http://embercordova.com/">Ember Cordova</a> project by <a href="https://isleofcode.com/">Isle of Code</a>, it has become super easy</p>]]></description><link>https://journal.wingmen.fi/5min-mobile-app-ember-cordova/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc32f</guid><category><![CDATA[Development]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Wed, 08 Feb 2017 01:17:09 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1461220830992-5a8d6a54af75?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1461220830992-5a8d6a54af75?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="5 min to a mobile app with Ember &amp; Cordova"><p>This is a quick guide for going from zero to a working app with all the bells and whistles like livereload, app icons and splash screens setup in about 5 minutes. If all goes to plan. ;)</p>
<p>Thanks to <a href="http://embercordova.com/">Ember Cordova</a> project by <a href="https://isleofcode.com/">Isle of Code</a>, it has become super easy to build hybrid mobile applications using Ember and Cordova.</p>
<p>This guide assumes you are on MacOS and have the following basics set up already.</p>
<ul>
<li>Recent version of Node.js, Npm &amp; Git</li>
<li>Xcode &amp; Android SDK</li>
<li>Apple developer account set up</li>
</ul>
<h2 id="settinguptheproject">Setting up the project</h2>
<p>First, let&apos;s setup the project and proceed to install some basics. Below you can copy paste the relevant commands.</p>
<pre><code>npm install ember-cli -g
ember new my-awesome-project
cd my-awesome-project
ember install ember-cordova
</code></pre>
<p>We have just created the basic Ember project with Cordova included. Ready to roll!</p>
<p>Next, we edit the <code>ember-cordova/cordova/config.xml</code> and set up a proper identifier for your app replacing the generated one. It should look something like <code>com.company.appname</code> for us it is <code>com.wingmen.my-awesome-app</code>.</p>
<pre><code>vim ember-cordova/cordova/config.xml
</code></pre>
<p>Then we need to change the default Ember config a bit to support Cordova. Let&apos;s modify the rootURL and locationType in <code>config/environment.js</code>.</p>
<pre><code>vim config/environment.js
</code></pre>
<p>Make it look like the following:</p>
<pre><code>rootURL: &apos;&apos;, // default was &apos;/&apos;
locationType: &apos;hash&apos;, // default was &apos;auto&apos;
</code></pre>
<p>All set here. Let&apos;s proceed to add the icon &amp; splash screen.</p>
<h2 id="appiconandsplashscreen">App icon and splash screen</h2>
<p>Ok, I&apos;ll admit it, this part might take a bit more time if you don&apos;t have SVGs ready to go.</p>
<p>To setup the icon for the app, save you SVG logo to <code>ember-cordova/icon.svg</code>. The icon should be a square. Then you can run <code>ember cdv:make-icons</code>. And that&apos;s it for icons.</p>
<p>For the splash, place your SVG file at <code>ember-cordova/splash.svg</code> and run ember cdv:make-splashes. Splashes will be resized and added to ther project.</p>
<p>The splash image has to support a lot of different screen sizes. You should download the splash SVG template provided by Isle of Code at <a href="http://embercordova.com/examples/safe-splash-template.svg">http://embercordova.com/examples/safe-splash-template.svg</a>. The image should have a background filling the entire area, and icons/text should be kept to the &#x2018;safe area&#x2019; box.</p>
<h2 id="setupplatforms">Setup platforms</h2>
<p>Now we are ready to setup the platforms for deploying.</p>
<pre><code>ember cdv:platform add ios
ember cdv:platform add android
</code></pre>
<p>Before being able to build the application, we need to open Xcode and select the development team. Xcode needs this to be able to sign the code. You can open the project in Xcode using the command below:</p>
<pre><code>ember cdv:open
</code></pre>
<p>Then in Xcode open the project and set the team on the &apos;General&apos; tab. Once the team is set and it shows the Signing Certificate below, you should save the project and get back to the terminal.</p>
<p>Now we have a basic functioning application, which you can build for iOS and Android with the following commands.</p>
<pre><code>ember cdv:build --platform=ios &amp;&amp; ember cdv:open
ember cdv:build --platform=android &amp;&amp; ember cdv:open
</code></pre>
<p>Wohoo, done! Did it take more than 5 min? Probably the SVG part screwed you. Or then you ran into a mystical problem with something along the way. If you did, you should rage at us on <a href="https://twitter.com/wingmenguys">Twitter</a>.</p>
<p>Next, we move to the extra goodies.</p>
<h3 id="ondevicelivereload">On-device livereload</h3>
<p>This feature makes developing and testing Cordova&apos;s native features a piece of cake. Change some code, save your file &amp; app reloads automagically on your phone. Developer bliss.</p>
<p>First you have to add the following line <code>&lt;allow-navigation href=&quot;*&quot; /&gt;</code> to your  <code>ember-cordova/cordova/config.xml</code>. Remember to remove this line for production builds.</p>
<pre><code>ember cdv:serve
ember cdv run --platform=ios --device
</code></pre>
<p>Pasting the above to your console should start your app in your phone with livereload enabled.</p>
<h3 id="nicecordovaplugins">Nice Cordova plugins</h3>
<p>Here&apos;s a few of our favourite Cordova plugins we find ourselves using time and time again.</p>
<p><strong>Crosswalk Webview</strong></p>
<p>This <a href="https://github.com/crosswalk-project/cordova-plugin-crosswalk-webview">plugin</a> lets you package a custom browser into you Android app, so the browser environment for your Cordova app stays the same independent of OS version. Pure gold for making testing on Android less painful. Adds quite a bit to the size of your app package though.</p>
<pre><code>ember cdv:plugin add cordova-plugin-crosswalk-webview
</code></pre>
<p><strong>Geolocation</strong></p>
<p>This <a href="https://github.com/apache/cordova-plugin-geolocation">plugin</a> provides information about device location.</p>
<pre><code>ember cdv:plugin add cordova-plugin-geolocation
</code></pre>
<p><strong>Network information</strong></p>
<p>This <a href="https://github.com/apache/cordova-plugin-network-information">plugin</a> enables you to handle connectivity related things.</p>
<pre><code>ember cdv:plugin add cordova-plugin-network-information
</code></pre>
<p><strong>Statusbar</strong></p>
<p>This <a href="https://github.com/apache/cordova-plugin-statusbar">plugin</a> lets you configure how the status bar is displayed.</p>
<pre><code>ember cdv:plugin add cordova-plugin-statusbar
</code></pre>
<p><strong>Inappbrowser</strong></p>
<p>This <a href="https://github.com/apache/cordova-plugin-inappbrowser">plugin</a> lets you manage exactly how the links in your apps are opened. Many people seem to be fighting with opening links in system browser - this plugin helps with that.</p>
<pre><code>ember cdv:plugin add cordova-plugin-inappbrowser
</code></pre>
<p><strong>Keep plugins up-to-date</strong></p>
<p>If you want to keep your plugins updated easily, you should check out <a href="https://github.com/dpa99c/cordova-check-plugins">cordova-check-plugins</a>.</p>
<pre><code>npm install -g cordova-check-plugins
cordova-check-plugins --update=auto
</code></pre>
<h3 id="usefulembercliaddons">Useful ember-cli addons</h3>
<p>Below you will find some of the most useful Ember addons for developing mobile apps.</p>
<ul>
<li><a href="https://github.com/aexmachina/ember-cli-sass">Ember-cli-sass</a> adds <a href="http://sass-lang.com/">SCSS</a> support</li>
<li><a href="https://github.com/kimroen/ember-cli-autoprefixer">Autoprefixer</a> takes care of CSS prefixes</li>
<li><a href="https://github.com/html-next/ember-gestures">Ember-gestures</a> makes it easy to work with gestures and adds ember-hammertime to remove the 300ms tap delay</li>
</ul>
<p>Install with the commands below:</p>
<pre><code>ember install ember-cli-sass
ember install ember-cli-autoprefixer
ember install ember-gestures
</code></pre>
<h3 id="furtherlearning">Further learning</h3>
<p>You should consult <a href="http://embercordova.com/">http://embercordova.com/</a> if you&apos;re having trouble (maybe something changed) and if you&apos;re looking for more tips and tricks for building mobile apps with this stack.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Be more productive by knowing your biological prime time]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><strong>Updated: May 15, 2025</strong></p>
<h2 id="tldr">TL;DR</h2>
<ul>
<li><strong>Body Prime Time or Biological Prime Time (BPT)</strong> is your daily peak performance window when energy, motivation, and focus are highest</li>
<li>Track your energy levels for 2-3 weeks to identify patterns and find your BPT</li>
<li>Use BPT for demanding tasks; reserve low-energy periods for</li></ul>]]></description><link>https://journal.wingmen.fi/be-more-productive-know-biological-prime-time/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc32e</guid><category><![CDATA[Productivity]]></category><category><![CDATA[ideas]]></category><category><![CDATA[startups]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Tue, 21 Jun 2016 23:18:58 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1495704907664-81f74a7efd9b?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1495704907664-81f74a7efd9b?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Be more productive by knowing your biological prime time"><p><strong>Updated: May 15, 2025</strong></p>
<h2 id="tldr">TL;DR</h2>
<ul>
<li><strong>Body Prime Time or Biological Prime Time (BPT)</strong> is your daily peak performance window when energy, motivation, and focus are highest</li>
<li>Track your energy levels for 2-3 weeks to identify patterns and find your BPT</li>
<li>Use BPT for demanding tasks; reserve low-energy periods for routine work</li>
<li>BPT is governed by circadian rhythms and ultradian cycles (90-120 minute intervals)</li>
<li>Research shows aligning work with BPT can boost productivity by 20-40% and reduce errors by 50%</li>
<li>Modern apps and tools make tracking easier than ever before</li>
</ul>
<hr>
<p>Ever since I read <a href="http://alifeofproductivity.com/">Chris Bailey&apos;s Productivity Project</a> book, I became fascinated with measuring when people are at their most productive during the day. Know yourself and you can optimize your working days and other activities for peak performance.</p>
<p>You&apos;ve likely noticed how your energy, motivation, and focus fluctuate throughout the day. Sometimes it&apos;s a struggle to get anything done, while other times you effortlessly slip into a state of flow. These peak performance windows are your <strong>Body Prime Time</strong> (or Biological Prime Time).</p>
<h2 id="thesciencebehindbodyprimetime">The Science Behind Body Prime Time</h2>
<p>Body Prime Time isn&apos;t just a productivity hack&#x2014;it&apos;s rooted in solid science. The biological prime time method is driven by our body&apos;s ultradian rhythms. These rhythms are cycles that repeat numerous times throughout a 24-hour period. We routinely experience peaks when we&apos;re highly-focused, as well as dips when we feel sleepy and distracted.</p>
<p>Every 90-120 minutes, your body has a period of significant energy and alertness followed by a period of fatigue. During that burst of energy, you can work with your body to get far more done. These cycles are governed by complex physiological processes involving brain wave activity, hormone release, and the natural ebb and flow of energy levels.</p>
<h3 id="yourchronotypematters">Your Chronotype Matters</h3>
<p>Recent research has deepened our understanding of individual differences in biological rhythms. Chronotype refers to an individual&apos;s natural tendency to sleep at a specific time, influencing their alertness and productivity throughout the day. It is largely determined by genetics, with variations in chronotype possibly serving as an evolutionary survival mechanism.</p>
<p>Peak performance differs significantly between early and late chronotypes i.e. &apos;larks&apos; and &apos;owls&apos; in simple and complex measures of cognitive and physical performance. Understanding your chronotype helps explain why some people are naturally more productive in the morning while others hit their stride later in the day.</p>
<h2 id="theproductivitybenefitsarereal">The Productivity Benefits Are Real</h2>
<p>The benefits of aligning your work with your biological prime time are backed by substantial research:</p>
<ul>
<li>Research shows that working during your peak energy hours can significantly boost productivity. In some cases, participants experienced up to a 40% increase in output when performing complex tasks during their designated prime time.</li>
<li>Aligning tasks with employees&apos; peak times can boost productivity by up to 20% and reduces mistakes by half.</li>
<li>During peak times, cognitive functions like memory, concentration, and problem-solving are at their best, which makes complex tasks easier to manage.</li>
</ul>
<h2 id="howtofindyourbodyprimetime">How to Find Your Body Prime Time</h2>
<p>Finding your BPT requires systematic tracking over an extended period. Here&apos;s the updated approach:</p>
<h3 id="1trackfor23weeksminimum">1. Track for 2-3 Weeks Minimum</h3>
<p>The key here is that one day alone won&apos;t reveal much about your biological prime time. Your goal is to look for common time chunks throughout a more extended span of time, so aim to track your time or your energy levels (or ideally, both) for at least two or three weeks.</p>
<h3 id="2useasimpleratingsystem">2. Use a Simple Rating System</h3>
<p>Consider your energy levels every hour, of every day &#x2013; depending on how productive, alert, and focused you feel, write any number from 1-10 next to each hour. So, 1 means extremely low levels, and 10 means extremely high levels.</p>
<h3 id="3trackmultipledimensions">3. Track Multiple Dimensions</h3>
<p>Modern approaches suggest tracking not just energy but also:</p>
<ul>
<li>Focus levels</li>
<li>Motivation</li>
<li>Mood</li>
</ul>
<h3 id="4controlforvariables">4. Control for Variables</h3>
<p>For accurate results, all three substances disrupt your regular biological patterns. So, unless you give them up for at least the next three weeks, you won&apos;t get an accurate reading for your Biological Prime Time. This includes caffeine, alcohol, and nicotine.</p>
<h2 id="moderntoolsfortracking">Modern Tools for Tracking</h2>
<p>While you originally had to build your own app, today there are numerous options available:</p>
<h3 id="dedicatedbptapps">Dedicated BPT Apps</h3>
<ul>
<li><strong>Body Prime Time Finder</strong> - Still available for iOS and Android</li>
<li><strong>Biological Prime Time Tracker</strong> - Android app for tracking energy levels</li>
<li><strong>Best Time</strong> - iOS app for tracking biological prime time</li>
</ul>
<h3 id="productivityappswithbptfeatures">Productivity Apps with BPT Features</h3>
<ul>
<li>Hubstaff to track when you feel most and least energetic</li>
<li><strong>RescueTime</strong> - Automatic productivity tracking</li>
<li><strong>RISE</strong> - Track your energy, learn how to get more energy, and then make the most of your energy with the RISE app</li>
</ul>
<h3 id="simpletrackingmethods">Simple Tracking Methods</h3>
<ul>
<li>Google Forms, Google Sheets, and an hourly reminder app</li>
<li>Basic journaling with hourly energy ratings</li>
<li>Wearable devices that track activity and stress patterns</li>
</ul>
<h2 id="maximizingyourbodyprimetime">Maximizing Your Body Prime Time</h2>
<p>Once you&apos;ve identified your BPT, the key is protecting and optimizing it:</p>
<h3 id="protectyourprimetime">Protect Your Prime Time</h3>
<p>There&apos;s one golden rule you need to apply to your biological prime time: protect it. You need to make every effort to reserve that time for your demanding tasks and the work that requires your full brain power and creative energy.</p>
<h3 id="strategictaskallocation">Strategic Task Allocation</h3>
<ul>
<li><strong>During BPT</strong>: Schedule challenging tasks: Like writing, coding, giving a presentation, or making a sales call</li>
<li><strong>During Low Energy</strong>: Those other periods of your day (when your ultradian rhythm is in a dip rather than a peak) can be used for low-pressure tasks like: checking emails, organizing files, or any other more repetitive tasks</li>
</ul>
<h3 id="workin90minuteblocks">Work in 90-Minute Blocks</h3>
<p>Work on your most important task for between 60-90 minutes. Take your cues from your body. When you find your concentration and energy beginning to falter, it&apos;s a good sign that you&apos;re beginning to hit a low point in an ultradian rhythm.</p>
<h2 id="thefutureofworkandbiologicalrhythms">The Future of Work and Biological Rhythms</h2>
<p>The post-pandemic workplace is defined by three pillars: flexibility, technological advancement, and locational ambidexterity. Employers should take into consideration three biological factors that affect the physical and mental health of workers: chronotype, circadian biology, and time of day.</p>
<p>Forward-thinking organizations are already implementing BPT principles. A 2024 report by the World Economic Forum estimated that improved productivity resulting from ultradian-aligned work practices could add up to $1.3 trillion USD to the global economy annually by 2030.</p>
<h2 id="finalthoughts">Final Thoughts</h2>
<p>Your Body Prime Time isn&apos;t set in stone&#x2014;it can shift based on life circumstances, age, and seasonal changes. Energy is fickle and, much like your life circumstances, your most-focused time could shift. Regular reassessment ensures you&apos;re always working with your body&apos;s natural rhythms rather than against them.</p>
<p>I just rewrote the apps to a more modern format with some enhancements:</p>
<ul>
<li><a href="https://itunes.apple.com/us/app/body-prime-time-finder/id1123325785">Apple App Store</a></li>
<li><a href="https://play.google.com/store/apps/details?id=com.wingmen.Bptf">Google Play</a></li>
</ul>
<p>With today&apos;s wealth of tracking options, there&apos;s never been a better time to discover your Body Prime Time and unlock your peak productivity potential.</p>
<p><em>Remember: Productivity isn&apos;t about working more hours&#x2014;it&apos;s about working smarter by aligning your efforts with your body&apos;s natural rhythms.</em></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[On signing NDAs]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Recently we have been asked to sign NDAs quite a bit. As a result, we had a long discussion about NDAs and here are our views on them.</p>
<p>The problem is that most NDAs are overkill. They do not acknowledge that we have had other clients in the past and</p>]]></description><link>https://journal.wingmen.fi/on-signing-ndas/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc32d</guid><category><![CDATA[Business]]></category><category><![CDATA[note-to-self]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Wed, 08 Jun 2016 08:17:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1450101499163-c8848c66ca85?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1450101499163-c8848c66ca85?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="On signing NDAs"><p>Recently we have been asked to sign NDAs quite a bit. As a result, we had a long discussion about NDAs and here are our views on them.</p>
<p>The problem is that most NDAs are overkill. They do not acknowledge that we have had other clients in the past and will have more in the future. We do not want to get caught in the no-win situation such an NDA puts us in. We do not want to be exposed to a nonperformance or honest-services prosecution.</p>
<p>And to be honest, we do not have the interest or resources to take your ideas and create anything out of them. Most ideas are worthless to us alone. We need your domain experience, contacts and access to funding to execute on them.</p>
<p>More importantly, we would like to consider ourselves respectable and trustworthy guys. It does not take long to ruin one&apos;s reputation by blabbing or stealing other people&apos;s ideas. This is especially true in today&apos;s digital world. All information is available for anyone with a quick Google search.</p>
<p>We have seen nice NDAs too. It is not a problem to sign something that goes like: &quot;We will not share any materials or ideas conveyed by you to us to third parties. We will not steal your ideas, run and execute on them to create a competing service ourselves. At least for the next year or so.&#x201D;.</p>
<p>But more often than we would like, the NDA is wide. And we cannot sign something that in effect binds us from doing anything similar for the next two years.</p>
<p>For example, during our discussions together we come up with a way to list information about events on a website in a unique way. Then having signed your wide NDA, there would be a threat of getting sued, for doing something similar in another project that is not in any way competing with what you&apos;re doing.</p>
<p>That is the reason why we are against signing an NDA in general. Things change of course when you staple a big enough cheque to it.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Productive OS X design and development setup]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Setting up your mac for design &amp; development is painful. It takes quite a few steps to get to a happy place where you are productive again. This post is a messy, note-to-self kind of list of what needs to be done to get from a blank Mac to the</p>]]></description><link>https://journal.wingmen.fi/productive-os-x-design-development-setup/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc31c</guid><category><![CDATA[Development]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Fri, 22 Apr 2016 18:14:18 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1584648508756-3ac150d020ba?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1584648508756-3ac150d020ba?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Productive OS X design and development setup"><p>Setting up your mac for design &amp; development is painful. It takes quite a few steps to get to a happy place where you are productive again. This post is a messy, note-to-self kind of list of what needs to be done to get from a blank Mac to the happy place. It also contains some bonus tips/reminders on useful tricks and commands sprinkled in.</p>
<p>Also, I am <em>pretty damn sure</em> the world needs one more &quot;How I setup my Mac&quot; -post, so here goes. Hopefully, you will find something new! Enjoy.</p>
<p>The article is being updated to reflect the latest discoveries [LAST UPDATED: 13.02.2025].</p>
<h2 id="updateinstallxcodeandhomebrew">Update, install Xcode and Homebrew</h2>
<p>After the initial Apple setup wizard you should start by checking the app store for updates. It&apos;s likely that your &quot;new&quot; mac is a one or two updates behind and it&apos;s best to install all those first. Who knows what kind nasty security holes those updates are patching.</p>
<p>Once the updates are in, proceed by heading to the App Store and installing the latest Xcode.</p>
<p><strong>REMEMBER TO RUN</strong> Xcode and agree to the license agreement to finish installing it. XCode installs some important extras on the first run, so if you forget to run it you&apos;ll be left scratching your head why things do not work.</p>
<p>Then install the command line tools by copy-pasting the following into your terminal:</p>
<pre><code>xcode-select --install
</code></pre>
<h3 id="installhomebrew">Install Homebrew</h3>
<p>Homebrew is the go-to Unix package manager for OS X. Needed to install lots of the stuff in this guide.</p>
<p>Get brew at: <a href="http://brew.sh/">http://brew.sh/</a></p>
<h2 id="getyourterminalright">Get your terminal right</h2>
<p>Below you will find instructions on how to configure ZSH and a lot of nice terminal related goodies.</p>
<h3 id="switchtoiterm2">Switch to iTerm2</h3>
<p>You won&apos;t look back at the default mac terminal.</p>
<p>Get it at: <a href="https://www.iterm2.com/">https://www.iterm2.com/</a></p>
<h3 id="ohmyzsh">Oh My Zsh</h3>
<p>Switching bash to ZSH is great. Adding Oh My Zsh on top of ZSH is super.</p>
<p>Get it at: <a href="http://ohmyz.sh/">http://ohmyz.sh/</a></p>
<p>And while upgrading the terminal experience, you should drop in these as well:</p>
<ul>
<li><a href="https://github.com/romkatv/powerlevel10k">https://github.com/romkatv/powerlevel10k</a></li>
<li><a href="https://github.com/zsh-users/zsh-syntax-highlighting">https://github.com/zsh-users/zsh-syntax-highlighting</a></li>
<li><a href="https://github.com/scmbreeze/scm_breeze">https://github.com/scmbreeze/scm_breeze</a></li>
<li><a href="https://github.com/ahmetb/kubectx">https://github.com/ahmetb/kubectx</a></li>
<li><a href="https://github.com/lukechilds/zsh-better-npm-completion">https://github.com/lukechilds/zsh-better-npm-completion</a></li>
</ul>
<h4 id="terminalfonts">Terminal fonts</h4>
<p>You can install some nice terminal nerd fonts using home brew like so:</p>
<pre><code>brew tap homebrew/cask-fonts
brew install font-hack-nerd-font
</code></pre>
<h3 id="terminalaimagic">Terminal AI magic</h3>
<p>Install Amazon Q for some AI magic: <a href="https://aws.amazon.com/q/">https://aws.amazon.com/q/</a></p>
<h3 id="setupsudowithtouchidapplewatch">Set up SUDO with TouchID / Apple Watch</h3>
<p>Have a long and complex admin password? Worry no more, you can use your fingerprint scanner aka. TouchID instead if your Mac has one. Here&apos;s how:</p>
<ol>
<li>Open <code>/etc/pam.d/sudo</code> and add <code>auth sufficient pam_tid.so</code> to the top of the file</li>
<li>Change iTerm setting under <code>Preferences &gt; Advanced &gt; Allow sessions to survive after logging out and back in</code> to <code>no</code></li>
<li>Restart iTerm and profit</li>
</ol>
<p>If you want to authenticate via your Apple Watch, you can do that too by following the instructions in the repository for this open source Apple Watch pam module: <a href="https://github.com/biscuitehh/pam-watchid">https://github.com/biscuitehh/pam-watchid</a></p>
<h3 id="installfzfforbettercommandlinehistory">Install fzf for better command line history</h3>
<p>This really improves your life when looking at the history of commands you&apos;ve used by doing all sorts of magical fuzzy matching. Makes re-running common commands a joy.</p>
<p><a href="https://github.com/junegunn/fzf">https://github.com/junegunn/fzf</a></p>
<h3 id="betterdefaulttools">Better default tools</h3>
<p>Nowadays there are better alternatives to many common Unix commands that we use daily. Here are some of the best ones.</p>
<p>Replace cat with bat, to make your cats look prettier.</p>
<pre><code>/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;
</code></pre>
<p>Replace ping with pretty ping - again looks prettier.</p>
<pre><code>brew install prettyping
</code></pre>
<p>A nicer way to see disk usage by usingn ncdu.</p>
<pre><code>brew install ncdu
</code></pre>
<p>A better help by using tldr.</p>
<pre><code>brew install tldr
</code></pre>
<p>A better grep that understands .gitignore files.</p>
<pre><code>brew install ag
</code></pre>
<p>Broot allows handy viewing of folders in the terminal.</p>
<pre><code>brew install broot
</code></pre>
<p>More intuitive and simpler find command <a href="https://github.com/sharkdp/fd">https://github.com/sharkdp/fd</a>.</p>
<pre><code>brew install fd
</code></pre>
<p>Then add the below to your .zshrc or similar to make it all work (NOTE: You should have fzf installed).</p>
<pre><code># improve common commands by using modern versions
alias cat=&apos;bat&apos;
alias ping=&apos;prettyping --nolegend&apos;
alias du=&quot;ncdu --color dark -rr -x --exclude .git --exclude node_modules&quot;
alias help=&apos;tldr&apos;

# add a nice way to preview files
alias preview=&quot;fzf --preview &apos;bat --color \&quot;always\&quot; {}&apos;&quot;

# add support for ctrl+o to open selected file in VS Code
export FZF_DEFAULT_OPTS=&quot;--bind=&apos;ctrl-o:execute(code {})+abort&apos;&quot;
</code></pre>
<h2 id="makesureyougetgit">Make sure you get git</h2>
<h3 id="setupgitcommitterinfo">Setup git committer info</h3>
<p>Git requires your info, so it can add your info into the commits you create. Note that the commands below set a global identity on your mac. You can also configure it by the project by omitting the global switch.</p>
<pre><code>git config --global user.email &quot;jussi(at)wingmen.fi&quot;
git config --global user.name &quot;Jussi Kaijalainen&quot;
</code></pre>
<h3 id="addgitaliases">Add git aliases</h3>
<p>Open ~/.gitconfig and add the following lines. This adds some nice colors and two commands (git lol &amp; git lola) to view the log in a nicer way. It also makes git pull command to do a rebase by default.</p>
<pre><code>[alias]
        lol = log --graph --decorate --pretty=oneline --abbrev-commit
        lola = log --graph --decorate --pretty=oneline --abbrev-commit --all
[color]
        branch = auto
        diff = auto
        interactive = auto
        status = auto
[push]
    default = simple
[pull]
    rebase = true
</code></pre>
<h3 id="setuprepositoryspecificsshkeys">Setup repository specific ssh keys</h3>
<p>Git allows you to configure a custom ssh command to be used by the git client. This allows you to easily force your projects to use project specific ssh keys for git operations. Use the below command to set the custom ssh command for git:</p>
<p><code>git config core.sshCommand &quot;ssh -i ~/.ssh/id_rsa_projectx&quot;</code></p>
<h2 id="setuplanguagesandinfrastructure">Setup languages and infrastructure</h2>
<p>Below you will find instructions on how to install stuff like Node, Python, MongoDB, Redis, Docker etc. running on your mac the right way.</p>
<h3 id="installkubectl">Install kubectl</h3>
<p>Everyone has a couple of kubernets clusters running, so we need to install the tool to handle it.</p>
<pre><code>brew install kubectl 
</code></pre>
<h3 id="installnodeviabrewmise">Install Node via BREW &amp; Mise</h3>
<p>NVM is done, these days mise is the king of managing versions. So first let&apos;s install latest node using Brew.</p>
<pre><code>brew isntall node
</code></pre>
<p>Then install mise <a href="https://github.com/jdx/mise">https://github.com/jdx/mise</a> which supports automatically switching to the correct Node version when you enter a folder that has .nvmrc file or mise.toml file.</p>
<h3 id="installpythonusingpyenv">Install Python using PYENV</h3>
<p>Playing around with all those machine learning frameworks is a headache without PYENV, which enables you to switch your Python version painlessly.</p>
<pre><code>brew install pyenv
pyenv install 3.8.10
</code></pre>
<p>Then add the following to your <code>.zshrc</code>:</p>
<pre><code>eval &quot;$(pyenv init --path)&quot;
eval &quot;$(pyenv init -)&quot;
</code></pre>
<h3 id="installrubyusingrbenv">Install Ruby using rbenv</h3>
<pre><code>brew install rbenv ruby-build
</code></pre>
<h3 id="installmascli">Install mas-cli</h3>
<p>Mas-cli is the Mac App Store command line interface. It allows you to quickly install apps via commandline from the Mac App Store.</p>
<pre><code>brew install mas
</code></pre>
<h3 id="installandroidstudiojava">Install Android Studio &amp; Java</h3>
<p>If you&apos;re looking to develop hybrid apps using Cordova you will need to install both the Android Studio &amp; Java and also get all the path variables correctly.</p>
<p>Get Studio at: <a href="https://developer.android.com/studio/install.html">https://developer.android.com/studio/install.html</a></p>
<p>Also, you will likely want to activate debugging mode on your Android phone to enable running the app easily.</p>
<p>See instructions: <a href="https://developer.android.com/studio/run/device.html">https://developer.android.com/studio/run/device.html</a></p>
<p>Install Java &amp; Gradle:</p>
<pre><code>brew install java
brew install gradle
</code></pre>
<p>Add Java to path in your .profile/.bash_rc/.zshrc:</p>
<p><code>export JAVA_HOME=$(/usr/libexec/java_home)</code>.</p>
<h3 id="installyarn">Install yarn</h3>
<p>Installing yarn when you want to use NVM seems to be a bit tricky. Easiest way to do it is with Brew, but it requires some tricks.</p>
<p><code>brew edit yarn</code></p>
<p>Then comment out the <code>depends_on &quot;node&quot;</code> line since you already will have node installed via NVM and do not want to install Node from Brew.</p>
<p><code>brew install yarn</code></p>
<p>And tada, we have Yarn installed with Node from NVM.</p>
<h3 id="installnodemon">Install Nodemon</h3>
<p>Use Nodemon to run your Node apps. It will reload the app on code changes. Pure developer bliss.</p>
<pre><code>npm install nodemon -g
</code></pre>
<p>To use Nodemon, you run your app like this:</p>
<pre><code>nodemon myapp.js
</code></pre>
<h3 id="installgo">Install Go</h3>
<p><code>brew install go</code></p>
<h3 id="installdocker">Install Docker</h3>
<p>Get it at: <a href="https://docs.docker.com/desktop/install/mac-install/">https://docs.docker.com/desktop/install/mac-install/</a></p>
<h3 id="dive">Dive</h3>
<p>A tool for exploring a docker image, layer contents, and discovering ways to shrink the size of your Docker/OCI image.</p>
<pre><code>brew install dive
</code></pre>
<h3 id="installmongodb">Install MongoDB</h3>
<p>Check latest instructions from <a href="https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/">https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/</a>.</p>
<pre><code>brew install mongodb-community
</code></pre>
<h3 id="installnginx">Install Nginx</h3>
<p>We&apos;ll need nginx to setup that complex development environment.</p>
<pre><code>brew install nginx
</code></pre>
<h3 id="instalredis">Instal Redis</h3>
<p>Who doesn&apos;t have a project that uses Redis for cache or something?</p>
<pre><code>brew install redis
</code></pre>
<h3 id="installwatchman">Install watchman</h3>
<p>Watchman is a supposedly smart file change watcher written by the people over at Facebook used by live reload helpers.</p>
<pre><code>brew install watchman
</code></pre>
<h3 id="installphantomjs">Install phantomjs</h3>
<p>Phantomjs is a headless WebKit scriptable with a JavaScript API. Often used for running tests.</p>
<pre><code>brew install phantomjs
</code></pre>
<h3 id="variousunixlibstools">Various unix libs &amp; tools</h3>
<p>To install some of the Unix libraries and tools often needed, copy &amp; paste the following to your terminal and hope for the best.</p>
<pre><code>brew install wget libpng ffmpeg graphicsmagick imagemagick jpeg lame xz
brew install sox --with-lame
</code></pre>
<h3 id="makeitlookpretty">Make it look pretty</h3>
<p>Getting consistent themes across different apps used to be tough.. but nowadays it&apos;s getting better. Let&apos;s install Dracula!</p>
<p>Get it at: <a href="https://draculatheme.com/">https://draculatheme.com/</a></p>
<h2 id="installtheapps">Install the apps</h2>
<p>Below you will find a the best app to make your developer life more productive.</p>
<h3 id="alfred">Alfred</h3>
<p>One app to rule them all. Alfred is used for quickly launching shit and controlling your mac like a boss. I used to use <a href="http://qsapp.com/">Quicksilver</a>, but Alfred is way better nowadays.</p>
<p>Get it at <a href="http://www.alfredapp.com/">http://www.alfredapp.com/</a> and don&apos;t be afraid to put down some cash to get the power pack. Worth every penny.</p>
<p>ps. Remember to set up the clipboard history extension. That really is a lifechanger, when you no longer have to jump between files to copy paste and instead you can copy multiple entries and then access them from the clipboard history with handy keyboard shortcuts.</p>
<p>pps. You can sync Alfred settings across multiple machines by having a shared config forlder on Dropbox for example.</p>
<p><strong>Great Alfred workflows</strong></p>
<ul>
<li>Convert string to a hashed version: <a href="https://github.com/BigLuck/alfred2-hash">https://github.com/BigLuck/alfred2-hash</a></li>
<li>Get current timestamp in milliseconds or seconds:<br>
<a href="http://www.alfredforum.com/topic/1144-get-current-timestamp/">http://www.alfredforum.com/topic/1144-get-current-timestamp/</a></li>
<li>Url encode / decode strings quickly <a href="https://github.com/willfarrell/alfred-encode-decode-workflow">https://github.com/willfarrell/alfred-encode-decode-workflow</a></li>
<li>Run JS in Alfred with node repl: <a href="https://github.com/yussdev/alfred-node-repl">https://github.com/yussdev/alfred-node-repl</a></li>
<li>For more see <a href="http://www.packal.org/">Packal</a></li>
</ul>
<h3 id="choosy">Choosy</h3>
<p>As a web dev you are using many browser. With Choosy you can open links in the correct browser. Set Choosy as the default browser and it let&apos;s you pick which browser to open. Or configure complex rules that decide which browser gets used to open a specific link.</p>
<p>Get Choosy at: <a href="https://www.choosyosx.com/">https://www.choosyosx.com/</a></p>
<h3 id="cleanshotx">CleanShot X</h3>
<p>CleanShot X is a better tool of capturing screenshots and screen captures.</p>
<p>Get it at: <a href="https://cleanshot.com/">https://cleanshot.com/</a></p>
<h3 id="dash">Dash</h3>
<p>Most of the documentation you&apos;ll ever need accessible with a fast keyboard shortcut.</p>
<p>Get it at: <a href="https://kapeli.com/dash">https://kapeli.com/dash</a></p>
<h3 id="fantastical">Fantastical</h3>
<p>Fantastical lives in the menubar. It lets you take a quick peek at your calendar and whats next. It also boasts handy natural language processing capabilities for easy input of new calendar events. Also it looks pretty.</p>
<p>Get it at: <a href="https://flexibits.com/fantastical">https://flexibits.com/fantastical</a></p>
<h3 id="fastdmg">FastDMG</h3>
<p>Sometimes opening those <code>.dmg</code> files take forever. Switch to FastDMG for an improved experience with <code>.dmg</code> files.</p>
<p>Get it at: <a href="https://sveinbjorn.org/fastdmg">https://sveinbjorn.org/fastdmg</a></p>
<h3 id="flux">Flux</h3>
<p>Makes the color of your computer&apos;s display adapt to the time of day, warm at night and like sunlight during the day. Similar to OSX Nightshift, but you need Flux when using an external monitor.</p>
<p>Get it at: <a href="https://justgetflux.com/">https://justgetflux.com/</a></p>
<h3 id="karabinerelements">Karabiner-Elements</h3>
<p>Customize your keyboard. E.g. make right command + hjkl act as arrows or map capslock to esc.</p>
<p>Get it at: <a href="https://github.com/tekezo/Karabiner-Elements">https://github.com/tekezo/Karabiner-Elements</a></p>
<h3 id="obsidian">Obsidian</h3>
<p>A simple app for writing your thougts down and finding it after wards.</p>
<p>Get it at: <a href="https://obsidian.md/">https://obsidian.md/</a></p>
<h3 id="todoist">Todoist</h3>
<p>I&apos;ve been trough Things, OmniFocus, Wunderlist and a couple more I&apos;ve already forgotten. The current favorite is Todoist. They keep improving stuff. Plus my Karma level is Enlightened.</p>
<p>Get it at: <a href="https://todoist.com">https://todoist.com</a></p>
<h3 id="littlesnitch">LittleSnitch</h3>
<p>Every self-respecting nerd needs to be able to decide which apps can call home and which can not. It&apos;s interesting to see where all those apps are reporting your actions.</p>
<p>Get it at: <a href="http://www.obdev.at/products/littlesnitch">http://www.obdev.at/products/littlesnitch</a></p>
<h3 id="sketch">Sketch</h3>
<p>The &quot;Photoshop killer&quot;. For quick user interface design, you rarely need to open Photoshop these days. Sketch does the job faster.</p>
<p>Get it at: <a href="http://bohemiancoding.com/sketch/">http://bohemiancoding.com/sketch/</a></p>
<h3 id="transmit">Transmit</h3>
<p>Transmit is the (s)FTP app of choice. Favorites syncing via Dropbox is quite nifty.</p>
<p>Get it at: <a href="http://panic.com/transmit/">http://panic.com/transmit/</a></p>
<p>ps. When you thought you lost that edit to a file, check Transmit temporary files <code>cd ~/Library/Caches/Transmit/</code>.</p>
<h3 id="keka">Keka</h3>
<p>Sometimes someone ends up sending you that rare .rar or .7zip package and you really want to find out what&apos;s inside. Keka does this for you.</p>
<p>Get it at: <a href="https://www.keka.io/en/">https://www.keka.io/en/</a></p>
<h3 id="iterm2">Iterm2</h3>
<p>The best terminal for OS X. And get the nightly build. Using drag and drop on your terminal to upload files to a remote ssh host is next-level stuff.</p>
<p>Get it at: <a href="https://www.iterm2.com/">https://www.iterm2.com/</a></p>
<!-- Create post about Iterm2 nightoy and link here -->
<h3 id="imageoptim">ImageOptim</h3>
<p>Makes your images great again. Removes bloated metadata. Saves disk space &amp; bandwidth by compressing images without losing quality.</p>
<p>Get it at: <a href="https://imageoptim.com/mac">https://imageoptim.com/mac</a></p>
<h3 id="sequelpro">Sequel Pro</h3>
<p>A nice GUI to peek around MySQL databases.</p>
<p>Get it at: <a href="http://www.sequelpro.com/">http://www.sequelpro.com/</a></p>
<h3 id="keycastr">Keycastr</h3>
<p>Keycastr is an open-source keystroke visualizer. It makes it super easy to show your keystrokes in videos.</p>
<p>Get it at: <a href="https://github.com/keycastr/keycastr">https://github.com/keycastr/keycastr</a></p>
<h3 id="rescuetime">Rescuetime</h3>
<p>It&apos;s great to track what you&apos;re spending your time on. Understanding how you use your time is a good step towards productivity.</p>
<p>Get it at our referral link: <a href="https://www.rescuetime.com/rp/wingmen">https://www.rescuetime.com/rp/wingmen</a></p>
<h3 id="transmission">Transmission</h3>
<p>Some times you need to download those Linux distros you know. That&apos;s where Transmission torrent client comes in!</p>
<p>Get it at: <a href="http://www.transmissionbt.com/">http://www.transmissionbt.com/</a></p>
<h3 id="1password">1Password</h3>
<p>Use a safe password and don&apos;t need to remember them. They even came out with a nifty team feature, which makes it perfect for sharing passwords with your team.</p>
<p>Get it at: <a href="https://1password.com/">https://1password.com/</a></p>
<h3 id="quickres">Quickres</h3>
<p>A little tool to unlock more resolutions for your retina display. Really great when you need more screen space for your laptop.</p>
<p>Get it at: <a href="https://www.thnkdev.com/QuickRes/">https://www.thnkdev.com/QuickRes/</a></p>
<h3 id="poedit">PoEdit</h3>
<p>Nice translations editor for PO files. Especially handy as it can remotely edit WordPress translations.</p>
<p>Get it at: <a href="https://poedit.net/">https://poedit.net/</a></p>
<h3 id="vlcplayer">VLC Player</h3>
<p>Play all those pesky video files that Quicktime doesn&apos;t want to play. You know, the ones that came with the Linux distros you torrented.</p>
<p>Get it at: <a href="http://www.videolan.org/vlc/index.html">http://www.videolan.org/vlc/index.html</a></p>
<h3 id="iina">IINA</h3>
<p>The modern video player for macOS. Great experience for playing videos on device with cool features - missing casting to TV.</p>
<p>Get it at: <a href="https://github.com/iina/iina">https://github.com/iina/iina</a></p>
<h3 id="systemcolorpicker">System Color Picker</h3>
<p>The macOS color picker as an app with lots of extra features.</p>
<p>Get it at: <a href="https://github.com/sindresorhus/System-Color-Picker">https://github.com/sindresorhus/System-Color-Picker</a></p>
<h3 id="firefox">Firefox</h3>
<p>Firefox is the current browser of choice for most of my browsing.</p>
<p>Get it at: <a href="https://www.mozilla.org/en-US/firefox/new/">https://www.mozilla.org/en-US/firefox/new/</a></p>
<h4 id="firefoxextensions">Firefox extensions</h4>
<p><a href="https://github.com/ueokande/vim-vixen">Vim Vixen</a> - Bring vim bindings into Firefox.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/">uBlock Origin</a> - The best ad blocker for Firefox. Add also the below filters to get rid of all the StackOverflow copies in your search results.</p>
<p>Necessary filters for uBlock: <a href="https://github.com/quenhus/uBlock-Origin-dev-filter">https://github.com/quenhus/uBlock-Origin-dev-filter</a></p>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/ublacklist/">uBlack List</a> - Block specific pages from appearing in search results.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/choosy/">Choosy</a> - Open links quickly in other browsers on your system.</p>
<h3 id="chromiumungoogled">Chromium (ungoogled)</h3>
<p>Let&apos;s face it, if you are developing stuff for the web, you need to the most popular browser available for testing purposes at least.</p>
<p>Get the ungoogled version at: <a href="https://github.com/Eloston/ungoogled-chromium">https://github.com/Eloston/ungoogled-chromium</a></p>
<p>To enable installing extensions from chrome web store on the ungoogled Chromium: <a href="https://github.com/NeverDecaf/chromium-web-store">https://github.com/NeverDecaf/chromium-web-store</a></p>
<h4 id="chromiumtweaks">Chromium tweaks</h4>
<p>Go to chrome://flags/#allow-insecure-localhost to enable your insecure self signed development certificates.</p>
<p>Start Chromium with <code>open -a &quot;Chromium&quot; --args --auto-open-devtools-for-tabs</code> and you will always have the devtools open. This trick works also for for Google Chrome to open the devtools on every tab open.</p>
<h4 id="chromeextensions">Chrome extensions</h4>
<p>No browser is perfect out of the box. Let&apos;s jazz up that browser a bit.</p>
<p><a href="https://github.com/gorhill/uBlock">Ublock Origin</a> - Goodbye adds, trackers and slow pages.</p>
<p><a href="https://github.com/emberjs/ember-inspector">Ember Inspector</a> - Inspect why your Ember app is grumpy.</p>
<p><a href="https://github.com/facebook/react-devtools">React Devtools</a> - See what&apos;s up with your react apps.</p>
<p><a href="https://chrome.google.com/webstore/detail/mortality-new-tab/eeedcpdcehnikgkhbobmkjcipjhlbmpn">Mortality</a> - Don&apos;t get distracted by tempting sites on your new page tab and be reminded you only have so much time left in this life.</p>
<p><a href="https://chrome.google.com/webstore/detail/tabagotchi-by-breather/ojahbhfflnbaiddhnkgeccgopmedjjen">Tabagotchi</a> - If Mortality is a bit too much, this is another great and fun new page addon to keep your tabs under control.</p>
<p><a href="https://chrome.google.com/webstore/detail/ublacklist/pncfbmialoiaghdehhbnbhkkgmjanfhe">uBlacklist</a> - No more results from w3schools, ha!</p>
<p><a href="https://chrome.google.com/webstore/detail/1password-%E2%80%93-password-mana/aeblfdkhhhdcdjpifhhbdiojplfjncoa">1Password</a> - Integrate 1Password better with your browser.</p>
<p><a href="https://chrome.google.com/webstore/detail/choosy/baecahhpgcpccohoeipmdkkbemhjhfmc">Choosy</a> - Make it easy to open a link in another browser quickly.</p>
<h3 id="mullvadvpn">Mullvad VPN</h3>
<p>For privacy and security a VPN is a must. There are many great providers, but few take privacy as seriously as Mullvad. The accounts are totally anonymous. There is no email required that can be used to trace back to you and you can even pay in cash if you want.</p>
<p>Get it at: <a href="https://mullvad.net/en/">https://mullvad.net/en/</a></p>
<h3 id="cheatsheet">CheatSheet</h3>
<p>CheatSheet is a simple free app that let&apos;s you see any applications shortcuts by holding down <code>cmd</code> for a configurable amount of time.</p>
<p>Get it at: <a href="https://www.mediaatelier.com/CheatSheet/">https://www.mediaatelier.com/CheatSheet/</a></p>
<h3 id="meld">Meld</h3>
<p>File and folder comparison made easy for Mac/OSX.</p>
<p>Get it at: <a href="https://yousseb.github.io/meld/">https://yousseb.github.io/meld/</a></p>
<h3 id="alttab">AltTab</h3>
<p>Swanky alternative to <code>cmd</code> + <code>tab</code> that can display thumbnails of of apps. It also allows you to easily select between multiple windows of an app.</p>
<p>Get it at: <a href="https://alt-tab-macos.netlify.app/">https://alt-tab-macos.netlify.app/</a></p>
<h3 id="mediacontrol">MediaControl</h3>
<p>Controls your external display brightness and volume and shows native OSD. Use menulet sliders or the keyboard, including native Apple keys!</p>
<p>Get it at: <a href="https://github.com/MonitorControl/MonitorControl">https://github.com/MonitorControl/MonitorControl</a></p>
<h2 id="finderspotlightothertips">Finder &amp; Spotlight &amp; other tips</h2>
<p>Next, let&apos;s configure the finder and spotlight to behave in a saner manner.</p>
<h3 id="navigatedialogboxoptionsusingyourkeyboard">Navigate dialog box options using your keyboard</h3>
<p>By default, you can&apos;t change the selected option on a dialog in, which sucks a lot. It makes no sense to reach for that mouse to just confirm or cancel some action. From the keyboard settings, you can make all controls in dialogs navigable with <code>tab</code> and <code>shift + tab</code>. Here&apos;s how:</p>
<ol>
<li>Open <strong>System Preferences</strong></li>
<li>Open <strong>Keyboard</strong> settings</li>
<li>Enable <strong>Keyboard navigation</strong></li>
</ol>
<h3 id="hideandshowmenubardockautomatically">Hide and show menu bar &amp; dock automatically</h3>
<p>This is a life changer for laptop work as it gives you more screen estate to work with. It also gives you superior focus, when all the distractions (red dots on app icons) aren&apos;t visible until you actually want to see them.</p>
<p>To hide the menu bar, go to <strong>System Preferences</strong> -&gt; <strong>General</strong> and check &quot;Automatically hide and show the menu bar&quot;. For added hacker points you can also tick &quot;User dark menu bar and Dock&quot;.</p>
<p>To hide the Dock, head to <strong>System Preferences</strong> -&gt; <strong>Dock</strong> and check &quot;Automatically hide and show the Dock&quot;.</p>
<p>And don&apos;t forget to make the hiding and showing nice and snappy by running the following command in the terminal:<br>
<code>defaults write com.apple.dock autohide -bool true &amp;&amp; defaults write com.apple.dock autohide-delay -float 0 &amp;&amp; defaults write com.apple.dock autohide-time-modifier -float 0 &amp;&amp; killall Dock</code></p>
<h3 id="reducetransparencymotion">Reduce transparency &amp; motion</h3>
<p>Don&apos;t like things being that transparent &amp; flying around? Me neither. Also, this might save your processing power for more important tasks.</p>
<p>Go to <strong>System Preferences</strong> -&gt; <strong>Accessibility</strong> -&gt; <strong>Display</strong> and check &quot;Reduce Motion&quot; and &quot;Reduce Transparency&quot;.</p>
<p>Some further tweaks to speed up things are:</p>
<h4 id="disableapplicationlaunchanimation">Disable application launch animation</h4>
<p><code>defaults write com.apple.dock launchanim -bool false; killall Dock</code></p>
<h4 id="disablequicklookanimation">Disable QuickLook animation</h4>
<p><code>defaults write -g QLPanelAnimationDuration -float 0; killall Dock</code></p>
<h4 id="disablelaunchpadanimation">Disable Launchpad animation</h4>
<p><code>defaults write com.apple.dock springboard-show-duration -int 0</code><br>
<code>defaults write com.apple.dock springboard-hide-duration -int 0; killall Dock</code></p>
<h3 id="showpathforspotlightsearchfiles">Show path for spotlight search files</h3>
<p>Somewhere in Lion or Mavericks they decided you don&apos;t need to know where the files you search for are residing and stopped showing file paths for search results. That sucks. Lucky you can get a peek at the path by holding down CMD while looking at the results.</p>
<h3 id="showlibraryfolder">Show library folder</h3>
<p>Again they hide things from you. Steps to get your precious library folder back:</p>
<ol>
<li>Open your home folder in Finder</li>
<li>Press <strong>CMD + J</strong></li>
<li>Tick &quot;Show Library Folder&quot; in the popup</li>
</ol>
<h3 id="showfilenameextensions">Show filename extensions</h3>
<p>Again hiding stuff. And if you didn&apos;t notice, I hate when they hide things. To make filename extensions visible:</p>
<ol>
<li>Open Finder</li>
<li>Press <strong>CMD + ,</strong></li>
<li>Tick &quot;Show all filename extensions&quot; in the popup</li>
</ol>
<h3 id="killsmartquotes">Kill Smart Quotes</h3>
<p>If you&apos;re a programmer and copy-paste snippets of code around, the smart quotes feature is bound to screw you. For example, I store code snippets in Evernote. Whenever pasting in code with quotes, OS X &quot;fixes&quot; them up for me - usually breaking the code.</p>
<p>Luckily it&apos;s easy to disable:</p>
<ol>
<li>System Preferences</li>
<li>Search for &quot;smart quotes&quot;</li>
<li>Uncheck &quot;use smart quotes&quot;</li>
<li>PEACE</li>
</ol>
<h3 id="cycleopenwindowswithalttab">Cycle open windows with ALT + TAB</h3>
<p>By default, it&apos;s hard to jump between the different windows of an app. At least on Finnish keyboard as <strong>CMD + `</strong> is not easy to reach. Setting <strong>ALT + TAB</strong> to cycle windows is way more intuitive.</p>
<ol>
<li>Open Preferences</li>
<li>Open Keyboard preferences and the Shortcuts tab inside</li>
<li>Under Keyboard section on the left change the shortcut for &quot;Move focus to next window&quot; into <strong>ALT + TAB</strong></li>
</ol>
<h2 id="randomtipstricks">Random tips &amp; tricks</h2>
<h3 id="freeport5000">Free port 5000</h3>
<p>From Monterey onwards apple enables by default AirPlay receiver, which greedily hogs the port 5000 making many python projects fail with them using port 5000 by default. You&apos;ll notice this when you see <code>OSError: [Errno 48] Address already in use</code>. Freeing the port is easy. You can do it by going to Preferences and searching for AirPlay Receiver and unchecking it.</p>
<h3 id="movewindowsbyclickinganywhereonit">Move windows by clicking anywhere on it</h3>
<p>You can move windows by holding down <code>ctrl</code> + <code>cmd</code> and dragging anywhere on the window. Much easier than having to always drag the window from the top.</p>
<p>Enable the feature by typing the below to your terminal and logging out and back in of your current session:</p>
<pre><code>defaults write -g NSWindowShouldDragOnGesture -bool true
</code></pre>
<p>Disable with the following:</p>
<pre><code>defaults delete -g NSWindowShouldDragOnGesture  
</code></pre>
<h3 id="openiterm2incurrentfinderfolder">Open iTerm2 in current finder folder</h3>
<p>Create a service using the guide located <a href="https://gist.github.com/eric-hu/5846890">here</a> and then add a keyboard shortcut like <strong>CMD + Shift + I</strong> to launch the service. That&apos;s a really fast way to get into the terminal in the current folder.</p>
<h3 id="distractionfreefirefox">Distraction free Firefox</h3>
<p>Keeping email in a pinned tab is handy, but gets disruptive since Firefox shows a activity indicator on the pinned tab when the window title changes. You can get rid of the green dot indicating the activity by creating your own <code>userChrome.css</code> under <code>{firefoxprofile}/chrome/userChrome.css</code> and adding the following CSS markup to the file. You can find your profile folder by going  Help &gt; More Troubleshooting Information. You will also likely have to create the <code>chrome</code> folder.</p>
<pre><code>.tabbrowser-tab &gt; .tab-stack &gt; .tab-content[pinned][titlechanged]:not([selected=&quot;true&quot;]){
  background-image: none !important;
}
</code></pre>
<p>You can find the folder location on MacOS under <code>Help</code> -&gt; <code>More Troubleshooting Information</code>.</p>
<h3 id="quicklyopenaspecificfolderinfinder">Quickly open a specific folder in finder</h3>
<p>When in finder press <strong>CMD</strong> + <strong>Shift</strong> + <strong>g</strong> to open &quot;Go to folder&quot; prompt which allows you to quickly enter a path to open.</p>
<h3 id="openfinderfromtheterminalintheworkingdirectory">Open Finder from the terminal in the working directory</h3>
<p>Type in <strong>open .</strong> and hit <strong>ENTER</strong>. This opens the current directory in finder - super handy. You can also open files like this.</p>
<h3 id="putcapslocktobetteruse">Put Caps Lock to better use</h3>
<p>When have you last used <strong>Caps Lock</strong> key? Yep, I know. Lets put it to use and remap it to something useful like <strong>ESC</strong>. Think about the hundreds of kilometers of pinky movement saved when using Vim.</p>
<ol>
<li>Get <a href="https://github.com/tekezo/Karabiner-Elements">Karabiner-Elements</a> and install it</li>
<li>In the app Change <strong>Caps Lock</strong> keycode to 53</li>
<li>Now your <strong>Caps Lock</strong> acts as <strong>ESC</strong></li>
</ol>
<h3 id="androidusbtetheringforyourmac">Android USB tethering for your Mac</h3>
<p>I don&apos;t really understand how can you need a separate driver for this, but you can get it <a href="http://www.joshuawise.com/horndis">here</a>.</p>
<h3 id="xcodewirelessdebuggingrunbuildsoverwifi">Xcode Wireless Debugging &#x2014; Run builds over WiFi</h3>
<p>This is a lifesaver tip. You can run your app builds on your phone even if you forgot that pesky, expensive cable under the table in that fancy coffee you had one too many lattes at.</p>
<ol>
<li>Connect your phone to your mac via the USB and fire up Xcode</li>
<li>Press <strong>Shift</strong> + <strong>Command</strong> + 2 to open devices manager and select your phone</li>
<li>Check the <strong>Connect via network</strong> checkbox and trash that USB cable you don&apos;t need no more</li>
<li>Profit</li>
</ol>
<h3 id="fixairplayconnectivityissues">Fix AirPlay connectivity issues</h3>
<p>Often AirPlay just stops connecting to the speakers. I&apos;ve had this happen with pretty much all of my Macs - gone are the days when Apple stuff just worked. But lucky for us, as the same little trick still seems to work and get it fixed.</p>
<p>Open your terminal and type in the following command to reboot the coreaudio service and get things running again:</p>
<pre><code>sudo kill -9 `ps ax|grep &apos;coreaudio[a-z]&apos; |awk &apos;{print $1}&apos;`
</code></pre>
<h3 id="morefinegrainedvolumecontrol">More fine-grained volume control</h3>
<p>You can have more fine-grained control over the volume if you hold down <strong>ALT</strong> and <strong>SHIFT</strong> when adjusting the volume up or down with the quick keys.</p>
<h3 id="quicklyaccessprogrampreferences">Quickly access program preferences</h3>
<p>Just hitting <strong>CMD</strong> + <strong>,</strong> opens the preferences in most OSX apps.</p>
<h3 id="pasterichtextasplain">Paste rich text as plain</h3>
<p>Often you copy text from a web page and drop it to Evernote or Pages and the styles from the web page are preserved. Annoying! But use <strong>CMD</strong> + <strong>SHIFT</strong> + <strong>v</strong> to paste your text. Et voil&#xE0;, plain text!</p>
<h3 id="takescreenshotslikeaboss">Take screenshots like a boss</h3>
<p>Hit <strong>CMD</strong> + <strong>Shift</strong> + <strong>4</strong> to paint an area which you want for a screenshot. Paint, click and your screenshot will be saved on the desktop.</p>
<h3 id="takescreenrecordingslikeaboss">Take screenrecordings like a boss</h3>
<p>Hit <strong>CMD</strong> + <strong>Shift</strong> + <strong>5</strong> to be able to select the area of the screen you want to record. To start recording click the <strong>Record</strong> button in the menu that popped up. To stop the recording hit <strong>CMD</strong> + <strong>CTRL</strong> + <strong>ESC</strong>.</p>
<p>Under the options from the popup menu you can choose some useful stuff like showing mouse clicks as in the video.</p>
<h3 id="accessingphotosoniphone">Accessing photos on iPhone</h3>
<p>Scratch using any third-party apps or even the complex Photos app and use an app called <code>Image Capture</code> that comes with OS X.</p>
<h3 id="convertp12filetokeyfile">Convert .p12 file to .key file</h3>
<p>Mac OS X Keychain allows you only to export your private keys as .p12 or .pem files. Sometimes you want to have the .key file. You can use OpenSSL to convert between the formats. Use the command below and give it the import password when it asks.</p>
<p><code>openssl pkcs12 -in myverysecretprivatekey.p12 -nodes -out mynomoresosecretprivate.key -nocerts</code></p>
<h3 id="createapasswordprotectedzip">Create a password protected zip</h3>
<p>While the context menu allows you to easily zip files on the fly, it does not allow you to password protect that zip file. So when you have some dark secrets to hide and need to send em over in zip, here&apos;s how you can do it on the command line.</p>
<p><code>zip -e -r darksecrets.zip darksecretsdirectory</code></p>
<h3 id="terminaltoclipboard">Terminal to clipboard</h3>
<p>In the terminal you can use two commands <code>pbcopy</code> and <code>pbpaste</code> to interact with the system clipboard. They work as you would expect unix programs to work. For example, copying website source to the clipboard is as simple as:</p>
<pre><code>curl &quot;http://stackoverflow.com/&quot; | pbcopy
</code></pre>
<h3 id="killershortcutsinfinder">Killer shortcuts in Finder</h3>
<p>Some less known shortcuts that you should be using to make using the finder less painful.</p>
<ul>
<li><strong>CMD</strong> + <strong>Shift</strong> + <strong>A</strong> - Open Applications folder</li>
<li><strong>CMD</strong> + <strong>Shift</strong> + <strong>H</strong> - Open Home folder</li>
<li><strong>CMD</strong> + <strong>Shift</strong> + <strong>D</strong> - Open Desktop folder</li>
<li><strong>CMD</strong> + <strong>Shift</strong> + <strong>O</strong> - Open Documents folder</li>
<li><strong>CMD</strong> + <strong>Option</strong> + <strong>L</strong> - Open Downloads folder</li>
<li><strong>CMD</strong> + <strong>Shift</strong> + <strong>L</strong> - Open Library folder</li>
<li><strong>CMD</strong> + <strong>Shift</strong> + <strong>.</strong> - Toggle Hidden Files</li>
<li><strong>CMD</strong> + <strong>[</strong> - Back</li>
<li><strong>CMD</strong> + <strong>]</strong> - Forward</li>
<li><strong>CMD</strong> + <strong>Up</strong> - Up</li>
</ul>
<h3 id="syncalocalfolderwithdropbox">Sync a local folder with Dropbox</h3>
<p>You can use symlinks to sync local folders to dropbox. For example add a symlink for <code>~/Desktop</code> folder to <code>~/Dropbox/Desktop</code> to sync your desktop to Dropbox. This is assuming that <code>~/Dropbox</code> is your Dropbox folder.</p>
<p><code>ln -s ~/Desktop ~/Dropbox/Desktop</code></p>
<h3 id="listalllisencesinajavascriptproject">List all lisences in a JavaScript project</h3>
<p>Sometimes you work with that annoying Large ACME Inc and they request you to provide all the lisences you are using to run that service for them. And boy are there a bunch of those to find by hand - Yarn can save your bum here.</p>
<p><code>yarn licenses list</code></p>
<h3 id="findopenfilesbyprocessname">Find open files by process name</h3>
<p>Ever needed to figure out what files is a given process touching? This command let&apos;s you snoop around.</p>
<p><code>sudo opensnoop -n ProcessName</code></p>
<h3 id="solverandomitermtabopenslowdown">Solve random Iterm tab open slowdown</h3>
<p>No idea why but clearing some logs helps make iTerm fast again.</p>
<p><code>sudo rm /private/var/log/asl/*.asl</code></p>
<h3 id="superchargequicklooktopreviewsourcefiles">Supercharge quicklook to preview source files</h3>
<p>Install the Syntax Highlight plugin for quicklook from here: <a href="https://github.com/sbarex/SourceCodeSyntaxHighlight">https://github.com/sbarex/SourceCodeSyntaxHighlight</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[The Little Things]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The web has been around for a good while. Still many little things are more often wrong than right. We should do better.</p>
<p>Here&apos;s a list of little, easily fixable things that greatly affect the user experience.</p>
<ol>
<li>When you have a signup form, don&apos;t restrict the</li></ol>]]></description><link>https://journal.wingmen.fi/the-little-things/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc32a</guid><category><![CDATA[Development]]></category><category><![CDATA[web design]]></category><category><![CDATA[ux]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Mon, 07 Mar 2016 02:36:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1494869042583-f6c911f04b4c?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1494869042583-f6c911f04b4c?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="The Little Things"><p>The web has been around for a good while. Still many little things are more often wrong than right. We should do better.</p>
<p>Here&apos;s a list of little, easily fixable things that greatly affect the user experience.</p>
<ol>
<li>When you have a signup form, don&apos;t restrict the complexity of the password. Your system should support long and complex passwords, it makes for a really crappy first experience when users get their crafty passwords rejected by your picky system. Of course within reason, you still need to prevent DDOS by creating crazy long passwords.</li>
<li>Kill paginated articles. We know how to scroll. Only reason you would need to paginate content nowadays is to squeeze out more page views. That is pretty damn evil.</li>
<li>Create proper links for phone numbers. A tap should make a call, so that there is no need to copy paste or memorize numbers. Selecting that number and then copy pasting it on a smartphone is not that easy.</li>
<li>Log in the user after they sign up for your service. Demanding users to input their login info again right after they just gave you the same damn info starts the relationship on a bad note. You just look lazy.</li>
<li>Log in the user also when they have just changed their password. No need to force a login again.</li>
<li>Don&apos;t shoot pop ups at user&apos;s face when they&apos;re engaging with your content. Ask them later. Popups might get more results, but the people on those lists often just gave their email to get rid of your pop up. They&apos;re not a quality audience.</li>
<li>And if you really must use a pop up to annoy the crap out of your users, don&apos;t make them have to click on a text that says something like &quot;No, I suck and I don&apos;t want to be a good person&quot;. That drives people away.</li>
<li>Remember shopping cart content when people sign up to order on your ecommerce site. Not many things suck as much as having to find all that stuff again.</li>
<li>Make your forms remember the content, so when a user accidentally closes the tab or navigates back - all is not lost. Everyone knows the feeling when you go &quot;oops&quot; after 15 min of writing. You can be a real hero here!</li>
<li>Save the email address or user name when navigating from the login form to the forgot password form. Why would you want to make your user retype that?</li>
</ol>
<p><img src="https://journal.wingmen.fi/content/images/2016/Mar/snow_little_things_details.jpg" alt="The Little Things" loading="lazy"></p>
<p>Remember that trust and loyalty is built slowly, one small happy experience at a time.</p>
<p>We tweet about user experience in the web, you can follow us at <a href="http://twitter.com/wingmenguys">http://twitter.com/wingmenguys</a> for more. :)</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Lessons learned in 2015]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>This is our top three lessons learned from web consulting &amp; building digital products in 2015.</p>
<p>TLDR:</p>
<ol>
<li>
<p><strong>Consulting:</strong> Small client projects require comparatively more effort than larger ones.</p>
</li>
<li>
<p><strong>Products:</strong> Building digital products is almost easy - acquiring and keeping users is really, really hard.</p>
</li>
<li>
<p><strong>Sideprojects:</strong> Building side projects for recurring</p></li></ol>]]></description><link>https://journal.wingmen.fi/lessons-learned-in-2105/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc328</guid><category><![CDATA[Business]]></category><dc:creator><![CDATA[Wingmen Guys]]></dc:creator><pubDate>Thu, 11 Feb 2016 11:53:14 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1454166155302-ef4863c27e70?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1454166155302-ef4863c27e70?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Lessons learned in 2015"><p>This is our top three lessons learned from web consulting &amp; building digital products in 2015.</p>
<p>TLDR:</p>
<ol>
<li>
<p><strong>Consulting:</strong> Small client projects require comparatively more effort than larger ones.</p>
</li>
<li>
<p><strong>Products:</strong> Building digital products is almost easy - acquiring and keeping users is really, really hard.</p>
</li>
<li>
<p><strong>Sideprojects:</strong> Building side projects for recurring income while consulting is hard. You need to seriously plan and prioritize side project work to actually get anything done.</p>
</li>
</ol>
<h3 id="consultingclientwork">Consulting / Client work</h3>
<p>While our little design &amp; coding shed was founded in January 2013, we only started running things full steam in Oct 2014. Like most web agencies, we started by doing websites for clients. We&#x2019;ve been meaning to switch away from basic site building for some time (ok you got us, it&#x2019;s been the plan ever since we started Wingmen in the first place), and concentrate on UI/UX work and our own products. Guess you could say that 2015 was a success: we only did four smaller website gigs during the whole year. We had the fortune to work on one big client UI project and several side ventures - not having to worry about new sales all the time.</p>
<p>We&#x2019;re looking to continue on the same path in 2016. However, <em>One big client</em> issues are obvious: Most eggs are in one basket and you better not lose it. Finding the next big gig to pay the bills can be a pain in the a**! Looking back, for us it still pays off to stay away from small projects since they often require (a lot) more work relatively than bigger ones. Focusing on bigger projects enables us to deliver an epic result for our clients.</p>
<p>This doesn&#x2019;t mean we don&#x2019;t love to hear from all new projects, and we still often find it difficult to say no :) In 2016 we&apos;re also looking into more structured ways of handling small projects, where we&apos;ll be selling small projects as well defined products. Productized consulting can cut the overhead of smaller projects and produce better results for the clients too.</p>
<h3 id="productssideprojects">Products / sideprojects</h3>
<p>While building several projects &amp; ventures on the side (see <a href="http://wingmen.fi/#ventures">http://wingmen.fi/#ventures</a> for more) we learned some tough lessons about launching and marketing digital products. As you may already know it&#x2019;s not like &#x201C;Once you build it, they will come&#x201D;. Nobody actually comes - without real, hard work. We learned our lesson and have started taking more people onboard in our side projects to take care of the marketing. After all 50% of something is more than 100% of nothing. So do not forget marketing, without it your project will be just a dead fish in the sea.</p>
<p>Another takeaway from balancing the work between client project(s) and our own ventures: side projects get always dumped in favour of client work. And even when there is not much real client work going on, own projects get a pass in favour of the latest episode of Something Totally Meaningless on Netflix. You have to start planning and prioritizing your own projects like actual work to make real progress. This is something we&#x2019;re going to be focusing on in 2016!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Web design inspiration]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Here&apos;s a categorized list of our favourite agency and product websites we&apos;ve saved for inspiration.</p>
<h3 id="agencysites">Agency sites</h3>
<p>Looking at agency sites is especially interesting because that&apos;s where the agencies get to do their <em>very</em> own thing. Your vision, your execution - no limits.</p>
<p><a href="http://blacknegative.com/">http:</a></p>]]></description><link>https://journal.wingmen.fi/web-design-inspiration/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc327</guid><category><![CDATA[Development]]></category><dc:creator><![CDATA[Wingmen Guys]]></dc:creator><pubDate>Thu, 07 Jan 2016 18:28:13 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1444703686981-a3abbc4d4fe3?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1444703686981-a3abbc4d4fe3?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Web design inspiration"><p>Here&apos;s a categorized list of our favourite agency and product websites we&apos;ve saved for inspiration.</p>
<h3 id="agencysites">Agency sites</h3>
<p>Looking at agency sites is especially interesting because that&apos;s where the agencies get to do their <em>very</em> own thing. Your vision, your execution - no limits.</p>
<p><a href="http://blacknegative.com/">http://blacknegative.com/</a><br>
<a href="http://www.doctorjekyll.com/en">http://www.doctorjekyll.com/en</a><br>
<a href="http://doamaral.com/">http://doamaral.com/</a><br>
<a href="http://focuslabllc.com/">http://focuslabllc.com/</a><br>
<a href="http://www.giantstepsmedias.com/">http://www.giantstepsmedias.com/</a><br>
<a href="http://houseofborel.com/">http://houseofborel.com/</a><br>
<a href="http://paravelinc.com/">http://paravelinc.com/</a><br>
<a href="http://playgroundinc.com/">http://playgroundinc.com/</a><br>
<a href="http://migueltrias.com/">http://migueltrias.com/</a><br>
<a href="http://neverbland.com/">http://neverbland.com/</a><br>
<a href="https://sfcd.com/">https://sfcd.com/</a><br>
<a href="http://truthlabs.com/">http://truthlabs.com/</a><br>
<a href="http://twofold.com/">http://twofold.com/</a></p>
<h3 id="webappsproducts">Web apps &amp; products</h3>
<p>These sites all have something that makes them stand out of the crowd. Great for finding some inspiration for your next project.</p>
<p><a href="https://www.acorns.com/">https://www.acorns.com/</a><br>
<a href="http://crushpath.com/">http://crushpath.com/</a><br>
<a href="http://www.desk.com/">http://www.desk.com/</a><br>
<a href="https://do.com/">https://do.com/</a><br>
<a href="http://www.getballpark.com/">http://www.getballpark.com/</a><br>
<a href="https://www.getflow.com/">https://www.getflow.com/</a><br>
<a href="https://evernote.com/">https://evernote.com/</a><br>
<a href="https://knowlium.com/">https://knowlium.com/</a><br>
<a href="http://mailchimp.com/">http://mailchimp.com/</a><br>
<a href="http://www.squarespace.com/">http://www.squarespace.com/</a><br>
<a href="https://squareup.com/">https://squareup.com/</a><br>
<a href="https://stripe.com/">https://stripe.com/</a><br>
<a href="https://stripe.com/atlas">https://stripe.com/atlas</a></p>
<h3 id="collectionsofinspiration">Collections of inspiration</h3>
<p>If our picks are not to your tastes, here&apos;s a few links to pages that serve you curated pieces inspiration. CAUTION: Some of the sites below might be morally corrupt and take money for posting submissions.</p>
<p><a href="http://inspirationui.com/">http://inspirationui.com/</a><br>
<a href="http://www.awwwards.com/">http://www.awwwards.com/</a><br>
<a href="http://www.cssmania.com/">http://www.cssmania.com/</a><br>
<a href="http://collectui.com/">http://collectui.com/</a></p>
<p>Ps. Some of the sites might have been updated since we saved them and become even more cooler. Some times updates go the other way too.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Temple.fi - For better work days]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Temple is a simple web app to motivate you to build healthy habits during the working day. You can find it at <a href="https://temple.fi">https://temple.fi</a>.</p>
<p>We&apos;re using Temple to keep our work days at the office productive and healthy. The app reminds you to take breaks and reach</p>]]></description><link>https://journal.wingmen.fi/temple-for-better-work-days/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc325</guid><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Fri, 11 Sep 2015 09:21:50 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1499516387605-0d549f707bd1?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1499516387605-0d549f707bd1?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Temple.fi - For better work days"><p>Temple is a simple web app to motivate you to build healthy habits during the working day. You can find it at <a href="https://temple.fi">https://temple.fi</a>.</p>
<p>We&apos;re using Temple to keep our work days at the office productive and healthy. The app reminds you to take breaks and reach set goals for the day. Goals can be anything from doing a set amount of push-ups to drinking enough water. We&apos;ve been using Temple for a few months now and suddenly we both acquired bodies of greek gods. True story.</p>
<p><img src="https://journal.wingmen.fi/content/images/2015/Sep/temple_body_app_wingmen.jpg" alt="Temple.fi - For better work days" loading="lazy"></p>
<p>All jokes aside, your body is your temple and you should treat it like one. Today many of us sit hours on end staring at screens. Some of us do that for <em>very</em> long hours. It&apos;s crucial to get up and move periodically - sitting kills you. Taking breaks helps you work more efficiently to boot.</p>
<p>So go ahead and give <a href="https://temple.fi">Temple</a> a spin and see if it could improve your day! Ideas and problems you can send to <a href="mailto:guys+temple@wingmen.fi">guys+temple@wingmen.fi</a>.</p>
<p>ps. In addition to using Temple we heartily recommend the combination of a standing desk and a balance board.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Localizing what's global, Refindr]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>A year ago we wrote a short note on one of our side projects: <a href="http://refindr.com">Refindr</a>.</p>
<p>To recap, Refindr is basically a web based map application similar to Craigslist lost and found. Users can leave heart shaped pins on the map and share their story: Who they met &amp; where did</p>]]></description><link>https://journal.wingmen.fi/localizing-whats-global-refindr/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc323</guid><category><![CDATA[Business]]></category><dc:creator><![CDATA[Juha Kalamies]]></dc:creator><pubDate>Wed, 28 Jan 2015 08:25:43 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1499591934245-40b55745b905?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1499591934245-40b55745b905?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Localizing what&apos;s global, Refindr"><p>A year ago we wrote a short note on one of our side projects: <a href="http://refindr.com">Refindr</a>.</p>
<p>To recap, Refindr is basically a web based map application similar to Craigslist lost and found. Users can leave heart shaped pins on the map and share their story: Who they met &amp; where did this happen. The meeting timestamp can be anything from a specific date to a decade. With (a lot of) luck, someone who knows the event will find the pin and reply.</p>
<p><img src="https://journal.wingmen.fi/content/images/2015/Jan/refindr-mobile-1.jpg" alt="Localizing what&apos;s global, Refindr" loading="lazy"></p>
<p>We launched the site and pretty much left it there. The only places we marketed it was a few sideproject boards. As you can imagine, without marketing we only got barely any traffic and few pins on the map.</p>
<p>Every now and then we&apos;ve been giving Refindr more thought and we always tell ourselves that the idea &amp; execution is still valid. The project however always gets dumped to the end of the work queue, after all client work. This is not a happy place to be.</p>
<p>One thing we decided to try next is localize Refindr, starting from Finland, with a Finnish name. We&apos;ll still be using the same backend with all the map data, but the map will simply be focused on Finland and the app itself will be in Finnish. The global view might simply be too off-putting if you&apos;re from a small town in wherever.</p>
<p>This will be a neat thing to try and it&apos;ll be interesting to see whether the site will find it&apos;s Finnish audience by doing this. Naturally, we&apos;ll also have to plan and execute marketing this time.</p>
<p>We&apos;ll update what happens later.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Hacking live client websites]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>More often than one would like, you need to make changes to a live web site. This can be due to working on a small budget or with legacy systems, where there&apos;s no separate development environment available. It seems we run into this most often with projects built</p>]]></description><link>https://journal.wingmen.fi/hacking-client-websites-live/</link><guid isPermaLink="false">5f69d2c20fbddf39fb7fc322</guid><category><![CDATA[Development]]></category><category><![CDATA[note-to-self]]></category><dc:creator><![CDATA[Jussi Kaijalainen]]></dc:creator><pubDate>Sat, 10 Jan 2015 09:05:02 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1544890225-2f3faec4cd60?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1544890225-2f3faec4cd60?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Hacking live client websites"><p>More often than one would like, you need to make changes to a live web site. This can be due to working on a small budget or with legacy systems, where there&apos;s no separate development environment available. It seems we run into this most often with projects built on PHP based content management systems.</p>
<p>To reduce the chance of things going royally south, it&#x2019;s good to make the changes in a way that they are only visible if a certain condition is met. There are quite a few ways to achieve this. In this post we have put down our most often used code snippets ready for your copy pasting.</p>
<p>Showing content only when a &quot;secret&quot; url parameter exists ( e.g. site.com?secretparam=1):</p>
<pre><code>&lt;?php

if( $_GET[&quot;secretparam&quot;] &amp;&amp; $_GET[&quot;secretparam&quot;] == &apos;1&apos; ) {
     // Add extra CSS, JS files or do something else
}
</code></pre>
<p>Showing content for only certain user in Wordpress:</p>
<pre><code> &lt;?php
 
 $user = wp_get_current_user();
 if ( is_user_logged_in() &amp;&amp; $user-&gt;user_login == &apos;myadminuser&apos; ) {
   // Add extra CSS, JS files or do something else   
 }
</code></pre>
<p>Showing a different Wordpress theme for a certain logged in user (drop into plugin folder and activate):</p>
<pre><code>&lt;?php

/*
Plugin Name: Change theme for user
Description: Display different theme to user if logged in as YOURUSER
Author: Wingmen LTD
*/

add_filter(&apos;template&apos;, &apos;set_theme&apos;);
add_filter(&apos;option_template&apos;, &apos;set_theme&apos;);
add_filter(&apos;option_stylesheet&apos;, &apos;set_theme&apos;);
function set_theme($theme) {
    $current_user = wp_get_current_user();
    if ( !($current_user instanceof WP_User) )
    	return $theme;

    if ( $current_user-&gt;user_login == &apos;YOURUSER&apos; ) {
        $theme = &apos;themev2&apos;;
    }
    return $theme;
}
</code></pre>
<p>Showing content for only certain user in Drupal template:</p>
<pre><code>&lt;?php

Global $user;
if( $logged_in &amp;&amp; $user-&gt;name == &apos;myadminuser&apos; {
	// Add extra CSS, JS files or do something else
}
</code></pre>
<p>You can find more quick and dirty tips like this under the tag <a href="https://journal.wingmen.fi/tag/note-to-self">note-to-self</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>