Wrike

Technology used
Application type: single-page application - server has powerful data-only interface that greatly eases addons creation

Frontend technology: ExtJS is used as base framework - it has classic prototype-based type structure that can be easily extended. Own powerful separate layers of business-logic and UI are created which can be easily used by addon.

Addon development tricks
Existing frontend model can be utilized for various tasks - see examples in existing addons

Code to solve some standard tasks: wrikeUtils = { getCurrentUserId : function { return w2.user.getUid; },    currentUserIsResponsibleForTask : function (task) { return task.data["responsibleList" ].indexOf( this .getCurrentUserId) >= 0 ; },    currentUserIsAuthor : function (task) { return (task.get('author' )) === this .getCurrentUserId; },    getTask : function (taskId, callback) { return Wrike.Task.get(taskId, function (task) {        return callback(task);       }); },    getCurrentTaskView : function  { return window .Ext.ComponentMgr.get($('.taskView' ).attr('id' )); },    getCurrentTask : function  { var _ref; return (_ref = this .getCurrentTaskView) != null ? _ref["record" ] : void 0 ; },    onTaskViewRender : function (callback) { var cb, currentTaskView, taskViewClass; cb = function (taskView) { return callback(taskView["record" ], taskView); };      taskViewClass = window .w2.folders.info.task.View; utils.aspect.before(taskViewClass, "showRecord", function {         return cb( this );       }); currentTaskView = this .getCurrentTaskView; if (currentTaskView != null ) { return cb(currentTaskView); }    },     onTaskChange : function (callback) { return utils.aspect.after(Wrike.Task, "getChanges", ( function { return callback( this ); }));    }   };