Author Archive for: ralf

An iPhone lover’s confession: I switched to the Nexus 4. Completely.

03 Jan
Update: Shortly after publishing this article here, it became #1 on Y Combinator’s Hacker News, republished by GIZMODO, picked up by ReadWriteWeb’s Editor-in-Chief (Dan Lyons), commented on by CNET NewsGigaOM’s Mathew Ingram and the International Business Times. I also gave a lengthy interview in German regarding the topic, which go subsequently covered in The European (German only).

The discussion mainly takes place over on Google+.

First things first, I’d love to get in touch on Google+ and Twitter (@ralf).

Over the past few years I’ve invested a lot into Apple products and services.

My Nexus 4If you’d come by my house, you’d find four of the latest Apple TVs, two iMacs, the latest MacBook Air, a MacBook Pro, more than five AirPort Express stations and Apple’s Time Capsule. You could touch every single iPhone, from the first up to the iPhone 5, iPads ranging from first generation to fourth and we’ve lately added two iPad minis.

My iTunes Library comprises well over 8.000 songs – all purchased via the iTunes Store. No matter whom you would ask, everybody will confirm that I’m what some folks call an Apple fanboy.

The reach of Apple’s products goes beyond my personal life.

As the co-founder of Germany’s largest mobile development shop, I’m dealing with apps – predominantly iOS powered – in my daily professional life.

Driven primarily by the business I run, I tried to give Android a chance more than once.

In various self-experiments, I tried to leave my iPhone at home for the Motorola Droid, the Nexus One, the Samsung Galaxy S II and S III – and always switched straight back to the iPhone. None of those Android devices have worked for me – yet.

And then I got the Nexus 4.

When the latest Google flagship Android device shipped, I almost expected it to turn out as yet another “take-a-look-and-sell-it-on-ebay” experience. Little did I know.

It’s now almost two weeks since I switched the Nexus 4 on for the first time – and meanwhile I completely moved to it, leaving my iPhone 5 at home. Do I miss anything? Nope. Except iMessage. More to that later.

In this somewhat lengthy post, I’ll try to explain why.

Read more →

Enable Google Now with Google Apps for Business account

19 Dec

I recently got my brand new Nexus 4 and it totally changed my opinion about Android (for the better).

I couldn’t emphasize more how Samsung ruins the Jelly Bean experience with what it does to it on the S3 – but that’s a totally different story. In short: I start to fall in love with Android since I own the Nexus 4.

One quirk that bothered me: I was unable to use Google Now. When swiping from bottom to top, no Google Now cards showed up. Also the Settings for the Google Search app had no option to turn on Google Now.

Read more →

Bookmark the correct Google+ account with Google multi sign-in

30 Nov

If you are like me, you might have multiple Google / Gmail / Google+ accounts.

Google made things more complicated by initially deciding to force the use of accounts for Google+, leaving all Google Apps customers with custom domains out in the cold. In case your employer is a Google Enterprise Apps customer, you might very well have at least three Google accounts – like me.

Read more →

Running a clean install of Windows 8 Pro on your MacBook Air via Boot Camp including Trackpad support

27 Oct

Wondering why I chose such a terribly long headline?

Well, there are many articles out there dealing with installing Windows 8 on MacBooks, however, most of them did not deal with exactly my situation. Before we move forward, you might want to follow me on Twitter for feedback and updates.

Here is a brief checklist. Compare it with what you want to do and find out, whether this article is for you:

  • I am using the Windows 8 Pro version released to market by Microsoft on October 26nd, 2012. Not any of the preview versions.
  • I am installing on the latest MacBook Air running Mac OS X Mountain Lion with all updates applied.
  • I use the downloadable version, without any optical media (DVD or so).
  • I only use an installed version of Windows 7 to get the Windows 8 Pro downloadable, after that, I remove it.
  • I’m doing a clean install, not an upgrade over an existing version of Windows 7.
  • I want to get the MacBook’s Trackpad fully working, including two-finger tap for right-clicks.
  • I want to activate my copy of Windows 8 Pro with the product key I purchased for US$ 39.99 even though I don’t have a previous version installed.

