diff --git a/pebblekitjs/pebblekitjs-tests.ts b/pebblekitjs/pebblekitjs-tests.ts
new file mode 100644
index 000000000..f822e0043
--- /dev/null
+++ b/pebblekitjs/pebblekitjs-tests.ts
@@ -0,0 +1,61 @@
+///
+
+var transactionId = Pebble.sendAppMessage({'0': 42, '1': 'String value'},
+ function (e) {
+ console.log('Successfully delivered message with transactionId='
+ + e.data.transactionId);
+ },
+ function (e) {
+ console.log('Unable to deliver message with transactionId='
+ + e.data.transactionId
+ + ' Error is: ' + e.error.message);
+ }
+);
+
+Pebble.addEventListener('appmessage',
+ function (e) {
+ console.log('Received message: ' + JSON.stringify(e.payload));
+ }
+);
+
+Pebble.addEventListener('showConfiguration', function (e) {
+ // Show config page
+ Pebble.openURL('https://my-website.com/config-page.html');
+});
+
+
+Pebble.getTimelineToken(
+ function (token) {
+ console.log('My timeline token is ' + token);
+ },
+ function (error) {
+ console.log('Error getting timeline token: ' + error);
+ }
+);
+
+Pebble.timelineSubscribe('aTopic',
+ function () {
+ console.log('Subscribed to aTopic');
+ },
+ function (errorString) {
+ console.log('Error subscribing to topic: ' + errorString);
+ }
+);
+
+Pebble.timelineUnsubscribe('aTopic',
+ function () {
+ console.log('Unsubscribed from aTopic');
+ },
+ function (errorString) {
+ console.log('Error unsubscribing from topic: ' + errorString);
+ }
+);
+
+Pebble.timelineSubscriptions(
+ function (topics) {
+ console.log('Subscribed to ' + topics.join(', '));
+ },
+ function (errorString) {
+ console.log('Error getting subscriptions: ' + errorString);
+ }
+);
diff --git a/pebblekitjs/pebblekitjs.d.ts b/pebblekitjs/pebblekitjs.d.ts
new file mode 100644
index 000000000..f9cff79df
--- /dev/null
+++ b/pebblekitjs/pebblekitjs.d.ts
@@ -0,0 +1,147 @@
+// Type definitions for PebbleKit JS
+// Project: https://developer.pebble.com/docs/js/Pebble/
+// Definitions by: Makoto Kawasaki
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+declare module PebbleKit {
+
+ interface Error {
+ message: string;
+ }
+
+ interface Event {
+ type: string;
+ payload?: Object;
+ response?: string;
+ }
+
+ interface AppMessageData {
+ transactionId: string;
+ }
+
+ interface AppMessageEvent {
+ data: AppMessageData;
+ error?: Error;
+ }
+
+ /**
+ * Object containing firmware version information.
+ */
+ interface Firmware {
+ major: number;
+ minor: number;
+ patch: number;
+ suffix: string;
+ }
+
+ /**
+ * Object containing information about the currently connected watch,
+ * returned by Pebble.getActiveWatchInfo().
+ * Read the PebbleKit JS guides for complete information on possible values.
+ * @see Pebble.getActiveWatchInfo
+ */
+ interface WatchInfo {
+ platform: string;
+ model: string;
+ language: string;
+ firmware: Firmware;
+ }
+
+ interface Pebble {
+ /**
+ * Adds a listener for Pebble JS events, such as when an AppMessage is received or the configuration view is opened or closed.
+ * @param type The type of the event, from the three described above.
+ * @param callback A developer-defined function to receive any events of the type specified that occur.
+ */
+ addEventListener(type: string, callback: (e: Event) => void): void;
+
+ /**
+ * Remove an existing event listener previously registered with Pebble.addEventListener().
+ * @param type The type of the event listener to be removed.
+ * See Pebble.addEventListener() for a list of available types.
+ * @param callback The existing developer-defined function that was previously registered.
+ * @see addEventListener
+ */
+ removeEventListener(type: string, callback?: (e: Event) => void): void;
+
+ /**
+ * Show a simple modal notification on the connected watch.
+ * @param title The title of the notificati
+ *
+ * @param body The main content of the notification.
+ */
+ showSimpleNotificationOnPebble(title: string, body: string): void;
+
+ /**
+ * Send an AppMessage to the app running on the watch.
+ * Messages should be in the form of JSON objects containing key-value pairs.
+ * @param jsonAppMessage A JSON object containing key-value pairs to send to the watch.
+ * Values in arrays that are greater then 255 will be mod 255 before sending.
+ * @param callbackForAck The developer-defined function to run if the watch acknowledges (ACK) this message.
+ * @param callbackForNack The developer-defined function to run if the watch does not acknowledge (NACK) this message.
+ * @return string
+ */
+ sendAppMessage(jsonAppMessage: Object, callbackForAck?: (e: AppMessageEvent) => void, callbackForNack?: (e: AppMessageEvent) => void): string;
+
+ /**
+ * Get the user's timeline token for this app. This is a string and is unique per user per app.
+ * Note: In order for timeline tokens to be available, the app must be submitted to the Pebble appstore,
+ * but does not need to be public. Read more in the timeline guides
+ * @param successCallback
+ * @param failureCallback
+ */
+ getTimelineToken(successCallback: (token: string) => void, failureCallback: (error: string) => void): void;
+
+ /**
+ * Subscribe the user to a timeline topic for your app.
+ * This can be used to filter the different pins a user could receive according to their preferences,
+ * as well as maintain groups of users.
+ * @param topic The desired topic to be subscribed to. Users will receive all pins pushed to this topic.
+ * @param successCb The developer-defined function to handle a successful subscription attempt.
+ * @param errorCb The developer-defined function to gracefully handle a failed subscription attempt.
+ */
+ timelineSubscribe(topic: string, successCb: () => void, errorCb: (errorString: string) => void): void;
+
+ /**
+ * Unsubscribe a user from a timeline topic for this app. Once unsubscribed,
+ * the user will no longer receive any pins pushed to this topic.
+ * @param topic The topic the user is to be unsubscribed from.
+ * @param successCb The developer-defined function to handle a successful unsubscription attempt.
+ * @param errorCb The developer-defined function to gracefully handle a failed unsubscription attempt.
+ */
+ timelineUnsubscribe(topic: string, successCb: () => void, errorCb: (errorString: string) => void): void;
+
+ /**
+ * Obtain a list of topics that the user is currently subscribed to.
+ * The length of the list should be checked to determine whether the user is subscribed to at least one topic.
+ * @param successCb The developer-defined function to process the retuned list of topic strings.
+ * @param errorCb The developer-defined function to gracefully handle any errors in obtaining the user's subscriptions.
+ */
+ timelineSubscriptions(successCb: (topics: string[]) => void, errorCb: (errorString: string) => void): void;
+
+ /**
+ * Returns a unique account token that is associated with the Pebble account of the current user.
+ * @return WatchInfo
+ */
+ getActiveWatchInfo(): WatchInfo;
+
+ /**
+ * Returns a unique account token that is associated with the Pebble account of the current user.
+ * @return string
+ */
+ getAccountToken(): string;
+
+ /**
+ * Returns a a unique token that can be used to identify a Pebble device.
+ * @return string
+ */
+ getWatchToken(): string;
+
+ /**
+ * to start displaying this webview
+ * @param url
+ */
+ openURL(url: string): void;
+ }
+}
+
+declare var Pebble: PebbleKit.Pebble;