Making Money isn’t Enough: Considerations for a digital company in 2017

I’m starting a new company, with Steve Fisher. I can’t reveal just yet the first product we’re building, but don’t worry, there’ll be more on that in the not-so-distant future. This post is focused on deeper considerations about the company we’re building and why those matter.

In 2015, at The Design & Content Conference, I watched Sara Wachter-Boettcher give a career-altering talk on designing for kindness.

In 2016, this theme was built upon at the same conference by virtually every speaker, but I want to call out two in particular who’ve stuck with me:

Anil Dash’s talk “Storytellers” — particularly the unintended consequences of design decisions, and accountability at a personal and organizational level for them. The Alexa Story, starting at 3:45 is such an excellent illustration.

Ron Bronson’s talk “Designing for Empathy: Context Matters”, largely about the idea of recognizing one’s own blinders and working through them to discover other context, other uses. The story about Pokemon Go/Ingress starting at 6:35 is solid example.

These three talks in particular have informed a pretty massive shift in my approaches to: code, operations, design, business, etc. Positive shifts that also come with a set of concerns that I hadn’t been as focused on.

Concerns we will address:

Geophysical Portability

We’re going to have customers, at least to start, across North America. I also recognize that where your data resides has become more important than ever. For many companies and organizations, where their data is stored, and the locations of libraries they use matters. In BC (Canada!), government entities aren’t allowed to use US-soil services. Governments will use our product, and so we need to ensure that every piece of code we run, every piece of data we store resides in their country. So, from the get-go, we need to write software that is portable and works with third-party-hosted libraries, tools or services that are similarly portable. It’s an interesting and exciting constraint.

Our Privilege

We’re two middle-aged, middle-class white dudes from Canada starting a tech company that is mostly self-funded. The privilege in that is staggering. Basically, we’re walking around with blinders on when we think about the product, the company. We need to do the work to see past our own biases and blinders. First step for us is to engage with a set of advisors who are significantly more diverse than we are, to provide alternative insights and voices in our planning. AND, most importantly, pay these advisors fairly for their time.

Protecting the Vulnerable

The product we’re building exists to help our customers. But it only took a few minutes to think of how someone could abuse our product to help them advance their less-wholesome objectives. Unintentionally so, but it would be easy to use this tool for bad. It is our responsibility to build in constraints, restrictions, community, etc that could prevent this. But, how far does that go? Not everyone is going to do things I like or agree with — but they’re not necessarily bad. Nothing is politically neutral, but do we want to have “neutral” software, run by an opinionated company? We’ve seen first hand the damage that can cause with companies like Twitter. We need to dig in and discover what tools, features, guidelines, legalese we can, and should, build into the product and company. It should be part of our job to build tech that protects the most vulnerable.

Data Security

We will be tracking lots of activity within our product. This is for growth targets, sales, insights and customer support. All good reasons. And we will require user accounts. For most use-cases that’s not an issue, but I can’t guarantee that’s true for everyone who might see a use of our product.

Some guidelines we’re working from:

  1. Data security must be baked-in at every level.
  2. We hold our customers’ data in trust, and data should only be used for our collective greater good
  3. Our customers’ data remain theirs, and they should be able to remove it as needed.
  4. Data available online is vulnerable. It is our duty to both minimize that vulnerability and to act responsibility if it is ever targeted.
  5. Privacy doesn’t mean the same thing to everyone. We must support various levels.

Tools & Software

We’re building the first version of this software on our own, but hope to be able to hire engineering staff quickly. Cutting edge is less important than broadly known — for both hireability and learnability. Our team will leverage, and contribute back to, existing and potentially new open source projects. Where possible, we will prefer open-source tools over proprietary (particularly given our concerns about geophysical location). We’re building a web-app first, but I expect we’ll soon see use for both a mobile-native app for at least parts, and, perhaps less expectedly, a desktop app.

HR

We need things such as revenue, first, but I’ve learned from my previous companies that hiring happens faster than you’d expect, and having values and policy in place is essential.

Some things we’re thinking about:

  1. Both Steve and I have dogs, who we want to have around the office.
  2. We have kids, and we like to see and hang out with them.
  3. We like to travel.
  4. Be able to offer valuable perks like full parental leave, childcare and flexible hours.
  5. Encourage and support community involvement and personal passions.
  6. Collaboration and conversation is better than competition and direction.

