Checkvist story
Helping people easily create, share, and collaborate on task lists and outlines.
New bookmarklet: Gmail and issue tracker integration
Seems, it’s time to update your bookmarklets!
The new bookmarklet is integrated with Gmail - click the “2Checkvist” link in the browser toolbar to create a Checkvist task associated with a specific email.
Same with the issue tracker integration - click the bookmarklet while browsing your issues to create a quick to-do list for yourself, your team, specific release, etc. So far Checkvist “understands” Atlassian Jira and JetBrains YouTrack issue link formats.
But of course you can use bookmarklet to save references to any web page as well and conveniently create a list of tasks while browsing the web.
Other enhancements include:- No pop-up window (no problems with browser pop-up paranoia)
- ESC to close the bookmarklet window
- Ctrl+Enter instead of clicking the Add button.
Drag and drop the new bookmarklet to the browser toolbar: 2Checkvist or update it later from your profile page.
Embed checklist to your web page
After releasing the iGoogle gadget for Checkvist it was rather natural to give users an easy way to embed lists to their web pages. Just like in an example below:
This checklist is marked as public, so anyone can view it even without having Checkvist account.
Now, when checklist author marks it as public from the share dialog, there is a code snippet which allows to embed this checklist to any HTML page (see screenshot below).

You can copy/paste code fragment from the text field and insert it into a web page. If needed, you can tweak width and height parameters.
Add Checkvist to your iGoogle homepage

