Basecamp, sans browser…? Jamis 05 Jan 2006

50 comments Latest by Tim Lucas

Hmmm… wouldn’t it be nice if there was an easy way to…

  # -------------------------------------------------------
  # programmatically log into your Basecamp...
  # -------------------------------------------------------

  session = Basecamp.new('abcxyz.updatelog.com', 'username', 'password')

  # -------------------------------------------------------
  # query your projects...
  # -------------------------------------------------------

  project = session.projects.find { |project|
    project.name == "Website Design" }

  # -------------------------------------------------------
  # find a specific message category...
  # -------------------------------------------------------

  category = session.categories(project.id).find { |category|
    category.name == "Transcript" }

  # -------------------------------------------------------
  # compose a message...
  # -------------------------------------------------------

  message = {
    :category_id   => category.id,
    :title         => "Chat Transcript for #{Date.today}",
    :body          => "Here is today's archived chat transcript:",
    :extended_body => File.read("transcript-#{Date.today}.txt")
  }

  # -------------------------------------------------------
  # and post it...
  # -------------------------------------------------------

  session.post_message(project.id, message)

…all without opening your web browser?

50 comments so far (Jump to latest)

Dan Diemer 05 Jan 06

Just log into the Metaverse and send it thru.

misuba 05 Jan 06

Gimme an A! Gimme a P! Gimme an I! What’s that spell?

Sebastian Gr��l 05 Jan 06

An API with an Client App…
I think, you are currently think of this.?

Chris 05 Jan 06

Not really.

Sebastian Gr��l 05 Jan 06

Maybe a Dashboard Widget, but this woulsn’t be Cross Platform

Jesse Newland 05 Jan 06

Oh, wow cool, then I can implement features I’ve been needing forever (global .ics calendar, email to basecamp posting, etc, etc) myself! A-Pretty-please-I!!!!!!

Jesse Newland 05 Jan 06

basecamp.rb?

Marston 05 Jan 06

Hrm, some kind of creative tech teaser for Campfire perhaps?

Jesse Newland 05 Jan 06

Global search? Finally? This would be amazing for me. Think Basecamp queries via Quicksilver…….

O Productivity!

paulo 05 Jan 06

mmm API… we’ve been wanting to tie one of our little projects into basecamp forver!

Peter Cooper 05 Jan 06

It’d be great, but it’ll never happen! ;-)

Brad Lauster 05 Jan 06

This would be so great! We’ve been scheming a way to get weekly status reports out of Basecamp and onto an external web page, which is why I asked for category-specific RSS feeds for Basecamp messages a few weeks ago.

Until now we were thinking we’d have to get our Project Managers to put their status reports into Basecamp with a certain format in the title ( Weekly Status: [Project Name] ). Then we’d pull the global RSS feed and parse out the appropriate messages. Messy.

A nice API would be so much more simple…and we all know how you guys feel about simplicity.

jeremy 05 Jan 06

This is awesome! I’ve got a little rails app I’m building to track project hours. I’ve had grandiose aspirations to link it to my basecamp acct. The universe must think I’m living well today…
Thanks 37Signals!

dru 05 Jan 06

sweeeeeeeeeeet

Anonymous Coward 05 Jan 06

API API API API API API API!

Caleb Buxton 05 Jan 06

You guys are really on the mark. Openness (like with this blog, like with the release of Rails) is what will distinguish organizations.

Good move.

Richard Bird 05 Jan 06

I had previously found myself compelled to experiment and successfully do this the hard way using GET and POST, Jamis. And, yes, I’ve done it that way sans API. Now, your description sounds so elegant. I know you’re onto something.

manuel 05 Jan 06

i have never tried basecamp, i cant write a single line of php, i have not yet managed to start a business, i just visit this blog because it feels right.

so, basicly, my oppinion is practically worth shit, BUT…
i sense that this is a biggie. that must be worth something :D

Paul 05 Jan 06

Basecamp go BOOM!

Google mashups are tired. FlickrCamp or BaseMap are wired!

Oooooo, I’m getting goosebumps!

Charles Martin 05 Jan 06

Please, sir, could we have some more?

And then hierarchical milestones.

Jesse 05 Jan 06

It would be much better if basecamp could authenticate users through my LDAP and/or the normal basecamp way. Please make my web app world easier to deal with by reducing the number of usernames/passwords i have to remember!

Sebastian Gr��l 05 Jan 06

i just discovered a Backpack Dashboard Widget, mentioned on project.ioni.st

Brian Breslin 05 Jan 06

wouldn’t it be relatively easy to built a client using XSLT or whatever the songbird guys are using and have offline access?
This would allow for people to integrate these other features they want, maybe even create a small community of add-ons for sale?

vanderwal 05 Jan 06

Hmmm. One of the huge complaints I hear from non-alpha/beta users is that they are not always connected to the web. I blew this off until I was doing a lot of traveling this past Fall and had a hard time (or quite expensive time) getting connectivity. My interest in Basecamp waned as I wished there were and off-line component that would sync back to the mothership when I got connectivity.

This little display could allow me to do the querying and store it locally. Then when I had time I could compose and even edit quite a few things. When I get connectivity I could do a bulk posting session (of course I would want to have done another query to verify if the file I edited had been edited by others first) and still do a diff on the file when just before I post. This would also need a quick lock on modification on said file, but all of this is doable and not rocket science.

I can see many scenarios where this would greatly boost productivity and use of the product. We many not have continuous connectivity, but we can have continuous computing. We can work on the plane, train, middle of somewhere, etc. and still use web-based applications.

jason 05 Jan 06

Any reason you are not using tags instead of categories? Also, when can we start tagging, er um, categorizing todos and milestones as well.