But, I don’t want an office full of perks and free things. There’s some middle ground of “recognize your staff have lives and accommodate fully” and “your staff should be treated like adults” Be passionate, stay passionate, engage and encourage passion, but leave work at work. A few years ago, I wrote a piece about finding other paths to success (“A million dollars isn’t cool, you know what’s cool?”), and the ethos behind that still resonates with me. I want to build that into this new company.

Utility

I’m confident we’ve identified a need and a niche that we can work in, but there’s something to the axiom “the greatest minds of my generation are figuring out how to make people click ads”. There are real problems that people can, and are solving. Teams at Code for America & the USDS are solving real problems, for real people, using tech. We need to make sure we’re contributing too — if not directly through our product, through our expertise, our staff, our community.

A Company for Good

Starting a company is hard. Most fail quickly, so adding additional constraints, or targets could feel like a fool’s game. I’d like a company that structurally contributes back to our community (see HR, above). And I’d like a company that isn’t just building a product and selling it. Existing isn’t enough. We need to put our effort, success, and privilege towards something more. We’re not totally sure where we’ll draw the line, but it’s something to figure out. It’s too easy to leave these decisions to later, and then later never comes. We need to start these as we start everything else.


These are not in order of importance and jostle from day-to-day in my head for position. As we move forward I will to write more about how we embrace these challenges and opportunities How each point becomes not only part of the product, but of our new company, and more part of ourselves as partners in this. And finally to talk openly about where compromises were made, where things are left to do, and how we’re changing.

“All we have to do is go to first principles and what you all know every single time you ship something, every single time you put something out in the world. You know what it looks like when it counts. You know what it looks like when you care about it, and all we have to prioritize, one simple thing, that the story we tell includes the most vulnerable people. If we do that much then we can be worthy of all the things that people say about the transformative potential that technology has on the world.”
Anil Dash at The Design & Content Conference

MacOS Sierra: Solving an external drive mounted as read-only after install

When I installed MacOS Sierra, my trusty Drobo, who’d been flawless through so many OS updates, suddenly stopped working. Or, more particularly, suddenly was no longer writable. I just solved this, and, as I was unable to find any of this online, thought I’d write it up in case anyone else has this issue. Particularly as Drobo’s support suggested:

If you’re like me, you have no media capable of holding everything in your Drobo.

Of note: My Drobo is formatted HFS+. If you’ve got an external NTFS or FAT drive, YMMV.

The cause of this change is that in MacOS Sierra, the /Volumes folder is no longer writable by default. So, to change, I needed to do the following:

First remount the drive as writable:

sudo mount -u -w /Volumes/YourDriveName

(the -u means you’re modifying an already-mounted filesystem; -w makes it writeable).

I could now write to it if I sudo vi a text file. But — neither TimeMachine nor (most importantly for me) Lightroom could write to it at this point. It turns out that ownership of everything in the Volumes folder changed too, away from root:wheel. So, next step:

sudo chown -R root:wheel /Volumes/YourDriveName

