Mateusz Stawecki

Personal Site

Posts from the ‘Uncategorized’ category

While I’m really enjoying OS X El Capitan (everything runs smoother and my MacBook is much colder) it has put a large nail into the coffin of my two favourite OS X apps: TotalTerminal and TotalFinder. In my opinion, both apps were essential for developers working on their MacBooks in the field, but could also prove useful for any OS X users.

How it works?

The idea is to simplify access to Finder’s folder view and any active Terminal session, by using a global hot key (like ctrl+` for Terminal and alt+` for Finder). Finder would appear at the bottom of the screen, Terminal at the top. This way, you can easily drag and drop files from Finder to other apps like Xcode or even your active Terminal session without switching desktops. It’s particularly useful when using a single display.

Why it’s broken on El Capitan?

In OS X El Capitan, Apple has introduced SIP – “System Integrity Protection”, which protects your system from being tampered by malicious software like malware. One big step for security, but an unfortunate breaking change for plug-ins and apps that rely on these kind of hacks for non-malicious things.

If you’re willing to live with the risk, you can disable System Integrity Protection as the author of TotalFinder explains here, however he does not recommend it.

Proposed replacement!

Ok, so Apptivate isn’t exactly a replacement for TotalFinder, but I’ve originally started using TotalFinder to gain access to features like tabs and the visor. Since then Finder gained pretty good tab support. The visor was extremely useful, but was always a little laggy. Apptivate allows me to create a show/hide hotkey for Finder. Simply add a hotkey for the Finder application and in the Apptivate’s prefereces tick the “Hide application if it is active” setting. Open Finder and move it to the bottom of the screen. In the dock, ctrl-click Finder, select Options > Assign to: All Desktops.
I’ll miss TotalFinder’s split folder view, but Finder’s performance on El Capitan is fantastic, which makes this solution very responsive.

While TotalTerminal was a way of adding custom behaviour to the original Terminal, iTerm2 is a complete replacement with many additional features. Here’s a post on how to configure the visor feature.


After constant postponing and many many discussions, we’ve finally changed our name to Tapjet. I’ve secretly hoped that it would happen before our Kickstarter, but we didn’t want to confuse the people who followed our journey since The Loop Magazine or Wonders. However, it’s finally happened. Both our creation tool and our company name (now Tapjet Limited) are fully re-branded. Hours spent on whois’ing domains and browsing synonyms has paid off. The final list had 65 potential names, but to me Tapjet finally brings a meaningful description of what our product is about: “tap” – because we’re focused on touch and simple immersive experiences, “jet” – because we strive for speed, strength, reliability.


Our new logo by @forgottentowel

Checkout our website at

There is much more to come this year, so make sure you follow our new Twitter account: @tapjet

Leave a comment

I’ve recently wrote a piece for The Loop Magazine about a subject close to my heart that is kind of a taboo at conferences – anxiety, clash of egos, impostor syndrome. The piece is in form of a collective interview with some interesting individuals: Amy Worrall, Barry (Baz) Scott, Carola Nitz, Casey Liss, Stuff MC and Mark Reynolds.

Check it out here: Behind the Mask – The Loop Magazine

Ull Conf 2015

Leave a comment
Úll Conf iOS app

Úll Conf iOS app

This year at Úll Conf I had the pleasure of working with the organisers on creating the Úll iOS app. In order to build and publish the application we used Glide – an app creation platform, which I’m working on with Chris Harris. While the key feature of Glide is easy content collation via Dropbox – which allowed us to easily publish the schedule, photographs and speaker information – we’ve been recently experimenting with Apple’s iBeacons.

The conference took place at the Lyrath hotel, in charming Kilkenny, Ireland. The venue was quite large and had several interesting facilities, that we wanted to expose to the participants of the conference.

On Tuesday morning we’ve sent out a notification and published several clues linked to each place. In each room we’ve setup a beacon. We configured our content to post a notification when the beacon was ranged and unlock content related to the room, which included beautiful illustrations done by Carolina Buzio.

2014-05-04 21.45.36

Overall, everything went well. A few takeaways from the experiment:

  • detecting another beacon in the same region doesn’t usually wake up the app again. One of the workarounds I’m using is continuing to range beacons in background, by requesting a background task. That obviously only works for a finite amount of time.
    Another solution is to use multiple beacons regions, but rememeber that you can track up to 20. You’ll also need re-programmable beacons! As Apple points out, you could reconfigure which regions you’re tracking based on where you are.
  • make sure people have Bluetooth turned on. Biggest “oops!” of the experiment. The app didn’t inform the users to switch on bluetooth.
  • Beacons.

    We used beacons supplied by @dermdaly

    dissapearing beacon bug: one of the bugs that I noticed was that often ranged beacons dissapeared several scans after they were initially ranged. In our case this wasn’t a huge problem, we just needed to range it once, but if you’re depending on the beacon to stick around on that list (while you’re actually in range), it’s a problem.

  • beacons not working until device reboot: it’s 2014 and some people still had to restart their phones in order for beacons to work. No comments here.


All iBeacons aside, I highly recommend both Úll Conf and Lyrath :)



Leave a comment

Especially with the recent budget cuts, welfare has been a hot topic in the media. However, it’s pretty clear that there is a bit of confusion around what “welfare” really is.

If you’ve studied in the UK as a UK or EU resident just like me, you’ve received between £10,500 – £30,000 of government welfare in form of subsidised tuition. This is something many students don’t even realise and certainly don’t question their entitlement to.

When thinking about welfare and poverty, let’s be clear – we’re all on the same boat. Some of us are just less lucky and more stigmatised for receiving very basic help. Moreover, the money distribution points at a serious inequality issue.