Sounds a little bit exhaustive but I really want to make sure, we’re on the same page as to the prerequisites. As always, you’re proceeding with the following at your own risk.

Read more → app for your iPhone and other third party services

12 Aug

If you are addicted to Social Media and haven’t spent the last couple of weeks behind a rock, you sure have heard about I’m @ralf there, the same as on Twitter.

In started with a blog post from well-known Dalton Caldwell, promoting the idea of an ads free, developer friendly social platform. While for whatever reason, most of the journalists did not get Dalton’s idea and put in the corner of being a Twitter clone, @sneakyness put it best on

“Anybody that says #AppNet is a #TwitterClone obviously hasn’t paid any attention to what’s going on. The website is merely a demonstration of what can be. This is a social graph lego kit with built in users!”

Dalton went for crowd funding the new platform and asked people to back the project by paying for a one year membership. If wouldn’t get 500.000 US$ by August, 13th 2012, his vision would not come to life. Well, when I started typing this article, the funding counter was at 542.200 US$.

One of’s promises from the beginning is to make the service extremely developer friendly. If you take a look into their early API specification – which you can actively work on and contribute to – they seem to be serious, it’s a developer’s dream.

Read more →

CakePHP hasAndBelongsToMany relationship queries demystified (HABTM, Contained, Pagination and more)

29 Jul


CakePHP is a pretty powerful development php framework. If you are like me, you understand that Ruby on Rails is way cooler these days, but do not feel ashamed to admit you’re coding in PHP because sometimes it just gets the job done faster. And without being less elegant if you’re using the right tools.

I’ve used CakePHP for Google+ Counter‘s front end tier and used it for numerous other professional web projects and frequently share my findings via Twitter (@ralf).

However, my relationship with the framework is a love-hate one. The main reason: CakePHP’s documentation is far from good. At a first glance, it appears to be fairly complete and comprehensive. There are tutorials, an API documentation and even complete online books. Unfortunately, once you start coding real-world projects, you’ll find that many parts of the docs to not be unambiguous and leaving many questions open.

Worst thing: The above is mostly true for stuff related to CakePHP’s powerful object-relational mapper (ORM).

As efficiently querying the model is an extremely important part of any web application, it’s a shame that CakePHP leaves developers guessing and in trial-and-error mode most of the time. Hop over to Stack Overflow and see for yourself. Even on the #CakePHP IRC channel, users are asking the same query related questions over and over again – a clear sign for a lack of documentation.

Recently I ran into what I expected to be a very basic and everyday scenario that ultimately took me days to figure out. Once I got it right, I felt so happy, that I wanted to give something back to the community. Hence this article.

All of the below is valid for CakePHP 2.x.

The Model

I had to model a pretty common scenario: Users belonging to groups. Obviously, any user can belong to many groups and any group can have more than a single user. In CakePHP the relationship the User and the Group model share is called “has and belongs to many”, abbreviated as HABTM.

I started with fairly straightforward model classes (omitting the validation code for brevity):

Note that I’ve set the models up having the HABTM relationship with each others. Behind the scenes CakePHP will leverage a join table which – by convention – is named GroupsUsers. Three columns (id, group_id and user_id) will be populated to link m users to n groups.

Challenge I:
How to save a single user belonging to multiple groups and have CakePHP add the correct records to the join table?

Sounds pretty basic, I know. And in fact, it’s not all that complicated. The problem: CakePHP’s documentation! For example, the chapter about saving data for the saveAssociated() method states: “Method used to save multiple model associations at once.”

Immediate questions that would need clarification:

  • What exactly does saving model associations mean? Does it mean that the related models are saved to the database, too? If so, what else does saveAll() do in addition?
  • In case neither of the data already exists in the database, does save also mean initially create?
  • Does this only work for hasOnehasMany and belongsTo relationships?
  • Does it work for hasAndBelongsToMany relationships, too?