(the -R is recursive, so all files. root:wheel is the owner & group — you could make this your own user, but I chose to make it match other “system” files here.

Lastly, check the read/write privileges. For me, everything in the Drobo was now -r--r--r-- (read only). Which just won’t do at all. I wanted everyone to read, and owner and group to be able to write. So, next:

sudo chmod -R 774

This changes permission so that the owner & the group can read, write, execute, and everyone else can read — which is what I wanted for this drive (in particular, group-writable was important for Lightroom, while TimeMachine seemed perfectly happy to start working with only the owner having write permissions).

So — this may have been a particular-to-me issue, but given that I have many, many TB of personal photos, videos — and TimeMachine backups on my Drobo, I’m certainly glad I took the time to solve this.

What’s left to do

So, I can read and write to my drive — but I still can’t figure out how to get the drive to show up in the list of Devices in the finder. I can live with this, but it would be nicer if it just “appeared”. If you know how to solve that (and no, clicking the “show external drive” off and on in preferences doesn’t work), let me know!

Better time-leverage

I’ve started using Calendly to help manage my calendar & appointments. Right now, I’m using it bare-bones at the moment, to see if it works for me, because of a singular problem with all of these calendaring-automation tools that I haven’t figured out yet:

It feels dangerously self-important to ask people to schedule their own appointments with me.

I’ve always prided myself on my “human connection” skills within the tech industry, and the UI for all of the various calendaring apps still, in my opinion, feel like bots, not like assistants. Additionally, many feel like they want me to run my calendar in their UI, not work alongside my existing workflow.

Anyway — that’s just really an aside about the point of this post. Being a one-man-shop freelancer/consultant, time management is super-important. I’m also hyper-aware of how easy it is for a single meeting to run roughshod over an entire day’s worth of tasks, depending on its cognitive or emotional load. And so, when I book a meeting, I often then look to be most efficient by having other, adjacent meetings — a day of meetings feels productive. A day with a meeting, then an hour of heads-down time, then another meeting often feels like it was totally wasted.

Calendly, which offers a “buffer” around meetings, which is great — but doesn’t appear to offer any location data — which is important to me because I often (and indeed, usually prefer) in-person meetings. Which involves travel. So, if when booking an appointment, Calendly could ask for a where, then use my office location to calculate travel times, add that to *my* calendar time and buffer around that meeting, it would become vastly more useful.

But once I’m in a location, it would be great if I could schedule other meetings nearby:

  • On a hyper-local level, if I’m having a coffee meeting in Gastown, it would awesome if Calendly connected to my CRM of choice, and see which contacts are near my scheduled meeting (ie, also in Gastown), that I haven’t seen in a while, and send me a note letting me know it might be a good idea to try to connect with them.
  • On a regional/travel level, if I’ve got an upcoming calendar trip to, say, Toronto, check my CRM to see who might be available while I’m there to meet with, and suggest it to me. (next level: find people I don’t know, but suggest I should try to meet them)
  • aside: this is a problem with calendaring I don’t have a good answer for: When I’m away, I generally mark that time in my calendar as “busy”, because I don’t want anyone here to book time with me. but, I might totally want to book time with people there. I want a “busy-in-location” marker, or a “location change” marker to connote travel vs just being busy.

I recognize there’s a lot of data mining/analysis going on there. And, most likely, that’s a service that shouldn’t be provided by Calendly, but rather integrate via API (although, I do think not supporting location/travel time is a big problem for Calendly at the moment). And possibly there’s already services that sit between these data-stores to do just this task that I’m unaware of. And that’s also, personally, an area of interest — software tools that work with existing data-stores for people to help tie them together in interesting ways, and surface helpful things for you, so I think a lot about pulling data out of silos and tying it together.

Thinking about Payments

I’ve been doing a lot of thinking about how awkward, broken and balkanized payments are of late – I went as far as to build a few prototypes of slightly different takes…but time & money were a concern and left them alone. But a few recent things made me revisit this:

  • A few articles about the new, smaller credit-card skimmers now appearing.
  • A frustrating experience waiting for an available debit machine to pay at a restaurant
  • A frustrating experience waiting for a debit machine to dial backup lines and failing multiple times.
  • Experience setting up a Stripe account, a Square account & a Beanstream account for clients & friends.

There’s a common thread through many of these experiences which were:

  • overly dependent on potentially unknown third-parties & intermediaries
  • Handing control to an unknown person
  • slowness
  • physical machines that aren’t mine.
  • trust issues.

And so, here’s my point about payments, and where we should aim to move to (at least in the connected, western world – where my experience is. Call it my “manifesto for modern payments“, to be grandiose:

  1. Physical cards are dangerous. All hardware is on a slower upgrade cycle than software. This means that security breaches are slower to be resolved. Also, a physical card must be read by a physical device, which opens it to tampering. Physical payment mechanisms (apart from cash), should be avoided.
  2. Payment should be on my terms. The act of waiting for a machine, paying while the server hovers over you, and then handing it back is awkward and slow: It slows table turn over at restaurants, you’re touching something 100s of others have, it creates tension if around money availability, it doesn’t always work. Also, why always only pay at the end of a meal? Why not upfront? Or During? Or, even, a few hours later to make sure my decision to eat those funky-smelling oysters didn’t cause a hospital visit? Or to prevent dine-and-dashers because they’ve already “registered”
  3. I should choose who I want to pay with. Every different store uses a different merchant provider, with different hardware. None are identical. All, in my experience, are poorly designed, UI-wise (part of this is simply the numerous minor variants, which is detrimental to all the others by their “nearness”, which can lead to muscle-memory errors). We should reverse this relationship to merchant providers. I should pay via my merchant provider of choice. Paypal is already nearly an example of this – I create a Paypal account as a customer, hook it up to my personal banking info, and use it where I can. Where the problem lies is that the merchant ALSO needs a Paypal account. & this needs to change. WHO I pay with should be my choice, who you get paid by should be yours. Like your bank vs my bank.
  4. I should be able to automate this. For many things, payments are standard, predictable: I’m going to get a coffee every day. My lunch at the same restaurant is going to be similar. There should be a way for how I pay to learn what I pay, and offer to automate that as I go. So next time, I don’t even need to pull out my phone to pay. It just happens in the background – perhaps when I order, or when I leave, or batched, later on. An invisible transaction, but trackable through reporting.
  5. I should be able to geo-fence/technology-fence rules & limits. I use 1 card online. Another at “questionable” places, another is my “normal” card. But if I had a system that knew an online payment from an offline one, knew that I shop here regularly, or this place is new, that could ask for an immediate confirmation when I’m somewhere new, or suddenly travelled 2000 km in 10 minutes, or whatnot – that adds security. And this fencing should be simple, and again, personalized.

There’s likely others. I’ve spent a fair bit of time toiling away on items 1,3 & 4. Item 3 occurred to me only after I got nervous when a local convenience store got a new debit machine from a company I didn’t recognize, with a merchant provider listed in a language I didn’t read, and the payment took 3 (load) dial-attempts before it connected. & likely I haven’t thought this all through. But – here’s the thing. With current technology & connectivity, all of this is already possible. I should be able to have this right now. So where is it? Let’s build it.

Apps I want to exist

Here’s a couple of app/service ideas that I don’t know if they do exist (if they do, my google-fu failed me, that I think *should* exist. But I’m unlikely to write them in the next 2 months, so, please feel free!

  1. Sigfile-scanner: I want to be able to select/copy the signature of any email someone sends me and have it auto-scanned & filtered into a consumable vcard/contact info. This should work in Mac Mail, and in gMail on the web. Ideally it IDs at least name, phone, email, URL & street address, but extra stuff would be cool. I know there’s alot of variance in how this info is presented, but the info itself feels somewhat standard.
  2. Warranty-info-manager: I want a centralized service to maintain all my warranty info. For anything I buy. Ideally, all I should have to do is perhaps scan a barcode & enter a purchase date (default date should be when I scan it), maybe submit the serial No (or better yet – translate a picture of the serial no into text). It should then be able to retrieve all the relevant warranty info for that product – and tell me in plain english things like when it expires, if it’s renewable/extendable, contact #s/addresses, etc. This could likely be crowdsourced, API’d so that as other people add their products, the common info gets shared, or companies could easily submit their warranty info automatically. I should be able to get reminders about when things are expiring well in advance too. Bonus points for being able to store/auto-submit registration info for those things that require registration (although this gets into the hazy what’s too much information to store about a single person zone).

 

WherePost: update with new features & data!

I spent some time over the past couple of days pushing out a few minor updates to http://wherepost.ca. Here’s the rundown:

  • I imported, and now scrape, the KML file from Matthew Hoy’s mailbox-mapping project. This doubled the size of Where Post, and merges work doing the same thing.
  • I finally got around to adding in a “name” field, per David Eaves’ request of oh-so-long-ago. When you add a mailbox, if you enter a name or twitter handle (neither is linked anywhere), it should set a cookie that’ll remember who you are for next time.
  • I added in some social-sharing buttons. But because I actually dislike the way these look in general, and like the minimal interface WherePost presents, particularly on mobile, these currently only show on the “About” pages. I was thinking I should add these to the “add mailbox” results, but am holding off for now. I would appreciate it if you went ahead and used these though!
  • Caching: Most result-sets are now cached for an hour, although adding a  new mailbox will reset that cache. This is to account for the odd times when it looks like a bot is scraping the site and causes actual load.
  • Post Offices: Because the GooglePlaces API returns Yellow-pages data, whom I don’t like, and in a way that was pretty broken (you’d always get duplicates, for english/french names of the same place, even if the data was identical, plus it’d overlay a link to the Yellow Pages), I’ve removed this, and added in the ability to specify you’re adding a Post Office OR a Mailbox when adding a new location.
  • Feeds! It felt wrong to be pulling in all this data, but not providing an easy way to get it all back out for you to remix however you wanted. So you can now get all the data WherePost has in 2 formats: JSON & KML. To do this, simply go to: http://wherepost.ca/load. This page has a few query-string params you can pass in:
    1)FORMAT: you can pass ?format=kml to get the feed in KML format – JSON is the default.
    2)RECORDS: you can pass ?records=X, where X is an integer to limit the resultset. By default, WherePost will return up to 10,000 records.
    3)SW & NE: to limit your results to a particular region, pass sw & ne coordinate bounds. So, for instance, ?NE=49.350405349378214,-122.72854022578122&SW=49.16644496927114,-123.2606904943359 will *roughly* return all the results in Vancouver

