CINXE.COM
Teletype for Atom
<!DOCTYPE html> <html lang="en" prefix="og: http://ogp.me/ns#"> <head><script type="text/javascript" src="/_static/js/bundle-playback.js?v=HxkREWBo" charset="utf-8"></script> <script type="text/javascript" src="/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script> <script>window.RufflePlayer=window.RufflePlayer||{};window.RufflePlayer.config={"autoplay":"on","unmuteOverlay":"hidden"};</script> <script type="text/javascript" src="/_static/js/ruffle/ruffle.js"></script> <script type="text/javascript"> __wm.init("https://web.archive.org/web"); __wm.wombat("https://teletype.atom.io/","20211128022042","https://web.archive.org/","web","/_static/", "1638066042"); </script> <link rel="stylesheet" type="text/css" href="/_static/css/banner-styles.css?v=S1zqJCYt" /> <link rel="stylesheet" type="text/css" href="/_static/css/iconochive.css?v=3PDvdIFv" /> <!-- End Wayback Rewrite JS Include --> <meta charset="utf-8"> <script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"844a840367","applicationID":"13323906","transactionName":"c1cMREAKXVRcRhpBVlxdFklCAB5RV1BQTQ==","queueTime":2,"applicationTime":5,"agent":""}</script> <script type="text/javascript">(window.NREUM||(NREUM={})).init={ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"844a840367",applicationID:"13323906"};window.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var i=e[n]={exports:{}};t[n][0].call(i.exports,function(e){var i=t[n][1][e];return r(i||e)},i,i.exports)}return e[n].exports}if("function"==typeof __nr_require)return __nr_require;for(var i=0;i<n.length;i++)r(n[i]);return r}({1:[function(t,e,n){function r(){}function i(t,e,n,r){return function(){return s.recordSupportability("API/"+e+"/called"),o(t+e,[u.now()].concat(c(arguments)),n?null:this,r),n?void 0:this}}var o=t("handle"),a=t(10),c=t(11),f=t("ee").get("tracer"),u=t("loader"),s=t(4),d=NREUM;"undefined"==typeof window.newrelic&&(newrelic=d);var p=["setPageViewName","setCustomAttribute","setErrorHandler","finished","addToTrace","inlineHit","addRelease"],l="api-",v=l+"ixn-";a(p,function(t,e){d[e]=i(l,e,!0,"api")}),d.addPageAction=i(l,"addPageAction",!0),d.setCurrentRouteName=i(l,"routeName",!0),e.exports=newrelic,d.interaction=function(){return(new r).get()};var m=r.prototype={createTracer:function(t,e){var n={},r=this,i="function"==typeof e;return o(v+"tracer",[u.now(),t,n],r),function(){if(f.emit((i?"":"no-")+"fn-start",[u.now(),r,i],n),i)try{return e.apply(this,arguments)}catch(t){throw f.emit("fn-err",[arguments,this,t],n),t}finally{f.emit("fn-end",[u.now()],n)}}}};a("actionText,setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","),function(t,e){m[e]=i(v,e)}),newrelic.noticeError=function(t,e){"string"==typeof t&&(t=new Error(t)),s.recordSupportability("API/noticeError/called"),o("err",[t,u.now(),!1,e])}},{}],2:[function(t,e,n){function r(t){if(NREUM.init){for(var e=NREUM.init,n=t.split("."),r=0;r<n.length-1;r++)if(e=e[n[r]],"object"!=typeof e)return;return e=e[n[n.length-1]]}}e.exports={getConfiguration:r}},{}],3:[function(t,e,n){var r=!1;try{var i=Object.defineProperty({},"passive",{get:function(){r=!0}});window.addEventListener("testPassive",null,i),window.removeEventListener("testPassive",null,i)}catch(o){}e.exports=function(t){return r?{passive:!0,capture:!!t}:!!t}},{}],4:[function(t,e,n){function r(t,e){var n=[a,t,{name:t},e];return o("storeMetric",n,null,"api"),n}function i(t,e){var n=[c,t,{name:t},e];return o("storeEventMetrics",n,null,"api"),n}var o=t("handle"),a="sm",c="cm";e.exports={constants:{SUPPORTABILITY_METRIC:a,CUSTOM_METRIC:c},recordSupportability:r,recordCustom:i}},{}],5:[function(t,e,n){function r(){return c.exists&&performance.now?Math.round(performance.now()):(o=Math.max((new Date).getTime(),o))-a}function i(){return o}var o=(new Date).getTime(),a=o,c=t(12);e.exports=r,e.exports.offset=a,e.exports.getLastTimestamp=i},{}],6:[function(t,e,n){function r(t){return!(!t||!t.protocol||"file:"===t.protocol)}e.exports=r},{}],7:[function(t,e,n){function r(t,e){var n=t.getEntries();n.forEach(function(t){"first-paint"===t.name?p("timing",["fp",Math.floor(t.startTime)]):"first-contentful-paint"===t.name&&p("timing",["fcp",Math.floor(t.startTime)])})}function i(t,e){var n=t.getEntries();if(n.length>0){var r=n[n.length-1];if(f&&f<r.startTime)return;p("lcp",[r])}}function o(t){t.getEntries().forEach(function(t){t.hadRecentInput||p("cls",[t])})}function a(t){if(t instanceof g&&!y){var e=Math.round(t.timeStamp),n={type:t.type};e<=l.now()?n.fid=l.now()-e:e>l.offset&&e<=Date.now()?(e-=l.offset,n.fid=l.now()-e):e=l.now(),y=!0,p("timing",["fi",e,n])}}function c(t){"hidden"===t&&(f=l.now(),p("pageHide",[f]))}if(!("init"in NREUM&&"page_view_timing"in NREUM.init&&"enabled"in NREUM.init.page_view_timing&&NREUM.init.page_view_timing.enabled===!1)){var f,u,s,d,p=t("handle"),l=t("loader"),v=t(9),m=t(3),g=NREUM.o.EV;if("PerformanceObserver"in window&&"function"==typeof window.PerformanceObserver){u=new PerformanceObserver(r);try{u.observe({entryTypes:["paint"]})}catch(h){}s=new PerformanceObserver(i);try{s.observe({entryTypes:["largest-contentful-paint"]})}catch(h){}d=new PerformanceObserver(o);try{d.observe({type:"layout-shift",buffered:!0})}catch(h){}}if("addEventListener"in document){var y=!1,w=["click","keydown","mousedown","pointerdown","touchstart"];w.forEach(function(t){document.addEventListener(t,a,m(!1))})}v(c)}},{}],8:[function(t,e,n){function r(t,e){if(!i)return!1;if(t!==i)return!1;if(!e)return!0;if(!o)return!1;for(var n=o.split("."),r=e.split("."),a=0;a<r.length;a++)if(r[a]!==n[a])return!1;return!0}var i=null,o=null,a=/Version\/(\S+)\s+Safari/;if(navigator.userAgent){var c=navigator.userAgent,f=c.match(a);f&&c.indexOf("Chrome")===-1&&c.indexOf("Chromium")===-1&&(i="Safari",o=f[1])}e.exports={agent:i,version:o,match:r}},{}],9:[function(t,e,n){function r(t){function e(){t(c&&document[c]?document[c]:document[o]?"hidden":"visible")}"addEventListener"in document&&a&&document.addEventListener(a,e,i(!1))}var i=t(3);e.exports=r;var o,a,c;"undefined"!=typeof document.hidden?(o="hidden",a="visibilitychange",c="visibilityState"):"undefined"!=typeof document.msHidden?(o="msHidden",a="msvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(o="webkitHidden",a="webkitvisibilitychange",c="webkitVisibilityState")},{}],10:[function(t,e,n){function r(t,e){var n=[],r="",o=0;for(r in t)i.call(t,r)&&(n[o]=e(r,t[r]),o+=1);return n}var i=Object.prototype.hasOwnProperty;e.exports=r},{}],11:[function(t,e,n){function r(t,e,n){e||(e=0),"undefined"==typeof n&&(n=t?t.length:0);for(var r=-1,i=n-e||0,o=Array(i<0?0:i);++r<i;)o[r]=t[e+r];return o}e.exports=r},{}],12:[function(t,e,n){e.exports={exists:"undefined"!=typeof window.performance&&window.performance.timing&&"undefined"!=typeof window.performance.timing.navigationStart}},{}],ee:[function(t,e,n){function r(){}function i(t){function e(t){return t&&t instanceof r?t:t?u(t,f,a):a()}function n(n,r,i,o,a){if(a!==!1&&(a=!0),!l.aborted||o){t&&a&&t(n,r,i);for(var c=e(i),f=m(n),u=f.length,s=0;s<u;s++)f[s].apply(c,r);var p=d[w[n]];return p&&p.push([b,n,r,c]),c}}function o(t,e){y[t]=m(t).concat(e)}function v(t,e){var n=y[t];if(n)for(var r=0;r<n.length;r++)n[r]===e&&n.splice(r,1)}function m(t){return y[t]||[]}function g(t){return p[t]=p[t]||i(n)}function h(t,e){l.aborted||s(t,function(t,n){e=e||"feature",w[n]=e,e in d||(d[e]=[])})}var y={},w={},b={on:o,addEventListener:o,removeEventListener:v,emit:n,get:g,listeners:m,context:e,buffer:h,abort:c,aborted:!1};return b}function o(t){return u(t,f,a)}function a(){return new r}function c(){(d.api||d.feature)&&(l.aborted=!0,d=l.backlog={})}var f="nr@context",u=t("gos"),s=t(10),d={},p={},l=e.exports=i();e.exports.getOrSetContext=o,l.backlog=d},{}],gos:[function(t,e,n){function r(t,e,n){if(i.call(t,e))return t[e];var r=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,e,{value:r,writable:!0,enumerable:!1}),r}catch(o){}return t[e]=r,r}var i=Object.prototype.hasOwnProperty;e.exports=r},{}],handle:[function(t,e,n){function r(t,e,n,r){i.buffer([t],r),i.emit(t,e,n)}var i=t("ee").get("handle");e.exports=r,r.ee=i},{}],id:[function(t,e,n){function r(t){var e=typeof t;return!t||"object"!==e&&"function"!==e?-1:t===window?0:a(t,o,function(){return i++})}var i=1,o="nr@id",a=t("gos");e.exports=r},{}],loader:[function(t,e,n){function r(){if(!T++){var t=P.info=NREUM.info,e=g.getElementsByTagName("script")[0];if(setTimeout(u.abort,3e4),!(t&&t.licenseKey&&t.applicationID&&e))return u.abort();f(O,function(e,n){t[e]||(t[e]=n)});var n=a();c("mark",["onload",n+P.offset],null,"api"),c("timing",["load",n]);var r=g.createElement("script");0===t.agent.indexOf("http://")||0===t.agent.indexOf("https://")?r.src=t.agent:r.src=v+"://"+t.agent,e.parentNode.insertBefore(r,e)}}function i(){"complete"===g.readyState&&o()}function o(){c("mark",["domContent",a()+P.offset],null,"api")}var a=t(5),c=t("handle"),f=t(10),u=t("ee"),s=t(8),d=t(6),p=t(2),l=t(3),v=p.getConfiguration("ssl")===!1?"http":"https",m=window,g=m.document,h="addEventListener",y="attachEvent",w=m.XMLHttpRequest,b=w&&w.prototype,E=!d(m.location);NREUM.o={ST:setTimeout,SI:m.setImmediate,CT:clearTimeout,XHR:w,REQ:m.Request,EV:m.Event,PR:m.Promise,MO:m.MutationObserver};var x=""+location,O={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-1212.min.js"},M=w&&b&&b[h]&&!/CriOS/.test(navigator.userAgent),P=e.exports={offset:a.getLastTimestamp(),now:a,origin:x,features:{},xhrWrappable:M,userAgent:s,disabled:E};if(!E){t(1),t(7),g[h]?(g[h]("DOMContentLoaded",o,l(!1)),m[h]("load",r,l(!1))):(g[y]("onreadystatechange",i),m[y]("onload",r)),c("mark",["firstbyte",a.getLastTimestamp()],null,"api");var T=0}},{}],"wrap-function":[function(t,e,n){function r(t,e){function n(e,n,r,f,u){function nrWrapper(){var o,a,s,p;try{a=this,o=d(arguments),s="function"==typeof r?r(o,a):r||{}}catch(l){i([l,"",[o,a,f],s],t)}c(n+"start",[o,a,f],s,u);try{return p=e.apply(a,o)}catch(v){throw c(n+"err",[o,a,v],s,u),v}finally{c(n+"end",[o,a,p],s,u)}}return a(e)?e:(n||(n=""),nrWrapper[p]=e,o(e,nrWrapper,t),nrWrapper)}function r(t,e,r,i,o){r||(r="");var c,f,u,s="-"===r.charAt(0);for(u=0;u<e.length;u++)f=e[u],c=t[f],a(c)||(t[f]=n(c,s?f+r:r,i,f,o))}function c(n,r,o,a){if(!v||e){var c=v;v=!0;try{t.emit(n,r,o,e,a)}catch(f){i([f,n,r,o],t)}v=c}}return t||(t=s),n.inPlace=r,n.flag=p,n}function i(t,e){e||(e=s);try{e.emit("internal-error",t)}catch(n){}}function o(t,e,n){if(Object.defineProperty&&Object.keys)try{var r=Object.keys(t);return r.forEach(function(n){Object.defineProperty(e,n,{get:function(){return t[n]},set:function(e){return t[n]=e,e}})}),e}catch(o){i([o],n)}for(var a in t)l.call(t,a)&&(e[a]=t[a]);return e}function a(t){return!(t&&t instanceof Function&&t.apply&&!t[p])}function c(t,e){var n=e(t);return n[p]=t,o(t,n,s),n}function f(t,e,n){var r=t[e];t[e]=c(r,n)}function u(){for(var t=arguments.length,e=new Array(t),n=0;n<t;++n)e[n]=arguments[n];return e}var s=t("ee"),d=t(11),p="nr@original",l=Object.prototype.hasOwnProperty,v=!1;e.exports=r,e.exports.wrapFunction=c,e.exports.wrapInPlace=f,e.exports.argsToArray=u},{}]},{},["loader"]);</script> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Teletype for Atom</title> <link rel="canonical" href="https://web.archive.org/web/20211128022042/https://teletype.atom.io/"/> <link rel="shortcut icon" href="/web/20211128022042im_/https://teletype.atom.io/favicon.ico"/> <meta property="og:url" content="https://web.archive.org/web/20211128022042/https://teletype.atom.io/"/> <meta property="og:site_name" content="teletype.atom.io"/> <meta property="og:type" content="website"/> <meta property="og:title" content="Code together in real time in Atom"/> <meta property="og:description" content="Teletype for Atom lets developers share their workspace with team members and collaborate on code in real time."/> <meta property="og:image" content="https://web.archive.org/web/20211128022042im_/https://blog.atom.io/img/posts/teletype/teletype.png"/> <link rel="stylesheet" media="all" href="https://web.archive.org/web/20211128022042cs_/https://github-atom-io-herokuapp-com.freetls.fastly.net/assets/teletype-6deb18331b18438e5786a2b210f3def9695a0928cd8fcc505819d2a198daaa7c.css"/> <script src="https://web.archive.org/web/20211128022042js_/https://github-atom-io-herokuapp-com.freetls.fastly.net/assets/teletype-5096b51d28ba0a1c96941a82f679807e2912fe4b762b4cac2bba8014f751850b.js" media="all"></script> </head> <body> <section class="section hero"> <div class="wrapper wrapper--full"> <header class="header"> <!-- Inline SVG so the icon can be styled with CSS --> <svg class="logo" viewbox="0 0 116 106" aria-label="Atom"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g transform="translate(2.000000, 2.000000)"> <path stroke="currentColor" stroke-width="3.5" stroke-linecap="round" d="M76.189086,44.0856189 C89.2231104,70.8500357 91.9124709,96.0721711 82.0341519,101.11376 C71.8486126,106.314623 52.1597207,88.0926784 38.0575146,60.4151933 C23.9553084,32.7377081 20.7806971,6.08525653 30.9662365,0.885970525 C35.4012393,-1.37856533 41.6386021,0.799236909 48.4305372,6.26187771"></path> <path stroke="currentColor" stroke-width="3.5" stroke-linecap="round" d="M11.7756915,62.476615 C4.17997299,58.5368926 -0.244183357,53.7922806 0.0104217322,48.8892012 C0.602928639,37.5171948 26.1514492,29.6016632 57.0733946,31.2067353 C87.9953399,32.8133764 112.582019,43.3334237 111.989512,54.7054302 C111.733335,59.6085096 106.83926,63.8683051 98.8757784,67"></path> <path stroke="currentColor" stroke-width="3.5" stroke-linecap="round" d="M43.8264623,92.4624337 C35.5466486,98.4730696 28.1774106,100.668354 23.5681106,97.6598844 C14.0266558,91.4349207 19.916404,65.2743138 36.7236579,39.2271746 C53.5309117,13.1816113 74.8910444,-2.88667479 84.4324992,3.33986485 C88.8678339,6.23329102 89.9680476,13.4337617 88.1876447,22.9272253"></path> <path fill="currentColor" d="M64.8406718,49.5222731 C65.6570438,53.3004613 63.2558557,57.024333 59.4775391,57.8406772 C55.6992225,58.6570215 51.9752241,56.255915 51.1588521,52.4777269 C50.3440777,48.6995387 52.7436682,44.975667 56.5219849,44.1593228 C60.2987039,43.3429785 64.0227022,45.744085 64.8406718,49.5222731"></path> </g> </g> </svg> </header> </div> <div class="wrapper intro"> <h2>Collaborate in real time in Atom </h2> <p><strong>Teletype<sup>(beta)</sup> for Atom</strong> lets developers share their workspace with team members and collaborate on code in real time.</p> <p><a href="#getting-started">Get started</a></p> </div> </section> <section id="demo" class="section"> <div class="wrapper wrapper--full wrapper--video"> <div class="video-container"> <video id="video" class="video" preload="auto" poster="https://web.archive.org/web/20211128022042im_/https://github-atom-io-herokuapp-com.freetls.fastly.net/assets/real-time-video-poster-6e00586e2837c850797ec62036588f1c3e25448ad232edd2f883cda4ec646431.png"> <source src="/web/20211128022042im_/https://teletype.atom.io/videos/real-time.mp4" type="video/mp4"> </video> <div id="video-hud" class="video-hud"> <button id="video-button" class="video-play-button mega-octicon octicon-playback-play" aria-label="Play video"></button> </div> </div> </div> </section> <section id="portals" class="section"> <div class="wrapper"> <h2>Code better, together</h2> <p>Working on code together in real time is valuable for knowledge sharing and producing quality software. The <strong>Teletype</strong> package for Atom aspires to make it as easy for developers to code together as it is for them to code alone.</p> <p>Teletype introduces the concept of <strong>real-time "portals"</strong> for sharing workspaces. When a host opens a portal, their active tab becomes a shared workspace. There, invited collaborators can join in and make edits in real time. As the host moves between files, collaborators follow along with the active tab automatically.</p> <p class="is-centered"><img class="img" src="https://web.archive.org/web/20211128022042im_/https://github-atom-io-herokuapp-com.freetls.fastly.net/assets/real-time-portals-dcfec872971fec784360f3bc88e34f05f4ed93eb15455170aa15395b0e6cfabd.svg"/></p> </div> </section> <section id="privacy" class="section"> <div class="wrapper"> <h2>How code gets shared</h2> <p>Each portal comes to life in two steps:</p> <ol class="privacy-list"> <li> <p class="privacy-img-wrapper"><img class="privacy-img" src="https://web.archive.org/web/20211128022042im_/https://github-atom-io-herokuapp-com.freetls.fastly.net/assets/real-time-privacy-1-6716562012c4719c30a03a2773421032c854bfd1d211e2cf73fb3deba9d6f81e.svg"/></p> <p>First you connect to our servers to see who is collaborating. 馃憢 Hi there.</p> </li> <li> <p class="privacy-img-wrapper"><img class="privacy-img" src="https://web.archive.org/web/20211128022042im_/https://github-atom-io-herokuapp-com.freetls.fastly.net/assets/real-time-privacy-2-e213c9dd844a6445b7e9ad6f7dda39b104a74b5fcbfd47fc1ef9c38f0ec20eaf.svg"/></p> <p>After that, collaborators share code directly with each other (<strong>peer-to-peer</strong>).</p> </li> </ol> <p>There's no centralized server to spy on your keystrokes, and Teletype uses <strong>WebRTC</strong> to encrypt all communication between collaborators. What happens in the portal stays in the portal.</p> </div> </section> <section id="getting-started" class="section"> <div class="wrapper"> <h2>Getting started</h2> <h4>1. Install Atom</h4> <p>Download and install <a href="https://web.archive.org/web/20211128022042/https://atom.io/">Atom</a>. It's free, open source, and cross-platform. You can use it on Windows, macOS, or Linux.</p> <h4>2. Install Teletype for Atom</h4> <p>Install the <a href="https://web.archive.org/web/20211128022042/atom://settings-view/show-package?package=teletype">teletype</a> package to start collaborating today. If you need help, take a look at <a href="https://web.archive.org/web/20211128022042/https://flight-manual.atom.io/using-atom/sections/atom-packages/">how to install Atom packages</a>.</p> <hr/> <h4>Share a portal</h4> <p>Click the <span class="octicon octicon-radio-tower" aria-label="Teletype"></span> icon in the Atom status bar, and flip the switch to start sharing a portal to your workspace. Then invite people to join your portal by sending them your portal URL.</p> <h4>Join a portal</h4> <p>Once someone has provided you with a link to their portal, simply follow the link to join the portal. The portal opens and all collaborators can edit together in real time.</p> </div> </section> <footer id="feedback" class="section"> <div class="wrapper"> <h2>Feedback</h2> <p>We welcome your <a href="https://web.archive.org/web/20211128022042/https://github.com/atom/atom/discussions">feedback</a> on this beta release. If you run into any problems, please <a href="https://web.archive.org/web/20211128022042/https://github.com/atom/teletype/issues">open an issue</a> or take a look at the <a href="https://web.archive.org/web/20211128022042/https://github.com/atom/teletype/blob/master/CONTRIBUTING.md">contribution guide</a> and start contributing. </div> <div class="wrapper love"> <a class="love" href="https://web.archive.org/web/20211128022042/https://github.com/"> <span class="octicon octicon-code" aria-label="Made"></span> with <span class="octicon octicon-heart" aria-label="love"></span> by <span class="octicon octicon-logo-github" aria-label="GitHub"></span> </a> </div> </footer> </body> </html> <!-- FILE ARCHIVED ON 02:20:42 Nov 28, 2021 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 10:45:34 Nov 24, 2024. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): captures_list: 0.556 exclusion.robots: 0.032 exclusion.robots.policy: 0.02 esindex: 0.012 cdx.remote: 8.803 LoadShardBlock: 257.556 (3) PetaboxLoader3.datanode: 317.588 (4) PetaboxLoader3.resolve: 237.916 (3) load_resource: 358.962 -->