Here’s a little something for your convenience: an iGoogle gadget. Add it to your personalized Google homepage and work with your list using the same keyboard shortcuts:
- Select a list you want by pressing ll
- Hide/show completed tasks by pressing hc
- Navigate the list, add new tasks, subtasks, complete or invalidate, use color - all fast, not taking your hands from keyboard.
OpenAPI usage examples (Javascript, Ruby)
We’ve got a number of requests to provide some examples of accessing Checkvist via OpenAPI. When I started preparing one, I found some inconsistencies in the OpenAPI docs and in the implementation. These issues have been fixed and now I’d like to give you some code examples.
In the examples, I’ll demonstrate usage of the JSON format for the returning data. Checkvist API also supports XML format, for details, please see the documentation.
Javascript
The Javascript example illustrates how to obtain checklist tasks data and embed the list into your web page.
The list will be organized into a hierarchy with simple UL tags. Completed tasks in the list will be striked, invalidated tasks are marked with italics. The parent UL tag will have CSS class checkvist_list to enable styling according to your needs.
Here is a sample of the generated HTML code:
<ul class="checkvist_list">
<li>This is an item</li>
<li>This is another item
<ul>
<li>This is a subitem</li>
<li><strike>This is a completed subitem</strike></li>
<li><em>This is invalidated subitem</em></li>
</ul>
</li>
</ul>
To embed the checklist, follow these steps:
Step 1. Add Javascript library for accessing Checkvist
In the HEAD section of your web page, add the following line:
<script type="text/javascript"
src="http://checkvist.com/javascript/checkvist_api.js"></script>
This sample library contains the code which accesses the Checkvist via OpenAPI and builds HTML for embedding into web page. You can download it and customize for your needs, if you want.
Step 2. Prepare target location for the embedded checklist
Add the following markup on your page at the place where you want to see the checklist:
<div id="checklist_container"></div>
Step 3. Determine the ID of the checklist you want to embed
This is an easy part. If your checklist has URL like http://checkvist.com/checklists/3318-checkvist-test-plan, than required checklist ID is 3318.
Step 4. Get your OpenAPI key
Visit your CheckVist profile page and click “View/update remote OpenAPI key” link. Copy the key from the text field.
Step 5. Add code which actually loads the checklist
Add the following block in the HEAD section of your Web page:
<script type="text/javascript">
function load_checklist_callback(data) {
document.getElementById('checklist_container').innerHTML =
checkvist.create_tasks_html(data);
}
function load_checklist() {
// Remove the next line if your checklist is public
checkvist.login('Your E-Mail', 'Your OpenID KEY');
checkvist.get_tasks(<Checklist ID>, 'load_checklist_callback');
}
var checkvist_interval = setInterval(function() {
if (document.getElementById('checklist_container')) {
clearInterval(checkvist_interval);
load_checklist();
}
}, 20);
</script>
In this code, you need to specify your login to CheckVist - e-mail address, OpenAPI key, and checklist ID to show.
If your checklist is public, there is no need to authenticate, so checkvist.login call can be omitted.
Actually, instead of calling setInterval function, you can invoke method load_checklist in your usual place of Javascript initialization code for your web page.
That’s it. When the page is loaded, the element checklist_container will be filled with checklist tasks. You can take a look at the checkvist_api.js and use it as a base for solving more complex tasks.
Ruby
As long as Checkvist OpenAPI is HTTP-based, you can use a standard Net::HTTP module to create requests, and JSON gem to parse responses.
Here is a sample class for accessing Checkvist from Ruby:
require 'net/http'
require 'uri'
require 'rubygems'
require 'json'
class SampleCheckvistApi
def initialize email = nil, api_key = nil, site = "http://checkvist.com"
@email = email
@api_key = api_key
@url = URI.parse(site)
end
# Obtain a list of checklists
def checklists()
json_call Net::HTTP::Get.new("/checklists.json")
end
# Obtain a list of tasks for given checklist
def tasks(checklist_id)
json_call Net::HTTP::Get.new("/checklists/#{checklist_id}/tasks.json")
end
# create a task in given checklist
def create_task(checklist_id, content, parent_task_id = nil, position = nil)
json_call Net::HTTP::Post.new("/checklists/#{checklist_id}/tasks.json"),
{ "task[parent_id]" => parent_task_id,
"task[position]" => position,
"task[content]" => content }
end
# update a task attribute. For task attributes, you can use "content", "parent_id", "position"
def update_task_attribute(checklist_id, task_id, attr_name, attr_value)
json_call Net::HTTP::Put.new("/checklists/#{checklist_id}/tasks/#{task_id}.json"), {"task[#{attr_name}]" => attr_value}
end
def json_call request, parameters = nil
request.basic_auth @email, @api_key if @email
request.set_form_data(parameters) if parameters
res = Net::HTTP.start(@url.host, @url.port) { |http|
http.request(request)
}
case res
when Net::HTTPSuccess
JSON.parse(res.body)
else
res.error!
end
end
end
And here is a sample of how to use SampleCheckvistApi class:
# Specify authentication data:
api = SampleCheckvistApi.new('email', 'OpenAPI key')
# For each public non-archived checklist
api.checklists.each do |checklist|
# Obtain its tasks:
tasks = api.tasks(checklist['id'])
# Tasks are sorted by parent_id, position
end
# Create a task in the first checklist
# Get ID of the first checklist:
first_checklist_id = api.checklists[0]["id"]
# Create the task at the end of the checklist:
new_task = api.create_task(checklist_id, "new task from api")
# Change task content to 'new text'
api.update_task_attribute(new_task['checklist_id'],
new_task['id'], "content", "new text")
# Change the parent of the task:
api.update_task_attribute(new_task['checklist_id'],
new_task['id'], "parent_id", tasks[0]['id'])
If you’re interested in using Checkvist API, or you’re going to use it, please let us know :). You may also want to subscribe to the checkvist-api newsgroup.
Good luck!
KIR
Bugfix server update
Hello,
For the last days we didn’t do a lot of new development, but bugs cannot wait, so here is a short summary of what was fixed for the last time:
- Fixed Remember Me support. Now users who checked “Remember Me” mark will be redirected from home page to their checklists page (as it was before introducing the paid plan)
- There were some bugs when recognizing URL in checklist text. If you notice incorrect URL recognizing, please let us know.
- OpenAPI fix: when tasks were returned in JSON format, the data was OK for Javascript interpretation, but didn’t confirm to JSON standard.
- No notifications were sent about deleted notes
- Copy/Paste/Move now copy notes for tasks as well
- MySQL database were updated to avoid some locking problems
- OpenAPI documentation was corrected in several places
And thanks all of view for your feedback, we really appreciate it!
Extract checklist and UI customization
This week we introduce a couple of features and a handful of bugfixes:
- Extract checklist - when a checklist gets too long, you can easily break it into several ones. Just select the top task of the node you want to extract, and press xx (new shortcut for xtract feature). The top task becomes the new checklist title, and the original list contains a link to the new one. See reference for details.
- UI Customization available to our Pro users - The first addition to the Pro plan allows changing the logo and colors of the Checkvist’s interface. Those who are sure of their web design skills can use custom CSS to customize Checkvists face into anything they fancy. See reference for details.
- (bug fixed) Changed behaviour of a parent task upon completion in the “Hide completed mode (see the discussion of this issue)
- (bug fixed) Corrected URL linking (thanks, Ricardo!)
- (bug fixed) Saving credentials upon login (the “Remember me” option) (thanks, Oleg!)
And - as usual - thank you so much for your feedback and so many ideas!
It's settled: Checkvist Pro
We’ve been almost silent for quite a while. And there is a reason behind that.
For more than a year, Checkvist was completely free. We have a lot of happy users, a lot of great feedback. It is a real joy to work on the tool.
We got some requests from people who would like to donate to our service to say thank you - and these were indeed pleasant requests. On the other hand, monthly hosting bills led us to a thought that Checkvist should probably pay for itself, or at least cover some expenses.
So we spent some time and introduced Checkvist Pro plan. As we promised before, all previous features, already available to Checkvist users, remained free.
Checkvist Pro plan is subscription-based, and it costs $15 for 6 months. Its benefits are valuable mostly for those who collaborate using Checkvist:
- Daily digest of the changes. You can either subscribe on changes in specific checklists, or subscribe for all available checklists.
- Private read-only sharing. This feature is useful in a case when you want to show results of your work to someone, but disallow modifications from your reviewer (writeable sharing is still available for free).
- Full HTTPS support. You can use HTTPS protocol to work with your lists, which makes your communications secure. For all (including non-Pro) accounts, HTTPS can still be used to register in the system and update user profile.
There is also a couple of new things available to free accounts as well:
- You can specify a custom message when sending a notification about changes
- You can choose recipients of the notification, and also send a copy to yourself
- Notification e-mail message was reworked and is available in HTML format
Under the hood, we’ve also made several time-consuming changes, in particular, migration to Ruby on Rails 2.3.3 and MySQL InnoDB engine.
And now, after the release, we can provide more frequent updates.
Stay tuned and thanks for being with us :)
A forgotten milestone: 10000 lists
As our friend mentions, Checkvist is already over 10 000 lists, which can be considered a humble milestone. While thanking him, I was wondering why I do not really find numbers that important. What are we developing for? What is important, then?
- It’s not money - the tool is free and we do not aim to get ourselves a Ferrari by adding a paid plan, or selling it to a big company.
- It’s not market dominance - we’re pretty aware of other tools, their smart and rich features.
- It’s the joy. The joy of making a tool that would prove useful not only to ourselves but to some number of people who’d love it and use it. The joy of communicating with those people, discussing future plans and features, creating the tool together.
This is it, I think. We see a long road ahead - adding search and tags, and dates (and other attributes), creating new web app for iPhone, improving UI look and feel, polishing existing keyboard support, etc, etc. With your help and participation it’ll be the biggest fun a software developer can get.
10000 lists is great, but let’s continue. For the joy of it :)
Read-only publishing and HTML support
Disclaimer: this is not a fools day issue. This is a normal, ordinary update of the server. No surprises. Here’s what kept us busy:
- Read-only publishing of your checklists/outlines (suggestion)
To share your outlines with anyone on the web, press “Publish” button in the Share dialog, then copy the URL and send it to your boss, friends or put it on your blog. The readers cannot make changes to it, but are able to copy or export your outline (useful if you want to share something other people can utilize in their work).
If you or your co-workers make changes to that outline, they’ll be immediately visible to the public. To make the outline private again, simply click Un-publish in the same dialog panel. 
- Support HTML in tasks and comments (thanks joebadmo for suggestion)
- Fix problem for multi-line task rendering in preliminary mobile version of Checkvist + add support for HTML as well (thanks Serge Beauregard for this report and for many others)
- IE8 support, including option to add numbering to outline (see view options in toolbar)
- Allow to send a copy of Checkvist invitation to self when inviting people
- More fixes and improvements. Among them a fix for the bug when creating a checklist in Safari 3.1.2 or AJAX update of sharing information.
Enjoy!
OPML import and a handful of fixes
The only new feature in this update is OPML import. We thought it would be rather important to support two-way integration with, let’s say your favorite desktop outliner and Checkvist. Please bear in mind that this file format is not strict, and sometimes importing/exporting OPML needs some manual fine-tuning.
With OPML import you can:
- Backup your checklist offline and import it back if needed. Statuses, notes, coloring - all this stuff can be exported and than imported, so the list presentation will stay intact.
- Provide some interoperability with other outliner tools. For example, Checkvist understands some non-standard attributes from OmniOutliner.
Besides, many Checkvist reviews claimed that it supports OPML import. We had to turn these claims into the truth.
We’ve also made several minor fixes, which are worth mentioning:
- Fixed wrong outline numbering after closing/opening/editing a task in Safari/Chrome
- Fixed recently damaged keyboard support in Opera (version 9.5 and newer should work flawlessly now)
- Delete a task when the user has deleted its text (in the editing mode) and pressed Enter (or Save)
- Fixed a curious interaction bug: pressing TAB could totally conceal a task if there was a hidden completed node above it
- Support Shift+1, Shift+2, Shift+3 for setting background color (in addition to 1,2,3 for foreground color)
- Option to export color. For plain text export this option is not supported, for Confluence Wiki background color is exported as foreground color, for OPML we add ‘color’ and ‘bgColor’ attributes to an outline element
- Fixed a nasty bug introduced by the previous update when task status change was incorrectly reported in notification e-mails
- Added the explicit “Rename” command to the options for checklist modifications (which are available on title hovering)
- Show a message on clicking the toolbar “add notes” link when no task is selected
- In the View options popup the whole line is clickable, not only its text
- Fixed a bug in URL parsing - now several URLs are recognized within task/note text
- After pasting (or duplicating) a task with Ctrl+V/Ctrl-D we set selection to the duplicate and scroll to it.
And we’d like to say huge thanks to all those people who send us emails with feature requests and bug reports, who participate in the user forum, tweet @checkvist_news, and leave comments on this blog. Your help and feedback help us greatly. Thank you!