84 stories
1 follower

“lives in a sort of purgatory”

1 Share

Brad Frost:

A front-end designer ... lives in a sort of purgatory between worlds:

  • They understand UX principles and best practices, but may not spend their time conducting research, creating flows, and planning scenarios
  • They have a keen eye for aesthetics, but may not spend their time pouring over font pairings, comparing color palettes, or creating illustrations and icons.
  • They can write JavaScript, but may not spend their time writing application-level code, wiring up middleware, or debugging.
  • They understand the importance of backend development, but may not spend their time writing backend logic, spinning up servers, load testing, etc.

A front-end developer is aware.

Direct Link to ArticlePermalink

“lives in a sort of purgatory” is a post from CSS-Tricks

Read the whole story
3 days ago
Share this story

Why we choose profit

1 Share

We’re outspoken about running a profitable company in an industry that so often eschews profits for potential. So why? People ask us why all the time. Why choose profit?

So I thought I’d detail some of the reasons why we designed Basecamp, our company, to be profitable as quickly and consistently as possible. And 17 years into it, we’ve been profitable for 17 years straight. Being profitable is a feature of our company (companies are products too).

To set some context, since we launched the company in 1999, our revenues have grown every year (2016 being our best year yet), and for years we’ve been generating millions in annual profits. We currently have just 51 people at the company (the most people we’ve ever had).

Reasons, in no particular order

A non-comprehensive list, but a complete-enough one:

No one ever went broke taking a profit. Unlike companies that reinvest all or most of the money back into the company every year, we take money (profit) out every year in the form of distributions (we’re an LLC). This means every year we take risk out of the company. Companies that keep reinvesting keep adding risk to their companies. If the shit hits the fan one day, and the company ceases to exist, we’ll have enjoyed the upside as we went, vs. never if all the reinvestment didn’t lead to an outcome which is greater than the annual distributions. And since most companies die smaller than they were at their peak, the chance the unrealized future will be better than the certain now is slim. Basically, we work to enjoy the now we have, not the future we don’t. Fuck deferred living.

Profit buys you time and flexibility. Profit is the ultimate flexibility because it buys you the ultimate luxury: time. As long as you remain profitable, you can go in any direction you want and take as much time as you need. But if you can’t generate enough of your own cash through operations, and you have to go outside to borrow or sell off pieces of your company to generate the cash you need to continue, then the ones you owe are the ones who own your time. If someone else owns your time, you aren’t free. And if you aren’t free, you can’t be flexible. We value flexibility above almost anything else.

Profit is true vertical integration. Cash is an unusually special raw material because you can transform it into anything (cash is basically like a stem cell). And when you make your own, you can use it any way you want, no strings attached. You can take it all home. You can give it all to your employees. You can put it back into the business. You can do stupid shit with it since it’s your shit. But when you have to source raw materials from a very limited number of suppliers (investors), the money comes with all sorts of strings attached. Money with strings attached isn’t really yours, it’s someone else’s property that you’re renting on their terms. We prefer to own.

We don’t care about valuation. If generating revenue can hurt your valuation, making a profit can have an even more deleterious effect. But we couldn’t give a shit. We don’t know what we’re worth and we don’t care. The fewer things you have to worry about that don’t affect your day to day, your customer’s experience, and the actual operating of your business, the more energy you can put into the business itself. We spend zero hours a year on valuation and fake-number nonsense. I’ve seen far too many founders spend countless hours pitching for money, marking up term sheets with lawyers, fixating on cap tables, sweating over other people’s make-or-break decisions, etc. Fuck all that. What an enormous waste of time and energy.

Profit is the ultimate shield against bullshit. When you’re profitable you don’t have to play games, succumb to substitutional metrics, cross your fingers, or grovel for other people’s money, validation, or acceptance. You simply make more money than you spend — and run a fundamentally sound, economics 101 business. When profit’s a requirement, it becomes a lot harder to step in the bullshit.