The docs leave us guessing.

My finding: Whatever I tried to do, neither could I get saveAssociated() nor saveAll() to create and save a new user along with a couple of groups to my database. If there is a way, at least nobody in the Cake community seems to be aware of it [1][2].

When reading through the docs, you get the impression that your code should look somewhat like this:

If prior to creating the user you create a group and put a reference to it as in line 13 of the following code snippet, CakePHP correctly inserts the appropriate record into the join table. So this works:

In line 1 we fetch a group object for an existing group from the database and in line 14 we associate it with the to-be-created user. Saving the user does also insert a new record into the join table.

You might be tempted to just hand over an array of groups as in the following snippet (fetching it via find(‘all’) in line 1 and handing it to the new user object in line 14):

Turns out, CakePHP does not insert anything into the join table.

The complete association gets lost. To be clear, if you change line 14 from ‘Group’=>$groups to ‘Group’=>$groups[1] a record is inserted into the join table. If you hand over more than a single group, nothing gets inserted. Now, that’s what I call non-intuitive!

The correct solution is to hand over an array of just the group ids:

In lines 3-6 we create an array of group ids which we hand to the to-be-created user in line 20. CakePHP correctly inserts all the right records into the join table. Why the hell this is not clearly stated nor we find any example of such a frequent use case anywhere in the documentation remains the secret of the authors.

Challenge II:
Finding all users belonging to a specific group

Assume we’ve used the above to create a couple of groups and hundreds of users with each user belonging to more than one of these groups. Our join tables contains all records linking user IDs to group IDs. Next we want to get all users belonging to a specific group. Pretty common scenario, one would think. Again, not so in CakePHP.

Without bothering you with my trial-and-error learning curve, here is the second piece of totally non-intuitive code:

In order to find all Users belonging to a specific Group you actually do have to perform your find on the Group model and not on the User model. I found absolutely no way doing it the other way around. No matter how complex find parameters I handed over to the User model, I never got the result I was looking for. The response array for the above query looks something like this:

Challenge III:
Finding all users belonging to a specific group filtered on a property of the User model

While in written, the headline might sound crazy, there are actually very common use cases demanding for this sort of query:

  • Show me all users belonging to the admin group that have a status of “locked”.
  • Show me all posts with the tag “cakephp” authored by @ralf.

Again, I spare you my days of trial and error. Here is the correct find query:

Before this will work though, there is one more thing you have to do and again, I don’t understand why the documentation does not at all emphasize this in the utmost possible way: You have to make your Group model containable!

It’s as simple as putting public $actsAs = array(Containable’); into your model’s class declaration. If you don’t do this, CakePHP will not give you any error, but it will simply ignore the conditions you set for the related model. This is how my Group model ends up looking like:

Another one of my favorite non-intuitive CakePHP aspects: In the above example you have to make the Group model containable, while it actually is the User model that is contained. Note, that the User model does not have to act as containable but again, once you detach the containable behavior from the Group model, you will no longer be able to constrain on properties of the User model in this HABTM scenario.

Supporting pagination

If your app requires you to support pagination, you might feel tempted to extend the above query like so:

This will yield a Model “User” is not associated with model “3” error. The limit statement alone works, it’s the page that causes the error. The reason for this: page is syntactic sugar offered by CakePHP without a one-to-one representation in SQL. The framework doesn’t seem to recognize it when attached to contained models.

You can make use of paging by using SQL’s native syntax which is:

limit <start index>, <number of records>


'limit' => 5,
'page' => 5

would become

limit' => $page*$limit.', '.$limit

which would evaluate to

'limit' => '25, 5'

That way, you can page through the records of any contained model. Just one of those little CakePHP inconsistencies you should be aware of.

Challenge IV: Adding the user to an additional group

You might guess it by now: No, it’s not straight forward to have CakePHP insert an additional record to the join table.

