I’ve been using h3lix (https://h3lix.tihmstar.net) in the past on my Iphone. Recently I needed it again, but it turned out Cydia Impactor doesn’t let you install h3lix anymore.

There was a tweet about it:


and followed the steps:

  1. Download h3lix (https://h3lix.tihmstar.net)
  2. Download (or copy paste) script and run it, patching downloaded h3lix.ipa. https://gist.github.com/jakeajames/b44d8db345769a7149e97f5e155b3d46
  3. Create a new project in Xcode, run it on iPhone, to update certificates
  4. Run IOS App Signer (https://www.iosappsigner.com),

4a. Enter your valid Certificate

4b. Enter Provisioning Profile using the one you created with your new project

4c. Change App Display Name if you wish

5. After…

Install depot_tools:

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=/path/to/fetched/depot_tools:$PATH


mkdir webrtc
cd webrtc
fetch --nohooks webrtc_ios
gclient sync
cd webrtc/src

Enable bitcode and specify architecutres needed.

tools_webrtc/ios/build_ios_libs.py --bitcode --arch arm64 x64 arm

Framework is inside:


Official docs:

How to strip unwanted architectures (when distributing to app store you need to strip x64 or i386).

That’s it!

Today we’ll explore how to send messages between multiple Apple devices using the Network framework, without the need of having external server. We’ll also use Bonjour service to let clients discover the each others automatically.

Let’s start with the first task: discovering devices using Bonjour (https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/NetServices/Introduction.html)

To accomplish this task we’ll need a server a browser. The server does the advertising and handles clients, the browser finds available servers (listeners).

First of all, we need to add NSBonjourServices key to Info.plist (https://developer.apple.com/documentation/bundleresources/information_property_list/nsbonjourservices), and pass an array of Bonjour service types. In our case, we’ll define one type and we’ll use…

Hands-On analysis of Apple’s Cache Policies working together with a Node.js Express Server to increase API efficiency and performance

Photo by Cleyder Duque from Pexels

There are only two hard things in Computer Science: cache invalidation and naming things.

— Phil Karlton

Fortunately for us, Apple helps us by providing robust and powerful cache policies. Policies we should use instead of building a custom (NSCache) solution!

In this post, we’ll explore different URLRequest cache policies and the consequences of using them. Those policies apply to both iOS and macOS. We’ll use a hands-on approach looking both on server and front-end sides.

To make things easy, the Node.js Express Server (the Backend) will return strings, and we’ll log the responses in the console.

Reset mysql root access:

sudo service mysql stop
sudo mysqld_safe —skip-grant-tables —skip-networking &
mysql -u root

In the mysql:

use mysql;
update user set authentication_string=password('NEWPASSWORD') where user='root';
flush privileges;

Restart mysql:

sudo service mysql restart

In case of: mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists. error, create this directory and set ownership:

mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld

Grant access to mysql from other host:


Check for running server in local network:

for i in {2..255}; do echo $i; curl --connect-timeout 1…

Let’s create a new Vue / Nuxt app:

npx create-nuxt-app google-sign

Enable Axios, choose Single Page App rendering mode. Add firebase to our Nuxt app:

npm install firebase --save

Create a firebase plugin, add new file ‘firebase.js’ inside /plugins and register it inside nuxt.config.js

Next, create a Firebase project. Go to


and create a new project, call it ‘google-sign’.

Inside the Firebase project, go to Settings and add a new Web app. Call it ‘google-sign’.

With DispatchGroup and DispatchSemaphore

Photo by oakie on Unsplash

Let say you need to perform multiple network calls and need to wait for them to complete to aggregate results.

I think the simplest solution would be to use DispatchGroup (if the order of execution doesn’t matter) or DispatchSemaphore.

I will demonstrate both the problem and its solutions by using a function which will combine two async calls and then using a loop containing async calls.

Let’s create a command-line project.

Create a function which will convert Int to String after a pre-defined delay.

The First Scenario Without a Loop

Create a function which will combine two async calls:

When we run it, the…

After finishing our family blog from our journey through Sulawesi, we still haven’t decided where we will host it. I decided using docker to contain it and make it easy to switch hosts in the future.

Backup both content and database.

Connect to your host (for example via ssh).

Zip the folder containing wordpress wp-content directory. For example /var/www/html/wp-content:

sudo tar -czf wp-content.tar.gz wp-content

Export database, where wordpress is the name of wordpress database “add-drop-table” will drop tables when importing this backed up database into existing one:

mysqldump wordpress --add-drop-table -uuser -ppassword | gzip  > wordpress.sql.gz

Recreate Wordpress on the…

This post shows how to use UICollectionView inside UIView with custom UICollectionView cells and interface builder, this is super basic example without any extras.

First Create new Single View App.

Create custom view using File… New / Cocoa Touch Class, call it CustomView and make sure it subclasses UIView

Next create CustomView.xib, open New File… and select View, call it CustomView

A step-by-step guide

Photo by chuttersnap on Unsplash

There aren’t many resources regarding Audio Unit Extensions out there. There’s one Apple sample project, some info, and WWDC talk about it:


The basic idea about Audio Unit V3 is that, by default, it runs as separated process (Extension Service Process) and communicates with the host application using IPC (interprocess communication). There are pros and cons to this approach (it’s safer, but it adds overhead, around 40u seconds for each call, which could be problematic when working with very low latencies).

For easier development, and in cases in which the IPC overhead is too high on OS X, there’s…

Borama Apps

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store