and receive our newsletter to get the latest news and tips.

what's new?





  • switched the app generation to App Studio and Cordova
  • button plugins can load buttons in the editor
  • set a wallpaper in the hub!
  • set an icon and splash picture art resource on scripts. The icon is displayed on all searches.
  • support for Python pip in app->import. TouchDevelop creates a Python virtual environment and install the required pip packages.

December 2014

  • group scripts allow multiple users to collaborate on a single script
  • app→import allows to import Node.JS npm or Apache Cordova plugins.
app → import("npm", "azure-storage", "*")

November 2014

  • An awesome new tutorial with super-cool videos that explain every step!
  • beta only: real time multi user editing of [group scripts](/group scripts)!!!
  • beta only: different editor modes for different users: try the block mode and pro mode

October 2014

  • when publishing, add a release note from the publish dialog
  • fork scripts and send a pull request
  • go to now works for [extension actions](/extension actions) and libraries
  • drag and drop of statements in editor (when applicable)
  • libraries are bound a main script which allows to edit a referenced library and still run the script without switching.
  • script comments are automatically loaded for earlier versions
  • documentation can be browsed outside the editor at
  • tutorials and documentation topics are automatically translated using Bing translator based on the browser language
  • the crowd-sourced localization of TouchDevelop has started! Try it out at
  • box→set font family allows to specify the font on a box
  • when renaming a local variable to a name that already exists, the editor proposes to merge the two variables
box → set font family("Georgia")

September 2014

  • new bear and pixel art tutorials leveraging the {stvalidator:...} macros.
  • easy access to app→log through new button.
  • richer logging infrastructure throuugh app→create logger
var logger := app → create logger("my logger")
logger → debug("a debug message")
logger → info("an info message")
logger → info("an error message!")
  • Sprite→fit text wraps the sprite bounding box around the text. Sprite→set text alignment allows to control how the text aligns vertically.
  • new {pici:...} and {sthashtags:...} macros for tutorials.

August 2014

  • comment out now shows up as an option when selecting lines of code
  • uncomment, strip if/for/... are now options when editing block statements
  • when you edit library from a script (which is now also more easily available) it adds a temporary link from the library to the parent script, so it's easier to go back and you can deploy parent script from the library; shortly you'll be also able to run it
  • new APIs: Buffer→concat, Buffer→write number, Buffer→read number, math→div (integer division), DateTime→milliseconds_since_epoch (epoch is, of course, 1970-01-01)
  • tutorials with {stvalidator} now have access to app→editor
  • Windows Phone 8.1 Update 1 is now supported

merging scripts

At the bottom of info pages about published scripts there is now a new merge button. It let's you pick a target script in your account. It will then merge the changes between the common parent of these two scripts.
This feature is beta only.

July 2014

June 2014

var gamepad := senses → gamepads → at(0)
if gamepad → is button pressed("x") then
else ... end if
  • custom validator in tutorials
  • split screen view in editor

May 2014

var js := web → wait for message from parent("")

April 2014

Export to Android

Take your favorite script and turn it into an Android app!

Export to Windows 8.1

We've updated our template and the exported Windows apps are now targeting 8.1.

post and receive messages

For the adventurous, it is now possible to post and receive messages between a TouchDevelop web app and its parent window.
  • post a message
web → post message to parent("", web → json object)
  • listen to incoming messages
web → on received message from parent("http://yourhostdomainname.something", received)
where received(json : Json Object) is

background pictures on boxes

You can efficiently set one or more pictures as the background of a box using box→add background picture. The API does not impact the size of the box.
box → add background picture(pic, "center center", "cover", "no-repeat", "scroll")

hiding the title bar on pages

You can hide the title and subtitle bar on the pages.
wall → show title bar(false)

March 2014

Reorganized tutorials section

As the list of tutorials grew longer and longer, we've reorganized them into categories. Tell us what you think!

OneDrive support

Upload pictures to OneNote easily. The resulting Cloud Picture can be stored in an table or index.
var onedrive pic := cloud storage → upload picture(pic, "public", "")
☹ cannot find 'cloud storage' [TD101]
onedrive pic → post to wall
☹ i cannot find property 'post to wall' on Unknown [TD112]
A Cloud Picture can be stored in tables and indices which allows to share them!

OneNote support

Create new pages in your OneNote with text, pictures and more!
var form := web → create form builder
form → add string("Presentation", "<html><body>Yay!</body></html>")
cloud storage → upload note(form)
☹ i cannot find property 'upload note' on Unknown [TD112]

Arduino Esplora support

Build scripts for the Esplora board using TouchDevelop! Look for the blank esplora template to get started.

February 2014

new refactoring: move to library

Is your script getting too large to manage? Think about using the move to library refactoring support to move related elements of your script into a library.

parallax backgrounds

Create awesome scrolling effects with the background scrolling support.
var scene := board → background scene
var back layer := scene → create layer(0,  nature)
Take a look at this demo from David Renton!

keyboard support

You can listen to key pressed on the keyboard (if available). You can listen to event or simply query for keys.
  • attach an event. It will repeat automatically if the user keeps pressing the key.
senses → on key pressed("space", handler2)
where handler2() is
Do something when space is pressed
  • query the status of a given key
var b := senses → is key pressed("space")

January 2014

page models

Pages now comes with an associated object type to store the data. It is edited together with the page in the data section (see example below). Every time the page is pushed a new instance of the page data is created.
❖ counter : Number
 counter := 0
 counter → post to wall
box → on tapped(handler)
where handler() is
 counter :=  counter + 1
end page


Using time→run after and time→run every, you can schedule a handler of code to run once or at regular intervals.
time → run after(3, perform)
where perform() is
this code will run after 3 seconds of delay
The action time→on every frame allows to register a handler in a built-in game loop timer.
time → on every frame(perform2)
where perform2() is
runs this code many times a second

inline events

We've added inline events for various global events. This means that you can attach (and detach) handlers to the shake event by using senses→on shake:
senses → on shake(handler)
where handler() is
this code runs when the device is shaken!


You can manipulate map pushpins easily: you can move thenm and register code on their on tap event.
var map := maps → create map
var pushpin := map → add text(senses → current location, "Yay!", colors → accent, colors → white)
pushpin → on tap(tapped)
where tapped() is
runs when the user taps the pushpin!

sprite sheets and animations

A sprite sheet is a picture that packs multiple images of an animation. It is commonly used in 2D games to create animations and efficiently package pictures together.
var sheet := board → create sprite sheet( sheet)
var sprite := sheet → create sprite("monster")
Sprite properties such as opacity can be animated using sprite animations.
var anim := sprite  → create animation
anim → fade in(1, "expo")
anim → fade out(1, "quadratic")


The board→create obstacle returns an obstacle. You can change the color or attach to events on the obstacle.
var obstacle := board → create obstacle(0, 0, 100, 100, 1)
  • play a sound when an object bounces
obstacle → on collision(bounce)
where bounce(sprite : Sprite) is
runs when a sprite bounces on the obstacle...
  • remove obstacle
obstacle → delete

other stuff

  • senses→record microphone support through WebRTC
  • improvements in libraries documentation authoring
  • customizable zoom factor for text (look in Settings in the Hub)
  • you can now define your own action types
  • control structures (like for or while) are now displayed with an end keyword at the end. This makes it easy to add stuff after them and makes the scoping clear.

Older release notes