The HN Effect and Our Accidental Launch
Mostly due to the fact that neither Anton nor I are cut out to be movie directors, producers or presenters, we submitted our YC application in the last moment at five minutes to 8pm PST. This was 6am in Moscow on Monday.
Having only slept for 6 hours in the preceding 48, I hit the bunk right away, only to be awoken a few hours later. I stumbled to the computer to check our Clicky logs to see if anybody from YC had already looked at the site. To my surprise, we had 200 visitors - twice the average daily uniques.
At this point it became apparent that @yogstoth had submitted us to HN. I should say resubmitted, because Akshell has been on HN a few times before. In fact, Anton and I "met" in the comments of the first submission.
48 hours later, we have seen 20K+ visitors, with 300+ concurrent users online at peak, average time on site at 4+ minutes, a few investors knocking on the door and bloggers asking for interviews.
What Went Wrong
- we had no alerts in place to notify us of the swarm of HN and twitter visitors - I was asleep and Anton was on the subway when things took off
- we had no monitoring other than top and Munin which could only be accessed from localhost so was as good as useless as I couldn't set up an SSH SOCKS proxy
- we didn't have the necessary infrastructure nor a clear step by step plan for how to scale without downtime - the service was running on the cheapest Linode available
- we didn't have a mechanism for capture user info other than getting them to register after creating a webapp; as a result our conversion rate from visitor to registered developer was below 1%
- we didn't make it easy for people to Like or RT our URL, despite having this feature on the TODO list
What Went Right
- we responded quickly by replying to people, posting the HN comments link on Twitter and continued engaging users on all fronts
- our landing page was simple and to the point; we made the barriers to entry as low as possible by letting users write code and run the webapp without registering
- people actually liked the service
- we coped with the load by: quickly adding cloudkick to improve our monitoring, asking for advice on #linode on OTC and consulting Stephen a #devops expert from Atalanta Systems, drinking a lot of coffee and not sleeping for another 48 hours
What We Learned
- you should reply to people with questions
- you should make it as easy as possible for people to promote you
- you need both Cloudkick and PagerDuty set up before you have an emergency
- you should find the fastest solution to your most pressing problem: we considered upgrading our Linode instance which would've resulted in 15 minutes of downtime, but instead opted for a RAM upgrade which was a 30s or so reboot which nobody noticed due to the Cappuccino IDE being cached by the browsers
Where to Next
- now that the traffic has died down, we have upgraded our infrastructure and are getting this update out to our users and the HN community
- we're trying to get the word out that Akshell is a serious development platform and that we have developers lined up in Russia and elsewhere to quickly build webapps and API mashups for anyone who is interested
- we are keen to talk to companies with APIs that would like to use Akshell for promotion and running "demos"
- due to visa hassles, we are already booking the flights to the US, despite not knowing whether we will be accepted into YC, so if anyone wants to talk to us or meet when we are there, you can reach us at info@akshell.com
It looks like accidental launches are becoming a bit of a tradition. Thank you to everyone who helped us get here. Every Hacker News upvote and retweet counts!
Akshell 0.3
Akshell 0.3 is out! This release introduces a brand new IDE. It was designed to provide a desktop-like experience in a browser window. It's tightly integrated with the Akshell guts; it doesn't require installation or configuration; you can use it from anywhere without a hassle. And you even don't have to sign up to try it! The coolest IDE feature is Git support: not only you can take your code from GitHub, but you can directly run Git commands, just like on your local machine.
The engine hasn't changed much, but there is good news about it too: it will be open sourced soon. No vendor lock-in anymore, you'll be able to run Akshell apps on your own server.
So here is Akshell 0.3: the open source infrastructure and the sophisticated IDE. Give it a spin!
Introducing the json Attribute Type
I'm happy to present a new type of database attributes: json. It makes storing arbitrary JavaScript objects into the database really seamless. Serialization and deserialization are performed automatically; the API makes it impossible to store an invalid JSON. The type is opaque for database queries: it's just coerced to string.
As always, the main goal was simplicity. Here is an example of an evaluation session:
>>> rv.X.create({j: ['json', {prop: 'value'}]})
>>> rv.X.insert({j: [1, 2, 3]})
>>> rv.X.insert({j: 42})
>>> rv.X.insert({}) // use the default {prop: 'value'}
>>> repr(rv.X.all().get({attr: 'j'}))
[[1, 2, 3], 42, {prop: "value"}]
Akshell 0.2
Akshell 0.2 is out! Akshell is is intended for rapid development of web applications in JavaScript and problem-free hosting them in the cloud. It features an online IDE; so the only tool required for development is a web browser. Akshell runtime environment enables applications to interact with each other; so they can be really modular and social.
In the 0.2 version the engine has been changed significantly. The framework has been ported to new infrastructure. And the new screencast has been recorded (thanks to Oleg Podsechin for narrating it).
Because there are a number of backward incompatible changes, the 0.1 support is not going to be dropped any time soon. All 0.1 applications are unaffected by this release.
In this post I'll describe the significant 0.2 features and migration from 0.1.
require()
Instead of the custom include() function of 0.1, the 0.2 release features require() compatible with the CommonJS Modules 1.1.1 proposal. It should make Akshell applications more portable and enable you to export existing CommonJS libraries to Akshell.
Binary
Now Akshell supports handling of binary data through the Binary class. It's a mutable fixed-length numeric byte storage type. The CommonJS Binary/F proposal inspired its interface.
fs.File
The new fs.open() function opens a file and return an fs.File object. It supports common reading, writing, and positioning file stream operations. The uploaded files are also represented by fs.File instances (these ones are read-only).
Proxy
The Proxy class brings simple means of metaprogramming to JavaScript. Proxy objects intercept property access and react accordingly. For example, the rv object is an instance of Proxy. It transparently maps database relation variables to JavaScript object properties.
JSGI
The core library has been decoupled from the basic Akshell library. The ak framework is no longer required for development in Akshell; only the core library is a must. It wraps the engine APIs and provides a JSGI interface to request handling. You can bring a JSGI compatible framework or middleware to Akshell or create your own.
Migration
If you have an Akshell application, you need to migrate it to 0.2 to experience these new features. Here are some basic steps to perform.
Replace all include() and use() by require(). Require the 0.2 version of the ak framework. Substitute:
ak.use('ak', '0.1'); ak.update(this, ak);... by:
require('ak', '0.2').setup();All module variables declared by var are now module-local; so you can remove anonymous functions wrapping modules.
Replace the __root__ global variable by exports.root.
Replace the __main__ global variable by exports.main. exports.main defaults to the defaultServe() function; so you can just remove a line like this:
var __main__ = defaultServe;
Rename __main__.js to main.js.
Change the engine version in the Administrate tab and test the application.
Enjoy!
Public Beta
Today, 13 April 2010, I launched the public beta of Akshell. Here is a quick overview of the current Akshell environment.
Ready Tools
These tools should be used in everyday Akshell development.
ak is the basic Akshell library, the foundation of all applications. The documentation describes it in detail.
form is a form-handling library, a port of the Django forms library.
log is a logging utility. It's useful for debugging.
markdown is a library for processing the Markdown language. It's employed in the blog application, which you are using right now. By the way, the blog code is a good example of a common Akshell application.
Work in Progress Tools
These and other tools should make Akshell environment really handy and pleasant.
guard should enable a user to control access of applications to the user's data stored in other applications.
profile should store user profiles and provide an API for accessing them.
config should store configuration information.
All tools are open, their Mercurial repositories are hosted on bitbucket. If you are interested in the development of the environment, you are welcome to join it. Just write me to anton@akshell.com.
Enjoy.