While I don’t provide a code snippet for this, all you need to know is that CakePHP always deletes all existing records in the join table for a given model when you make a change. Though this is absolutely counter intuitive, you did understand correctly: Prior to inserting any new record for an existing user into the join table, CakePHP deletes all existing entries for this user.

In fact, this has been such a long standing and well known issue in the CakePHP community, that people started creating behaviors to work around this. Unfortunately, I could get none of these to work.

To solve Challenge IV you would have to do the following:

  • Find all groups the user belongs to.
  • Move just their IDs to a new array. (Remember Challenge I?)
  • Add the ID for the additional group the the array.
  • Save the user setting the Group field to the array of IDs.

If you do it in any other way, CakePHP will remove existing join table records without asking.

Closing remarks

I’m not a CakePHP professional.

That means, all of the above are my findings from days of trying and starting to hate the incomplete documentation. I don’t know, whether what I’ve outlined is the only way of doing what I wanted or if I even describe the best approach. I just did not get any better response from the community, nor could anybody point me to the “Cake way” of addressing these common requirements. All I’m sure of is, it works.

And while folks in the #CakePHP IRC channel more often than not accused me to RTFM, I couldn’t find any of the above clearly explained anywhere else.

Should you have any comments, please do make use of the comments feature. And don’t forget to follow me on Twitter. I’m @ralf there and always open for a constructive conversation.

Run Wireshark on Mac OS X Mountain Lion

19 Jul

Apple has removed X11 from the Mountain Lion distribution.

If you were running Wireshark on Lion and upgraded to Mountain Lion, or installed Wireshark on a fresh copy of Mountain Lion, it will no longer run.

You can bring it back by following these steps:

  1. Uninstall Wireshark by trashing the bundle from your ~/Applications folder.
  2. Download the XQuartz installer from and run it.
  3. Restart.
  4. Download the latest Wireshark version and install it. Some posts on Stack Overflow suggest only older versions would run under Mountain Lion, but I cannot confirm this.
  5. On first install, Wireshark might pop up a dialog asking “Where is X11?”. Browse to ~/Applications/Utilities and select the bundle.

That’s it. You’re done. If this has helped you, I’d appreciate winning you as a new follower @ralf on Twitter.

How to fix the Mac OS X Lion 10.7.3 wifi network issue

09 Feb

Today, for the first time, I got really angry with Apple.

I’ve been a longtime Apple fanboy. I love the company, its culture and stopped counting the Apple devices around my house when I reached a number higher than ten. :)

Today, while being in the office, I installed the Mac OS X Lion 10.7.3 update on my 1,8 GHz Intel Core i7 MacBook Air. It’s a 1.7 GB major update to the operating system offered by Software Update. I later manually reinstalled the combo update but it did not help at all.

After restarting, I found the MacBook Air entirely disconnected. It was unable to establish a WiFi connection to any wireless LAN, nor could it connect to a wired Ethernet network. Note that this did not only happen after waking Lion up from sleep, the MacBook Air did not connect to any network even after multiple reboots.

It entirely blew my schedule for my workday and I really believe, Apple should find a better guy to run their software quality assurance department AND establish an emergency response team which handles hotfixes the way Microsoft does. (The one area, where Microsoft really is much better than Apple.)

None of the ideas I found on the Apple forums helped. I was close to clean installing Lion and all my apps, which would have cost me another day.

Then I found the solution.

It seems as if the update messes with a system file that drives the built-in firewall rules: /etc/authorization.

A file by file comparison of system files from a working Lion install on a separate machine with the one on my MacBook Air revealed, that after the update an entire block of configuration directives was gone from /etc/authorization. I manually added the missing lines, rebooted and all network functionality came back. Problem solved.

If you happen to have the same problem, open /etc/authorization in your favorite editor. I used TextMate, so submitting sudo mate /etc/authorization on the console did the trick.

Somewhere near the end of that large XML file, find the following block:


Right after this block, make sure, you’ve got the following XML. If it is gone, the update has messed up your authorization file. Just copy and paste it back in and save.


This is it. Reboot and your system should be fine again. Please note, that I take no warranty whatsoever whether this will work for you or entirely ruin your system. :) It helped for me and I hope it’ll help you, too. If you like it, follow me on Twitter.

Feel free to leave your findings in the comments.

Hi there at Path, please get more responsive and fix your issues with Facebook.

11 Dec

Path 2.0, the smart journal app for iOS and Android phones has been praised a lot after its first complete reincarnation in late November.

I also agree with everything Erik says about the app over on TechCrunch, rewarding it with two “Flys” (watch the video for the complete review). With more than $11.0M in funding and a rejected $100+ Million acquisition offer from Google, the Path team must be pretty confident.

One thing though bothers me: As a company, Path seems to be relatively unresponsive if not even antisocial.

As an example, last week Path faced some serious service outages causing journal entries, photos and comments to vanish. No word about it on the very polished Path blog. Communication through the @Path Twitter account regarding the issue has been pretty limited, too.

It really gets worse when it comes to Path for iOS ongoing issues with cross-posting to Facebook (find a solution below). The wall on Path’ official Facebook page already reads like a complaint center. And not a single response from anybody over at Path. Twitter is full with users experiencing the same issues.

When I sent out a tweet about the broken Facebook integration last week, Danny Trinh, a designer working for Path immediately responded just to disappear again a few tweets later. Did he get muzzled by some official product marketing folks?

With Path playing in the field of social media and applications, the company should urgently become more responsive to its users. Running a Facebook page and a Twitter service account (@PathService) means you’ve got to make sure that your company embraces social at its core. Currently, from the outside it doesn’t feel like that with Path.

Now, if Path on your iPhone has stopped working with Facebook, here is what you should do:

  • Uninstall Path on your iPhone.
  • Uninstall Facebook on your iPhone.
  • Uninstall Facebook Messenger on your iPhone. (This is essential. If you only uninstall the main Facebook app, the fix will not work!)
  • Press and hold the Home and Power button until your iPhone reboots. This makes sure that iOS clears all cached data.
  • Reinstall the Facebook app. Do not launch the app, yet. Stay logged out.
  • Reinstall the Path app.
  • Visit your Facebook account from a PC/Mac (= no mobile browser). Go to Account Settings > Apps. Find the Path app and completely remove it from your Facebook account.
  • Launch the Path iPhone app and sign in.
  • Add Friends and chose Facebook as the source.
  • This should start the re-authorization with Facebook.
  • At any time, reinstall Facebook Messenger on your iPhone.

I hope this helps. And maybe somebody from Path will pick it up and cross-post it to all of the various outlets, that the company is so unresponsive with these days.

How to find people on Google+: A brief update on Google+ Counter

28 Aug

It’s only been some four weeks, since I started Google+ Counter. Initially, I just wanted to play with some  advanced web technologies, sort of a proof-of-concept project.

Even in my wildest dreams, I wouldn’t have expected it to become only half as popular, as it already has:

  • is now visited more than 75.000 times a day
  • We are crawling roughly 85.000 profiles, among them the most active Google+ users
  • Users have conducted more than 150.000 searches
  • The average time a user is spending on the site is 3:34 minutes, which is pretty high
  • More than two third of Google+ Counter visitors return to the site more than once
  • 57% of the visitors are based in the United States, closely followed by German, British, Spanish and French folks
  • Google+ Counter has been covered by many popular technology blogs, with The Next Web being one of the strongest referrers
  • Even the fine folks at Freakonomics seem to love it
  • Within the first eight hours after introducing interest tags, users have suggested more than 1.100 tags to be added to the system, most of which we’ve approved immediately (for details read on)
  • Even Bradley Horowitz, Google’s Vice President Product Management and main person in charge for Google+ in an email told me “We love your site”

No deep integration… yet