Profit protects you from your ego. One of the easiest things to do in business is get ahead of yourself. To feel so grand! To be obsessed with growth and potential and “if only…”. To hire too many people, to take on too much rent, to do one too many things, to complicate your business by tying strings around your money. The list goes on. But when you set out to be a profitable company, you watch your costs. You don’t hire that extra person if you can’t afford them. You don’t get into an office space that’s too big for you. You don’t sign a long-term lease that you can’t afford. You don’t sink a pile of money into things just because you can, you consider your spends more carefully. There’s nothing easier than spending other people’s money — and that should concern you. When you’re running on your money, and you want to make sure you have some left at the end of the year, you spend it wisely. You build good, responsible habits this way. Profit creates reasonable borders and boundaries, and that’s a very healthy thing — especially early on.

All we owe is our best effort. When you’re profitable and debt free, you don’t owe anyone anything other than your best efforts. And who do we owe that to? Ourselves and our customers. The peace of mind, clarity, and calm that comes with that is immeasurable.

$1 in profit is the ultimate FU money. I typically don’t like the term “fuck you money” — it’s so in-your-face ugly — but I’m going to use it to make a point. Typically when people talk about FU money, they think about millions. Once you have millions you have FU money. Well, actually, all you need is $1 in annual profit. Because once your company is self-sustaining and profitable, and you don’t owe anyone anything (in my book, if you owe money you aren’t truly profitable), then you can say FU to just about anything. You don’t need to do anything you don’t want to do when you don’t have to rely on anyone else to be sustainable. You don’t have to dance on anyone else’s stage, or play by anyone else’s rules. FU money isn’t about buying an island, it’s about being an island — your own sustainable entity.

Profits provide insulation. When tastes change, when trends shift, when the markets flutter, funding freezes up. That happens whether your particular business is unaffected or not. And you might well be caught out in the cold and freeze to death. Remember 2008? 2009? The nuclear winters of funding? Those were some of our best years! Profits insulated us from jittery investors, and our customers still kept paying for Basecamp.

Profits are just simpler. We’re still an LLC at Basecamp. The simplest pass-through structure you can have at our size. That means fewer lawyers, fewer accountants, less paperwork, less hoop-jumping. Our books are so silly simple, our operating agreement hasn’t changed in a decade. Keeping your corporate structure this lean means making time for much more interesting things, like building a better product. Having all of the company focused on either making a better product or supporting a better product. There’s no CFO at Basecamp. There’s no accounting department. Our amazing office manager Andrea can handle all that in concert with Ann, our accountant of 17 years.

Profits focus the mind. There are so many things we could do as a company, but far less that really constitute the essence of why we’re here. Profits helps us concentrate on what to do and what not to do. It helps us shed things beyond the scope, it helps us keep the company fit, without accumulated layers of fat from chasing a thousand potential directions at once.

Profits have gotten a bad rep. They’ve gotten maligned together with “creating shareholder value”. Could there be a more uninspiring mission for a business? So it’s no wonder that profits have gotten a bad rep, but it’s unwarranted and disproportionate. Profits should sue for slander!

Having a profitable business doesn’t mean squeezing the lemon for every last bitter drop. It isn’t all or nothing. You can be profitable and generous. Profitable and fair. Profitable and kind. These aren’t opposite ends of some moral spectrum. Quite the contrary.

It’s EASIER to be generous when you’re doing well. It’s EASIER to be fair when there’s enough. It’s easier to be kind when it’s not tipping you over the edge.

Why we choose profit was originally published in Signal v. Noise on Medium, where people are continuing the conversation by highlighting and responding to this story.

Read the whole story
3 days ago
Share this story

Transparent JPG (With SVG)


Let's say you have a photographic image that really should be a JPG or WebP, for the best file size and quality. But what if I need transparency too? Don't I need PNG for that? Won't that make for either huge file sizes (PNG-24) or weird quality (PNG-8)? Let's look at another way that ends up best-of-both-worlds.