We are using basecamp on our software development and are getting around the lack of tags by prefacing each milestone with the feature name.

An API sounds cool BTW. Can’t wait to start using it.

vanderwal 06 Jan 06

Rabbit, thanks for the pointer to Show Leadership it is a great site.

But, the reason I do things while in transit is to make use of that as time I can not be doing what I want, be it family or recreation. I also do it to get out of the office and congestion. When travelling for work there are still things that need to get done like tracking projects, cleaning up specifications, checking off to-dos, etc.

I am trying to take a more European approach and work during working hours and play during the others. Not having connectivity makes working during work hours difficult if one is managing their productivity and projects in a web app.

shemmeth 06 Jan 06

Maybe this is not a very informational or, for that matter, a good one but…

I wondered if WebDAV is not the answer to this question. I have used several times with both small and large projects/sites, and I see no reason why it should not (at least in theory) apply to the question raised in your article.

Peter Nofelt 06 Jan 06

Whats so special?

How is this different from using a WSDL file to describe the available api calls and using a language dependent parser to (like Disco in .net) to convert the xml to a code file?

Please note, i’m not being cynical. I’m just interested to know if this approach is something different.

gwg 06 Jan 06

What a tease. What a gigantic tease.

Bob Aman 06 Jan 06

Peter, it’s important to understand that what Jamis is talking about here is not revolutionary at all, nor is it meant to be. It’s just really, really convenient to have around. So… no, it’s not really different, it’s just the right thing to do.

Peter Nofelt 06 Jan 06

I get that. Since i do not come from a RoR background i wasn’t sure if this post was about a Basecamp programmatic interface or something new to Ruby (using Basecamp as an example).

Also, if the methodology is nothing new, how does it work in ruby?

thanks.

Prophetess 06 Jan 06

Vanderwal hit the nail on the head. A big speedbump in my project folks’ acceptance of something like BaseCamp is that the Big Chief spends 2 hours a day on a commuter train. Unless I can put an app in front of him that he can use then as well as while he’s connected, he’s not buying…

ian 06 Jan 06

holy awesome. i want an api for bc so bad for an app i’ve built for our company.

z 06 Jan 06

teasing so cruelly, you should be ashamed of yourself! ;)

z 06 Jan 06

allow me tease (dare?) you back:

  # -------------------------------------------------------
  # programmatically log into your Basecamp...
  # -------------------------------------------------------

remote_session = Basecamp.new('abcxyz.updatelog.com', 'username', 'password')

local_session = Basecamp.new('myserver.com', 'username', 'password')

# -------------------------------------------------------
# replicate..
# -------------------------------------------------------

local_session.replicate_from remote_session


Ruy 06 Jan 06

Wooo finally! I’ve been waiting since November for this - it was always just around the corner :)

Kieran 06 Jan 06

Just a quick point. How does everyone manage to keep up with reading all these blogs. For example, I find reading all the points in this blog very interesting but time consuming. Does anyone have any recommendations as to how to manage your time when keeping up with the news in blogs?

Thanks
K

CodeNinja 06 Jan 06

Now we can tie all our customer’s sites directly into basecamp? Integrated support and message posting from our client backends?
Integrated notifications of developer messages?

You’re making it FAR too easy for me to sidestep my competion!

Now, if I can just get an email notification everytime a user posts a message to the system or updates the todo list we’ll be cookin’ with gas!

Adrian Gonzales 06 Jan 06

If this has anything to do with an API, I’ll love you so much more than I already do.

Oh, the possiblities.

Bidwellm 06 Jan 06

That sounds great. I really hope 37 spends most of their time on this great product instead of falling pray to the shotgun approach of growth through product reproduction.

The Great Pumkin 06 Jan 06

Smart!

Outsource product feature development and bug fixes to the world!

Can’t export then reimport your projects - Build an API, then someone will build it for us.

Can’t get dated ToDo items - Build an API, someone will create the feature for us.

Can’t transfer items between projects - Buiild an API…

Can’t Prioritize ToDos….

Can’t Turn off…

Can’t…

RyanA 07 Jan 06

That means I could check my messages in Basecamp while I’m debugging a Rails app in my Terminal!

Chris Anderson 07 Jan 06

CodeNinja hits the nail on the head!

Matt 07 Jan 06

Kieran-

Have you looked into an RSS reader? I have about 90 blogs on my blogroll.

-Matt

Matt 07 Jan 06

Kieran-

Have you looked into an RSS reader? I have about 90 blogs on my blogroll.

-Matt

Micah Alles 07 Jan 06

I would love this. Please make and give :)

Jay 08 Jan 06

I would love this.

And here’s a small reminder to please add API support for multiple to do lists in Backpack. :-)

You guys rock!

Tim Lucas 09 Jan 06

Or even nicer:


session = Basecamp.new('abcxyz.updatelog.com', 'username', 'password')

project = session.projects[“Website Design”]
# instead of
# session.projects.find { |project|
# project.name == “Website Design” }

category = project.categories[“Transcript”]
# instead of
# session.categories(project.id).find { |category|
# category.name == “Transcript” }

chat_transcript = category.new_message(
:title => “Chat Transcript for #{Date.today}”,
:body => “Here is today’s archived chat transcript:”,
:extended_body => File.read(“transcript-#{Date.today}.txt”)
}
# instead of
# message = {
# :category_id => category.id,
# :title => “Chat Transcript for #{Date.today}”,
# :body => “Here is today’s archived chat transcript:”,
# :extended_body => File.read(“transcript-#{Date.today}.txt”)
# }

project.post_message(chat_transcript)
# instead of
# session.post_message(project.id, chat_transcript)