As the more technical part of my audience knows, there is yet no official Google+ API, which would allow a much deeper integration with the network. This means, Google+ Counter literally parses the raw HTML to do it’s magic. The absence of a programming interface is also the reason, why I cannot yet implement some pretty obvious features.

A prominent example being to circle a complete list with just one click. I’ve prepared the Google+ Counter code to be completely API ready. So once Google opens the doors for developers, expect Google+ Counter to offer some cool new stuff within hours.

If you are a user of the very popular list feature, you might have wondered why Google+ Counter does not yet offer sign-up and sign-in functionality but instead uses list-related passwords. That decision is actually also driven by the lack of an official Google+ API. If you’re like me, chances are you already have way too many logins and accounts for various outlets on the Web.

I deliberately did not want to add an additional one to your list. It is pretty safe to expect, that Google will at some stage provide an OAuth like delegated login mechanism for third party services. Given that Google+ Counters services are deeply tied to it anyway, I rather want to wait and see what Google is going to offer.

Hopefully, it will create a greater user experience than adding anything proprietary to the site.

It’s not about statistics

My initial idea was grouped around numbers, most followed, top growing and top losing users.

However, I soon changed the direction. Many discussion on Google+ have proven, that those numbers really don’t mean anything. The most followed – or, to say it the Google way – most circled user doesn’t necessarily have to be very interesting. For example, Mark Zuckerberg, who still leads many charts, has not yet said a single word on Google+.

And while the Most Famous Ladies page is still the fourth most visited on Google+ Counter, I’m not actively working a lot on the Halls of Fame, which constituted the main part of the site, when it launched.

Instead, it’s about discovery

There are now three main areas, Google+ Counter focuses on:

  • Helping you finding interesting new folks on Google+
  • Providing means to share lists of profiles, e.g. for a specific interest group, event participants, company etc.
  • Promoting your profile and making it more discoverable

Everything I added to the site during the last two weeks, drives one of the above objectives.

Here’s a brief rundown of the stuff rolled out since my last post:

  • Search: Pretty obvious one, but not that easy to implement. Initially, I planned to separate profile and list search, but ended up unifying everything. The search feature is not yet incorporating the recently added interest tags, but will soon.
  • Open lists: I planned to support open lists – everybody can join a list – from day one, but had a delay in implementing it. There are now user curated lists comprising more than 2000 selected profiles!
  • Improved algorithm for most popular lists: Initially, I planned the lists feature to purely allow people to share profiles with their social graph. I never really thought of a “Most Popular Lists” page for Google+ Counter. I soon found out, that this was exactly, why many users came to the site the first place! In a first attempt, Popular Lists simply ordered the lists by member count. This opened the doors for “list spam”, people were starting to add as many profiles as possible, just to rank high on the landing page. I subsequently fine tuned the algorithm that is tagging lists as popular. It’s now a vector calculated – among other factors – from list views, member count, follower count per member, exposed list owner/disclosed list owner, relationship between list owner and profiles on the list.
  • Bug fixing: Though I carefully review all changes prior to pushing them to the production servers, given the many changes and enhancements, there were many minor bugs. My number one source for scouting those are my users. I don’t have a testing department. It’s really just me. So I’m glad for every email I get that helps improving the overall quality of the service.

Interest Tagging: The most important addition since launch

Inspired by a post from Robert Scoble which, unfortunately, I cannot find anymore, I’ve started to work on what will probably be the most important addition to the Google+ Counter features: Interest Tagging.

In a nutshell, interest tagging allows you to attach tags to your profile, which will (soon) facilitate a powerful new search capability. Think about curating a list of your hobbies, interests, passion or profession. Here is how it looks like (click to enlarge):

When submitting your profile to our index, you can now add up to seven interests from our growing database of tags. You can add more at any time later. If you have already been in the Google+ Counter index before, the procedure is exactly the same, just resubmit your profile along with some tags that best describe what you want to be associated with. We’ll attach the new tags to your profile.