I think that’s all the updates. Let me know if you run into any difficulties!

An Adaptive Image Technique: Thinking out loud

I’ve been playing a lot with responsive layouts, and the inevitable bugbear of adaptive images for responsive designs. Ethan Marcotte’s Fluid Images is what I’ve been playing with most, particularly via Matt Wilcox’s Adaptive Images script, and dreaming of the <picture> solution proposed by Mat Marquis. But and so, I’ve been doodling and fooling around with some ways of doing this, and have now come up with something that I like. I’m worried it’s actually terrible, but I’ve played with it enough that I’d like some feedback now.

I’ve come up with a a CSS3-only solution to adaptive images. For those who just want to see the example, go ahead. You can view source for all the details. The 3-col/2-col content is purely presentational.

To do this technique, I have an image tag, like so:

<img id="image1" src="/transparent.png" data-src="/fishing.jpg" alt="Man fishing on a log" />

That displays a 1 x 1 px transparent image. The data-src attribute is there to show the “true” source. In the CSS, I make use of the background-image property to provide media-query-attentive backgrounds & sizing.

The default declaration is:

#image1 {
background: url('/images/responsive/fishing-small.jpg') top center no-repeat;
width:100%;
max-height:67px;}

This is the “small device” version of the image. using media queries, I can also load in an hd/retina version for those devices:

@media only screen and (-webkit-device-pixel-ratio:2) {
#image1 {
background-image: url('/images/responsive/fishing-small.jpg')
}
}

I also can provide a mid-size version, a mid-size hd/retina version and a desktop version (or an infinite number of variations based on media queries).

@media only screen and (-webkit-device-pixel-ratio:2) and (min-width: 600px) {
#image1 {
background-image: url('/images/responsive/fishing-mid-retina.jpg')
}
}

To provide some fallback for IE users, I’ve included an IE-specific style:

<!--[if lt IE 9]>
<style>
#image1 {background-image: url('/images/responsive/fishing');width:100%;}
</style>
endif]-->

I like to start “mobile first” and use media-queries to “grow out” from there, but I could just as easily start with the largest version and work in – in which case the IE workaround wouldn’t be necessary.

Some of my thoughts on this technique

  • I like that this technique is really easy, really light-weight and doesn’t require any javascript or php.
  • The fact that I’m using a 1×1 transparent png fills me with the howling fantods as I remember spacer gifs.
  • Reusing a single tiny image all over the place has negligible bandwidth effects, but to be fair, I am making an “unnecessary” request to get it each time.
  • The data-src attribute is there to help with this. By default, things like Pinterest and Google Images could no longer grab your images with this technique (Whether that’s a good or bad thing, I leave to you). By leveraging a .htaccess rule, you could load in the data-src attribute as src for the pinterest or various bot user-agents.
  • This system could work pretty easily with automated CMS systems: using regex to replace a src attribute with a data-src attribute and injecting the 1×1 & an id is trivial, as is auto-generating some CSS to handle the variations of the image for each media-query break-point – but that’s definitely more work than not doing anything on the CMS -side and doing all replacements in JS or PHP on the front-end.
  • I like that I can easily update/replace any 1 image in the set without updating html source anywhere.
  • This feels “too easy” to me. All the other solutions I’ve found use some sort of scripting, be it PHP or JavaScript. That fact that there’s nothing to post to github here makes me feel like I’m doing something wrong.
  • Using background-image on images means that users can’t as easily download your image – right-click on an image and most browsers don’t give the option to “download background image” like they do on other elements.
  • I worry that this is doing something unexpected for accessibility – but mostly it should be ok, I think, as there’s an alt attribute, and will still work fine with a longdesc attribute.

I’m hoping for feedback on this for the world at large – as I said, I’m thinking out loud about this – it seems like a workable solution, so your feedback, thoughts, critique would be very much appreciated before I go do anything silly like use this in a client’s project.

Clearing line-breaks in SQL Server text fields

I was recently doing a data export for a client that included a bunch of ostensibly plain-text data fields that include any number of tabs, carriage returns and line feeds that were mucking up the csv file. And oh, how I fought that data to make it look nice. It was many, many hours past when it should have occurred to me that I finally thought to clean up the fields on export, NOT during import. Such is the problem with tunnel visions.