The following video was created by The #GlobalPOV Project in the context of US welfare, but the concepts apply globally. If you feel like you’re the sort of a person who cares about inequality at least a little, I highly recommend you watch it. With economic inequality getting worse every year, this is not an issue which will just go away on its own.

Spread the word:

Leave a comment

If you feel disappointed due to the lack of a new iPhone or a TV – don’t be. WWDC – Apple’s World Wide Developers Conference was always software centric and while there are hardware announcements included, the Keynote was packed with fantastic software updates. After enjoying the whole conference, I’m pleased to report that Apple has “brought it”. What I’m seeing is a consistently strong rate of innovation in both iOS, OS X and even the Web services. Focusing not only on new features, but refining the current set and improving reliability. Even Apple won’t get everything right the first time, but they’ve shown that they can improve instead of abandoning, which can’t be said for a lot of other products and tech companies.


The most noticeable change in iOS7 to most people is obviously the user interface overhaul. While the new look is a bit shocking for some and many people are still making up their mind, it’s nice to see that Apple is taking risks and coming up with things the tech community is not comfortable with. The real question is how will the consumers respond, but the most basic interface patterns persist, so I believe that it shouldn’t be a big issue.

Some of the new looks in iOS7 might even seem similar to other existing platforms, but this is not about being unique – it’s about providing users with the best possible experience. To make that happen Apple has introduced many changes to the platform which are unique, hard to execute ideas: a physics-based dynamic and motion aware graphic user interface (which was hinted many times before), and the replacement of old metaphors with more visual depth and simplified controls. Many of these changes are truly stunning, yet the iOS team is not just showing off, the designs feel very purpose-driven and focused on the principal that content comes before the UI. This design direction doesn’t just apply to Apple’s work, it should guide app developers when thinking about their own app designs. It’s a direction we at OTHER media strongly believe in.

Chris Harris and Craig Federighi. Wonders App.

While the details are restricted until Fall (as usual), my feeling is that changes to iOS7 will also have a strong impact on what the app developers can achieve with the platform. That means a new range of apps, which can be implemented on the platform and of course new kinds of solutions to support new and existing businesses. The icing on the cake to these new goodies is as Tim Cook highlighted during the keynote: iOS has an extremely high adoption rate with over 90% of users running the latest version, which means these future features can be used in production very soon after the official release of iOS7.
As a developer, I’m particularly pleased by Apple’s commitment to delivering further improvements to the tools we use. Many are based on feedback left by the developers themselves, which makes the latest releases really great and more efficient to use.

If you round up all these changes, think about the timeframe and last year’s political shifts at Apple, it’s staggering how much this company managed achieve and deliver. All of that makes iOS and OS X still the two strongest platforms out there. The community is excited as always. Apple engineers were very helpful in the labs as always. Overall, WWDC2013 was again a highlight of my year.

Screen Shot 2013-06-23 at 21.46.11

Leave a comment

UPDATE: This is an old piece, you probably want: phantom.js and casper.js

In this post I’ll show you how to remotely control your Google Chrome browser using JavaScript and scrape some data, even if it’s on an AJAX powered website or behind HTTPS authentication. Nice? I LOVE WebKit and now it got even sweeter. Very recently there was a small buzz about a new feature: WebKit Remote Debugging that allows to use Element Inspector remotely! (since it’s essentially just a web page and some javascript + websockets). What’s the real icing on the cake for me, is the ability to plug-in a different interface. I wrote a simple interface that can execute several pieces of JavaScript and return the values back to you. Here’s how to set it up. Open Terminal and find the Google Chrome executable. To use remote debugging, run it with a special parameter:

$ cd /Applications/Google $ ./Google Chrome –remote-debugging-port=9222

If you get:

[0513/] Check failed: bundle. Failed to load the bundle at /Applications/Google Chrome Framework.framework

Try symlinking Versions:

$ ln -s ../Versions/ ./Versions

The browser should start normally. Now go to a different browser, e.g. Safari and check out: http://localhost:9222 Select a page and you should see the Inspector. That’s all nice and neat. But let’s see my remote script: – To connect to the debugger, we’re using WebSockets. Change the page number based on the link from http://localhost:9222 . Every “Tab” has a different “Page” number.

	// Set page number!
	var host = "ws://localhost:9222/devtools/page/5";
	socket = new WebSocket(host);

– To execute JavaScript I wrapped a JSON-RPC-like command into a method with callback. More protocol schema here.

function remoteEval(scriptString,callback) {
	seqCallback[seqNo] = callback;

– And this is how a sample script works:

remoteOnLoad = function(result) {

// We might've ended up on the login page, so let's log in!
if (remoteURL.indexOf("ServiceLogin") > 0 )
remoteEval( " document.getElementById('Email').value = 'username'; "+
	" document.getElementById('Passwd').value = 'password'; "+
	" document.getElementsByTagName('form')[0].submit(); "
	, function(result) { alert(result); } );

	// We're home!
	if (remoteURL.indexOf("") > 0 )
	remoteEval( " try { document.getElementById('canvas_frame')"+
".contentWindow.document.getElementsByClassName( 'md' )[0].innerText } catch(e) { -1 }"
	, function(result) {  // Waiting for AJAX. Try again in 2 sec.
	if (result == -1) { setTimeout(remoteOnLoad,2000); }
				else { alert(result); } } );
				// This should return scraped information
				// about your data usage on gmail!
				// E.g. You're currently using 150MB out of 7000MB
			} ;

// This happenes first:
remoteEval(" location.href = '' ");
//Let's go to Gmail!

Don’t know how about you, but I just wanna wrap it in Node.js, run it somewhere on Linux with a dummy X11 server for Chrome and write lot’s of crazy tasks, so it does it all for me! Imagine e.g. that instead of that alert(result) you make it a WebHook or a service?

1 Comment

Get every new post delivered to your Inbox.