While search on Google+ itself is already pretty good, I believe that there is a huge difference between purely algorithmic search and letting users tag their profiles. Actually, I make for a very good example: One of my long-time hobbies is close-up-magic. However, I never ever discussed it on Google+. It’s also not part of my public profile. It’s not that I’m hiding it, it’s just that I focus on the more technical part of my persona on Google+. However, I’d love to get in touch with other “magicians”. Adding interest tags will make it easy and simple for others to find me for keywords, that I have chosen.

When designing the feature, we I one particular challenge: I wanted to make absolutely sure, that all submissions are genuinely been made by the person behind the respective profile. Otherwise, it wouldn’t have taken long until we would have seen “Adult Movies” attached to “Barack Obama” or even worse.

Without an official Google+ API, there was just no easy way, to programmatically check authenticity.

Therefore, I’ve introduced a two step process: Once you attach tags to your profile, those requests are enqueued within our system. You are then asked to add a unique verification link to your Google+ profile. Obviously, this second step can only be concluded by the person who owns – or at least has admin level access – to the Google+ profile in question. Our crawlers check for the existence of the verification link within 24 hours after the tag request has been received. You can also trigger ad hoc verification by visiting the verification link at any time (even beyond the 24 hour period).

This is very similar to the well known sign-up > email confirmation link > click confirmation link scenario, it just uses Google+ as the verification source.

Once verified, you can remove the link from your profile.

I’m very happy to report that more than 1.200 users have completed verification within the first 12 hours since the feature launched earlier tonight.

What’s next

Here is the list of stuff which ranks high on my list for the days ahead:

  • Incorporating interest tags into search: Personally, this is my favorite one and I’m really looking forward to start coding. I envision a search where while you keep adding and removing interests (in a very graphical, drag-and droppy way), relevant profiles dynamically get added and removed from the results list. This will likely make for a great resource to find people with similar interests.
  • Incorporating interest tags into the rest of the site: Profiles are everywhere on Google+ Counter, from the Halls of Fame to the user curated lists. Interest tags are not yet displayed anywhere. This is an easy one, so expect to see it soon.
  • Provide bulk import and export for lists: Starting a list is easy with the current, ajax-ified user interface. However, sometimes you already have a large Circle inside Google+ and just want to transfer it into a list. No API, no elegant way, yet. Google already allows you to export your data into .csv files. I’m working on an importer, which will make bulk adding members to lists dramatically easier.
  • Natively support profile suggestions: Today, if you decide against an open list and want to remain in charge, chances are, you get swamped via Google+ with requests from others to be added to your list. Since the launch of the lists feature, I planned to create a more integrated experience. The idea is, that visitors can submit an “Add me to your list” request via Google+ Counter. List owners will get a dashboard that easily allows them to accept or reject.
  • List statistics: Internally, Google+ Counter already counts various factors about the visitors of user curated lists. I’m planning to expose some of the data to list owners, making it more fun for them to come back and see how their lists are doing.

Supporting the project

A few days ago, somebody sent an email to, asking the tech support department for help.

This was funny in many ways. For once, there really is no support department. Google+ Counter is entirely done by me. From infrastructure to design. From prototyping to coding. Frontend and backend and Customer Service. And I love it. For developers, there’s really nothing more rewarding than experiencing users loving your creation.

I have been asked how one can support the project.

While I resist the temptation to put ads on the site, I obviously do invest a lot of time and given the current growth, scalable hosting and smooth operation becomes a greater issue. I’ve therefore added two ways for you to support Google+ Counter:

  • Featured users: Promote your profile, brand or services through Google+ Counter. Just head over to and check out the available options.
  • Donations: If you want to support Google+ Counter, but don’t want to do it publicly, I accept donations via PayPal. Every single dollar is welcomed.

Wow, that was a lengthy post…

I once again would like to thank everybody for feedback, ideas and suggestions. It’s you guys, motivating me to do what I do.

If you want to get in touch, find me on Google+ or Twitter.

© Copyright 2017 by Ralf Rottmann.