diff --git a/apps/cory/index.json b/apps/cory/index.json
index ab71a309..9d0c463a 100644
--- a/apps/cory/index.json
+++ b/apps/cory/index.json
@@ -1 +1 @@
-{"type":"tildefriends-app","files":{"app.js":"&qvp1qQcymJp9pWxnZXA9/VXFt6FRGj9JCAxNCt/afsU=.sha256","index.html":"&vMOt54ko7CqKGDOaFkozfGwOoCU4QbL2+JE9r4/zDAk=.sha256","vue-material.js":"&K5cdLqXYCENPak/TCINHQhyJhpS4G9DlZHGwoh/LF2g=.sha256","tf-user.js":"&V9Ol799hM6i1PZDbAS91CMhgx7aENDTJnT+KrwK4Lh4=.sha256","tf-message.js":"&e811GqoyT6JhNrgXA1rCB/Y7ggtbOz2xcZP5+rQrrws=.sha256"}}
\ No newline at end of file
+{"type":"tildefriends-app","files":{"app.js":"&qvp1qQcymJp9pWxnZXA9/VXFt6FRGj9JCAxNCt/afsU=.sha256","index.html":"&sXphZUl6JQm0Cd4UOVqPZu13PDhqQqFk/EOmKneaEhY=.sha256","vue-material.js":"&K5cdLqXYCENPak/TCINHQhyJhpS4G9DlZHGwoh/LF2g=.sha256","tf-user.js":"&V9Ol799hM6i1PZDbAS91CMhgx7aENDTJnT+KrwK4Lh4=.sha256","tf-message.js":"&e811GqoyT6JhNrgXA1rCB/Y7ggtbOz2xcZP5+rQrrws=.sha256","tf.js":"&lYgDJTZaYTvss6Ykzmr3o6KBc6hPFiEzPn6DR3R5Peo=.sha256"}}
\ No newline at end of file
diff --git a/apps/cory/index/index.html b/apps/cory/index/index.html
index 0e58c612..dd102e72 100644
--- a/apps/cory/index/index.html
+++ b/apps/cory/index/index.html
@@ -9,90 +9,8 @@
+
-
diff --git a/apps/cory/index/tf.js b/apps/cory/index/tf.js
new file mode 100644
index 00000000..b7d3635d
--- /dev/null
+++ b/apps/cory/index/tf.js
@@ -0,0 +1,83 @@
+"use strict";
+var g_data = {
+ whoami: null,
+ connections: [],
+ messages: [],
+ users: {},
+ broadcasts: [],
+ showUsers: false,
+ show_connect_dialog: false,
+ show_user_dialog: null,
+ connect: null,
+ pubs: [],
+ votes: [],
+ apps: {},
+ share_app: null,
+};
+
+var g_data_initial = JSON.parse(JSON.stringify(g_data));
+window.addEventListener('message', function(event) {
+ var key = Object.keys(event.data)[0];
+ if (key + 's' in g_data && Array.isArray(g_data[key + 's'])) {
+ g_data[key + 's'].push(event.data[key]);
+ } else if (key == 'user') {
+ Vue.set(g_data.users, event.data.user.user, Object.assign({}, g_data.users[event.data.user.user] || {}, event.data.user.about));
+ } else if (key == 'followers') {
+ if (!g_data.users[event.data.followers.id]) {
+ Vue.set(g_data.users, event.data.followers.id, {});
+ }
+ Vue.set(g_data.users[event.data.followers.id], 'followers', event.data.followers.users);
+ } else if (key == 'following') {
+ if (!g_data.users[event.data.following.id]) {
+ Vue.set(g_data.users, event.data.following.id, {});
+ }
+ Vue.set(g_data.users[event.data.following.id], 'following', event.data.following.users);
+ } else if (key == 'broadcasts') {
+ g_data.broadcasts = event.data.broadcasts;
+ } else if (key == 'pubs') {
+ g_data.pubs = event.data.pubs;
+ } else if (key == 'apps') {
+ g_data.apps = event.data.apps;
+ } else if (key == 'clear') {
+ Object.keys(g_data_initial).forEach(function(key) {
+ Vue.set(g_data, key, JSON.parse(JSON.stringify(g_data_initial[key])));
+ });
+ } else {
+ g_data[key] = event.data[key];
+ }
+});
+window.addEventListener('load', function() {
+ Vue.use(VueMaterial.default);
+ var vue = new Vue({
+ el: '#app',
+ data: g_data,
+ methods: {
+ post_message: function() {
+ if (g_data.share_app) {
+ window.parent.postMessage({share_app: {
+ app: g_data.apps[g_data.share_app],
+ name: g_data.share_app,
+ text: document.getElementById('post_text').value,
+ }}, '*');
+ } else {
+ window.parent.postMessage({post: document.getElementById('post_text').value}, '*');
+ }
+ document.getElementById('post_text').value = '';
+ },
+ ssb_connect: function(connection) {
+ window.parent.postMessage({connect: connection}, '*');
+ },
+ content_json: function(message) {
+ try {
+ return JSON.parse(message.content);
+ } catch {
+ return undefined;
+ }
+ },
+ refresh: function() {
+ window.parent.postMessage({refresh: true}, '*');
+ },
+ }
+ });
+ window.parent.postMessage('ready', '*');
+});
\ No newline at end of file