Anyway, for future reference, and easy way to clean up fields to simply replace the offending characters, using something along the following lines:


SELECT replace([field],char(10),'[replacementchar]') FROM [table]

So, I wanted to replace line feeds (char(10)) and carriage returns (char(13)), so I doubled that to:


SELECT replace(replace([field],char(10),' '),char(13),' ') FROM [table]

And it all worked beautifully. I’m writing & storing it here on the hopes if I run into this again, it’ll be googleable.

I’m in the forest, searching for the shore

Corkscrew tree
Searching for the way through

I’m percolating. Gestating. Mulling. Procrastinating. Whatever you want to call it, I’ve been in this mode for the better part of a week now. This happens regularly to me – something triggers my subconscious and it starts to take up and more and more mental resources. When I get phases like this, I’m sort of hopeless: I can’t remember anything, I’m  as distractable as – SQUIRREL! – my production nosedives. I almost never seem to get a warning that this is about to happen, just suddenly there I am – feeling like I’ve only got half brain-power. Typos go up. I’ll find myself staring off into space for who knows how long.

There’s a plus side to this. When I get like this it’s because I’m figuring something out. It sounds strange to say I don’t know what it is I’m figuring out, but historically, whatever pops into my head on the flip-side is fully formed, ready for me to copy down. I used to write papers this way – wander the streets aimlessly for a day or two, come home, sit down & type for a couple of hours before school, come home with an A paper shortly. Prior to agreeing to have kids I did this. When I wrote the first scheme for the original Pencilcase CMS, back in 1999, I couldn’t work for a week. Then in 1 sitting, I wrote the first version of the CMS over about 14 hours, with little to no edits.

So what have I been thinking about lately?  What’s going on back there? Well, there’s a bunch of stuff going on that are viable candidates for taking over my brain:

  • Moving: We might move away. We might buy  a new place in Vancouver. We definitely want to spend some time away – 3,6,9,12 months, who knows. The plan for that needs to resolve itself.
  • Community: I’ve been thinking a lot about the cross-sections of digital and real-world communities. My experience as a terribly shy human vs. a fairly chatty avatar. How to correlate the two, how to bridge the various communities I participate in on- and off-line.
  • CMS: The current world of CMS’s don’t really match the type of tools many of my clients need. Nor do the social CRMs. Nor does the issue-tracking software we and they all use. But they all form part of a solution to a real issue. And I feel like I’m on the hunt for a lightweight suite to handle lots of basic needs.
  • mobile & responsive design: Having now built a couple of responsive sites, in addition to 2 distinct “mobile” sites in the last few months, there’s a path there that I haven’t quite found. This is closely related to the CMS problem: solving the issue of ongoing site existence & emerging break points & client-control of content and so on.

 

So I’m in the forest, I’m looking for the path. I keep catching glimpses of the shore out there, where the horizon is clear and present, but I’m not there yet & it’s frustrating.

WherePost: now even more useful!

Since I launched Where Post? on Friday morning, the response has been pretty gratifying. My thanks to David Eaves for his nice post about Where Post? this morning. I launched the app with a total of 28 mailboxes and 1 post office. Since then, 29 contributors have added in another 400-odd mailboxes and about 20 post offices. (NB: ‘contributors’ are identified currently via a combination of a cookie & IP Address – so it’s not exact, but close enough).

I’m please to announce a very useful addition: Every post office in the Google Maps database, everywhere, pulled in from the Google Places API. I had noticed while adding post offices that there was often an envelope icon already in the map where I wanted to add a post office. After some digging this afternoon, I was able to pull in the places API to just get all the places that identify as a post office.

There’s a few oddities to figure out:

  1. Often each post office is listed 2 or 3 times at least in Canada: The french name & english name appear to be 2 places, and sometimes the post office in english, the post office in french and the store containing the post office are all listed. Odd, and I haven’t yet figured a way to filter this, but still pretty nice.
  2. I have a rate limit of 100,000 queries a day. Given that each time you see the “loading mailboxes” message there’s a query to Google, there’s a distinct possibility I’ll reach that. For now not a worry, but definitely a scaling/caching issue to think about in the future.
  3. Integrating with the “nearest” function. Currently, the “nearest” mailbox is simply pulled from an SQL query – which means that post offices, coming in from Google, are ignored. There’s likely a way to merge the two, but nothing’s coming to mind at the moment.

As always, if you have any suggestions, comments or anything else, please let me know!