The original photographic image.

The goal is to clip myself out of the image, removing the background. My technique for that is usually to use Photoshop and cut a clipping path manually with the Pen tool.

Now I can select the inverse of that clipping path to easily remove the background.

Attempting to save this as a 1200px wide image as PNG-24 out of Photoshop ends up as about a 1MB image!

1MB is huge :(

We could cut that by 75% using PNG-8, but then we 1) get that weird Giffy look (less photographic) and 2) have to pick a matte color for the edges because we aren't getting nice alpha transparency here, just binary transparency.

Much better file size, but quality is weird.

Gosh what if we could just use JPG? The quality and file size is way better.

No transparency though.

But wait! Can't we just clip this thing out? We have clip-path now. Well... yeah. We do have clip-path. It can't take a path(), though, and what we've created for vector points in Photoshop is path data. It could take a polygon() though, if we made all the lines straight. That's probably not ideal (I'm curvy!). Or we could make a <clipPath> element in some inline SVG and use clip-path: url(#id_of_clipPath);, which does support a <path> inside.

There is masking as well, which is another possibility.

Let's look at a third possibility though: put everything into <svg>. That made some logical sense to me, so all this stays together and scales together.

The trick is to make two things:

  1. The JPG
  2. The clipping <path>

The JPG is easy enough. Output that right from Photoshop. Optimize.

Now we can set up the SVG. SVG is happy to take a raster graphic. SVG is known for vector graphics, but it's a very flexible image format.

  <image xlink:href="/images/chris.jpg" x="0" y="0">

To get the path, we export the path we created with the Pen tool over to Illustrator.

Now we have the path over there, and it's easy to export as SVG:

Now we have the path data we need:

Even with all those points, this was 1.5K unoptimzed and ungzipped. Not much overhead.

Let's use that <path> within a <clipPath> in the SVG we've started. Then also apply that clip path to the <image>:

<svg viewBox="0 0 921.17 1409.71">
    <clipPath id="chris-clip">
      <path d=" ... " />
  <image xlink:href="/images/chris.jpg" clip-path="url(#chris-clip)" x="0" y="0" width="921" height="1409">


A transparent JPG, essentially.

Transparent JPG (With SVG) is a post from CSS-Tricks

Read the whole story
3 days ago
Share this story

Butcher: which part of the leg do you want? Me: All of it, in five pieces please

2 Comments and 11 Shares

This ABC News chart seemed to have taken over the top of my Twitter feed so I better comment on it.


Someone at ABC News tried really hard to dress up the numbers. The viz is obviously rigged - Obama at 79% should be double the length of Trump's 40% but not even close!

In the Numbersense book (Chapter 1), I played the role of the Devious Admissions Officer who wants to game the college rankings. Let me play the role of the young-gun dataviz analyst, who has submitted the following chart to the highers-up:


I just found out the boss blew the fuse after seeing my chart. The co-workers wore dirty looks, saying without saying "you broke it, you fix it!"

How do I clean up this mess?

Let me try the eye-shift trick.


The solid colors draw attention to themselves, and longer bars usually indicate higher or better so the quick reader may think that Obama is the worst and Trump is the best at ... well, "Favorability on taking office," as the added title suggests.

Next, let's apply the foot-chop technique. This fits nicely on a stacked bar chart


I wantonly drop 20% of dissenters from every President's data. Such grade inflation actually makes everyone look better, a win-win-win-win-win-win-win proposition. While the unfavorables for Trump no longer look so menacing, I am still far from happy as, with so much red concentrated at the bottom of the chart, eyes are  focused on the unsightly "yuge" red bar, and it is showing Trump with 50% disapproval.

I desperately need the white section of the last bar to trump its red section. It requires the foot-ankle-knee-thigh treatment - the whole leg.


Now, a design issue rears its head. With such an aggressive cut, there would be no red left in any of the other bars.

I could apply two cuts, a less aggressive cut at the top and a more aggressive cut at the bottom.


The Presidents neatly break up into two groups, the top three Democrats, and the bottom four Republicans. It's always convenient to have an excuse for treating some data differently from others.

Then, I notice that the difference between Clinton and GW Bush is immaterial (68% versus 65%), making it awkward to apply different cuts to the two neighbors. No problem, I make three cuts.


The chart is getting better and better! Two, three, why not make it five cuts? I am intent on making the last red section as tiny as possible but I can't chop more off the right side of GHW Bush or Reagan without giving away my secret sauce.


The final step is to stretch each bar to the right length. Mission accomplished.


This chart will surely win me some admiration. Just one lingering issue: Trump's red section is still the longest of the group. It's time for the logo trick. You see, the right ends of the last two bars can be naturally shortened.


The logo did it.


Faking charts can take as much effort as making accurate ones.

The ABC News chart encompasses five different scales. For every President, some percentage of dissenters were removed from the chart. The amount of distortion ranges from 15% to 47% of respondents.






Read the whole story
7 days ago
8 days ago
Share this story
2 public comments
7 days ago
"Faking charts can take as much effort as making accurate ones."
Baltimore, MD
8 days ago
where is the Broadcast Television Graphic Artist Intern Code of Ethics we so desperately need
Bend, Oregon

Most of the web really sucks if you have a slow connection

1 Share

Dan Luu on the sorry state of web performance:

...it’s not just nerds like me who care about web performance. In the U.S., AOL alone had over 2 million dialup users in 2015. Outside of the U.S., there are even more people with slow connections.

This other note is also interesting, and I think that Dan is talking about Youtube’s project “Feather” here:

When I was at Google, someone told me a story about a time that “they” completed a big optimization push only to find that measured page load times increased. When they dug into the data, they found that the reason load times had increased was that they got a lot more traffic from Africa after doing the optimizations. The team’s product went from being unusable for people with slow connections to usable, which caused so many users with slow connections to start using the product that load times actually increased.

Direct Link to ArticlePermalink

Most of the web really sucks if you have a slow connection is a post from CSS-Tricks

Read the whole story
7 days ago
Share this story

Change Log

1 Share

Page edited by Kurt Wagner

Road map



v0.4.0-BETA -14th Feb 2017


  • Hide sensitive extension values for those without permission
  • Hide financial values when use does not have all financial accessibility 
  • A user with progress permission should be able to progress issue regardless of edit permission
  • Admin should be able to edit activity visibility


  • New optional fields "is_important", "is_sensitive", "is_exported" and "default_value" on extension value endpoints.
  • Allow assigning, reassigning, surrendering and claiming of issues through assignee id changes
  • New optional field "staff_bookmarked" for all objects supporting bookmarks. Returns 0 for false, 1 for true.
  • Search threads using the "q" parameter.
  • Add get, add and delete staff bookmark endpoints for all objects supporting bookmarks.
  • Allow sorting, filtering and access of "date_modified" on activities.
  • Endpoint "/staff/whoami" for accessing the current user as a staff response
  • Include staff id in "/tokeninfo" endpoint.

v0.3.43-BETA - 2nd June 2015

New fields:

New endpoints: 

v0.3.42-BETA - 17th February 2015

Bug fix

  • Intermittent errors when requesting staff objects from multiple endpoints

v0.3.41-BETA - 17th February 2015

New endpoint

  • Read expense data

v0.3.40-BETA - 13th February 2015

Bug fix

  • Handling null values in the in and not in filters

v0.3.39-BETA - 29th January 2015

New fields

v0.3.38-BETA - 20th January 2015

Bug fix

v0.3.37-BETA - 15th January 2015

Behaviour change

v0.3.36-BETA - 14th January 2015

Bug Fixes

  • Fix to (deprecated) budget endpoint to reenable old behaviour
  • Fix to broken timers

New Filter

  • Affiliation filter for jobs

v0.3.35-BETA - 14th January 2015

New Endpoints


v0.3.34-BETA - 5th January 2015

New Endpoints

New Filters

  • Contract period: ordering fields (id, date_commenced, date_created, date_expires, date_closed)
  • Activities ordering fields (billable, nonbillable) 

Bug Fixes

Code Improvement for "against" field

  • Rename HVE::Role to HVE::Common (no longer roles)

v0.3.33-BETA - 17th December 2014

Back-end improvement

  • Rename HVE::Role to HVE::Common (no longer roles)

v0.3.32-BETA - 12th December 2014


  • Better error handling on create activity

v0.3.31-BETA - 12th December 2014

New fields

v0.3.30-BETA - 12th December 2014

Bug fixes

New filters

  • Issue (contract)
  • Renamed filter "referrer_table" to "referrer_type" for issue

v0.3.29-BETA - 11th December 2014

New range filtering options 

New endpoints. 

New fields

v0.3.28-BETA - 9th December 2014

Fixed a bug with timers.

v0.3.27-BETA - 4th December 2014

Correctly fetch the title when timers are against tasks.

v0.3.26-BETA - 3rd December 2014

Improved handling of contract endpoints when no current period exists

v0.3.25-BETA - 27th November 2014

New Ordering Options

  • Tasks (title, standing, status)
  • Jobs (date_modified, date_last_interacted, title, standing, status)
  • Issues (date_resolved, title, status, standing, date_last_interacted)
  • Contracts (standing, status, title, date_last_interacted)
  • Affiliations (fullname, status, standing, date_modified, date_last_interacted)
  • Companies (name, standing, status, date_last_interacted)
  • Prospects (date_due, title, status, standing, date_last_interacted)

New Fields

  • New fields for contract (parent, date_last_interacted)
  • New fields on jobs (object_budget, affiliation, date_started, date_last_interacted)
  • New fields on issues (billable_seconds, date_last_interacted)
  • New fields on prospects (standing, date_last_interacted)
  • New fields on affiliations (date_modified, date_last_interacted, standing)

v0.3.24-BETA - 26th November 2014 

New Endpoints

New Fields

v0.3.23-BETA - 18th November 2014

New Fields

v0.3.22-BETA - 17th November 2014

New Fields

v0.3.21-BETA - 13th November 2014

New Endpoints

New filters

  • Filter addresses by against object

New Fields

  • View "progress" of a prospect

v0.3.19-BETA, v0.3.20-BETA - 12th November 2014

Internal changes to logging and Gadget Endpoints

v0.3.18-BETA - 10th November 2014


  • Enable service applications to list all the timers in their system and to get any timer by timer id.
  • Enable current user to update seconds for their own stopped timers. 

v0.3.17-BETA - 27th October 2014

New Endpoints

v0.3.16-BETA - 22nd October 2014


Bug Fixes

  • Fixed bug preventing some grants from being created due to invalid data types.

v0.3.15-BETA - 21st October 2014

New Filters

New Endpoints

Misc Improvements

Bug Fixes

  • Grants without expiry do not default but instead instantly expire. Now default expiry is in 5 minutes

v0.3.13-BETA - v0.3.14-BETA - 8th October 2014

New Endpoints

  • Introduced Auto progression endpoints for affiliations, companies, contacts, contracts, issues, jobs, milestones, prospects and tasks.

Bug Fixes

  • Grants were never expiring.

v0.3.12-BETA - 8th October 2014

New Endpoints

v0.3.11-BETA - 8th October 2014

Misc Changes

  • Non-functional structural changes to extension and profile builder methods

Misc Changes

  • New OAuth Grant type "demo" for private and trusted applications. The grant type requires the usual client id and password combination and is only accessible on demo. Upon success a token will be created on the demo deployment for the AffinityLive user

Bug Fixes

New Endpoints

  • New /user endpoint for accessing user defined titles and access flags for the current user.
  • Fix make companies/count endpoint factor in filter parameter

Read the whole story
7 days ago
Share this story
Next Page of Stories