Contact
Icon for product Typewriter

Typewriter

An ML-powered engine to generate type annotations for JavaScript code using graph neural networks. The types can then be used to catch bugs and/or autocomplete code.

ML engine
graph neural nets
NLP
static analysis
View online

Features

Icon for data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MiIgaGVpZ2h0PSI2MSIgdmlld0JveD0iMCAwIDYyIDYxIj4KICAgIDxnIGZpbGw9IiNGRkQ0NzIiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgPHBhdGggZD0iTTQ0LjQxOCA2MUgzLjMzQTMuMzE1IDMuMzE1IDAgMCAxIDAgNTcuNjczdi00NS43NWEzLjMxNSAzLjMxNSAwIDAgMSAzLjMzMS0zLjMyOGg4Ljk3NmMuNTU2IDAgLjkyNi4zNy45MjYuOTI1IDAgLjU1NC0uMzcuOTI0LS45MjYuOTI0SDMuMzMxYTEuNDYgMS40NiAwIDAgMC0xLjQ4IDEuNDc5djQ1Ljc1YTEuNDYgMS40NiAwIDAgMCAxLjQ4IDEuNDc5aDQxLjA4N2ExLjQ2IDEuNDYgMCAwIDAgMS40OC0xLjQ4di00NS43NWExLjQ2IDEuNDYgMCAwIDAtMS40OC0xLjQ3OGgtOS45MDJjLS41NTUgMC0uOTI1LS4zNy0uOTI1LS45MjQgMC0uNTU1LjM3LS45MjUuOTI1LS45MjVoOS45MDJhMy4zMTUgMy4zMTUgMCAwIDEgMy4zMzEgMy4zMjh2NDUuNzVBMy4zMTUgMy4zMTUgMCAwIDEgNDQuNDE4IDYxeiIvPgogICAgICAgIDxwYXRoIGQ9Ik0zNC41MTYgMTQuMDQ4SDEyLjMwN2MtLjU1NSAwLS45MjUtLjM3LS45MjUtLjkyNFY2LjM3N2MwLS41NTQuMzctLjkyNC45MjUtLjkyNGgyMi4yMWMuNTU1IDAgLjkyNS4zNy45MjUuOTI0djYuODRjMCAuNDYyLS4zNy44MzEtLjkyNi44MzF6TTEzLjIzMyAxMi4ySDMzLjU5VjcuMzAySDEzLjIzM1YxMi4yeiIvPgogICAgICAgIDxwYXRoIGQ9Ik0zMC41MzcgNy4zMDJjLS41NTUgMC0uOTI1LS4zNy0uOTI1LS45MjVWNC43MTRhMi44ODEgMi44ODEgMCAwIDAtMi44NjktMi44NjZoLTYuNjYyYTIuODgxIDIuODgxIDAgMCAwLTIuODcgMi44NjZ2MS42NjNjMCAuNTU1LS4zNy45MjUtLjkyNC45MjUtLjU1NiAwLS45MjYtLjM3LS45MjYtLjkyNVY0LjcxNEMxNS4zNjEgMi4xMjYgMTcuNDkgMCAyMC4wODEgMGg2LjY2MmMyLjU5MSAwIDQuNzIgMi4xMjYgNC43MiA0LjcxNHYxLjY2M2MwIC40NjItLjM3LjkyNS0uOTI2LjkyNXpNNjAuMTUgNDcuODc2aC04LjUxNGMtLjU1NSAwLS45MjYtLjM3LS45MjYtLjkyNFYyMC45OGMwLTIuMDMzIDEuNjY2LTMuNzkgMy43OTQtMy43OWgyLjg3YzIuMDM1IDAgMy43OTMgMS42NjUgMy43OTMgMy43OXYyNS45NzJjLS4wOTIuNDYyLS40NjMuOTI0LTEuMDE4LjkyNHptLTcuNTg5LTEuODQ5aDYuNjYzVjIwLjk4YzAtMS4wMTYtLjgzMy0xLjk0LTEuOTQzLTEuOTRoLTIuODdjLTEuMDE3IDAtMS45NDIuODMxLTEuOTQyIDEuOTR2MjUuMDQ3aC4wOTJ6Ii8+CiAgICAgICAgPHBhdGggZD0iTTU1Ljg5MyA2MWMtLjM3IDAtLjc0LS4yNzctLjkyNi0uNjQ3TDUwLjcxIDQ3LjIyOWMtLjE4NS0uNDYyLjA5My0xLjAxNy41NTYtMS4yMDIuNDYyLS4xODUgMS4wMTguMDkzIDEuMjAzLjU1NWwzLjQyNCAxMC40NDQgMy4zMy0xMC4zNTJjLjE4Ni0uNDYyLjY0OS0uNzQgMS4yMDQtLjU1NC40NjMuMTg1Ljc0LjY0Ny41NTUgMS4yMDFsLTQuMjU3IDEzLjEyNGMtLjA5Mi4yNzgtLjQ2Mi41NTUtLjgzMi41NTV6TTYwLjE1IDI1Ljc4NmgtOC41MTRjLS41NTUgMC0uOTI2LS4zNy0uOTI2LS45MjRzLjM3LS45MjQuOTI2LS45MjRoOC41MTNjLjU1NSAwIC45MjYuMzcuOTI2LjkyNCAwIC41NTUtLjM3LjkyNC0uOTI2LjkyNHpNMTMuNzg4IDM0LjAxMmgtLjE4NWMtLjI3OCAwLS40NjMtLjE4NS0uNjQ4LS40NjJsLTIuNDk4LTQuMTZjLS4yNzgtLjQ2MS0uMDkzLTEuMDE2LjI3Ny0xLjI5My40NjMtLjI3NyAxLjAxOC0uMDkyIDEuMjk2LjI3N2wxLjk0MyAzLjIzNSA2Ljc1NS01LjYzOGMuMzctLjM3IDEuMDE4LS4yNzcgMS4yOTYuMDkzLjM3LjM3LjI3NyAxLjAxNi0uMDkzIDEuMjk0bC03LjU4OCA2LjM3N2MtLjA5Mi4xODUtLjM3LjI3Ny0uNTU1LjI3N3pNNDMuMjE1IDIzLjM4M0gyOS44OWMtLjU1NiAwLS45MjYtLjM3LS45MjYtLjkyNHMuMzctLjkyNC45MjYtLjkyNGgxMy4zMjVjLjU1NSAwIC45MjUuMzcuOTI1LjkyNCAwIC41NTUtLjM3LjkyNC0uOTI1LjkyNHpNNDMuMjE1IDI5LjM5SDI5Ljg5Yy0uNTU2IDAtLjkyNi0uMzY5LS45MjYtLjkyMyAwLS41NTUuMzctLjkyNS45MjYtLjkyNWgxMy4zMjVjLjU1NSAwIC45MjUuMzcuOTI1LjkyNSAwIC40NjItLjM3LjkyNC0uOTI1LjkyNHpNNDMuMjE1IDM1LjMwNkgyOS44OWMtLjU1NiAwLS45MjYtLjM3LS45MjYtLjkyNCAwLS41NTUuMzctLjkyNC45MjYtLjkyNGgxMy4zMjVjLjU1NSAwIC45MjUuMzcuOTI1LjkyNHMtLjM3LjkyNC0uOTI1LjkyNHpNNDMuMjE1IDQxLjMxNEgyOS44OWMtLjU1NiAwLS45MjYtLjM3LS45MjYtLjkyNSAwLS41NTQuMzctLjkyNC45MjYtLjkyNGgxMy4zMjVjLjU1NSAwIC45MjUuMzcuOTI1LjkyNCAwIC41NTUtLjM3LjkyNS0uOTI1LjkyNXpNNDMuMjE1IDQ3LjMyMUgyOS44OWMtLjU1NiAwLS45MjYtLjM3LS45MjYtLjkyNCAwLS41NTUuMzctLjkyNC45MjYtLjkyNGgxMy4zMjVjLjU1NSAwIC45MjUuMzcuOTI1LjkyNCAwIC40NjItLjM3LjkyNC0uOTI1LjkyNHpNNDMuMjE1IDUzLjIzNkgyOS44OWMtLjU1NiAwLS45MjYtLjM3LS45MjYtLjkyNHMuMzctLjkyNC45MjYtLjkyNGgxMy4zMjVjLjU1NSAwIC45MjUuMzcuOTI1LjkyNCAwIC41NTUtLjM3LjkyNC0uOTI1LjkyNHoiLz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTE2LjEwMSA0MC4yOTdjLTEuOTQzIDAtMy43OTQtLjQ2Mi01LjU1Mi0xLjQ3OS0yLjQ5OC0xLjQ3OS00LjM0OS0zLjg4Mi01LjA5LTYuNjU0LS40NjItMS42NjQtLjQ2Mi0zLjUxMi0uMDkyLTUuMjY5LjA5My0uNDYyLjY0OC0uODMxIDEuMTEtLjczOS40NjMuMDkyLjgzMy42NDcuNzQgMS4xMS0uMzcgMS40NzgtLjI3NyAyLjg2NC4wOTMgNC4zNDMuNjQ4IDIuMzEgMi4xMjkgNC4zNDQgNC4yNTcgNS41NDYgMi4xMjkgMS4yMDEgNC41MzQgMS41NyA2Ljk0LjkyNCAyLjMxNC0uNjQ3IDQuMzUtMi4xMjYgNS41NTMtNC4yNTIuMjc3LS40NjIuODMzLS41NTQgMS4yOTUtLjM3LjQ2My4yNzguNTU1LjgzMi4zNyAxLjI5NS0xLjQ4IDIuNDk1LTMuODg2IDQuMzQzLTYuNjYyIDUuMDgzLTEuMDE4LjM3LTIuMDM2LjQ2Mi0yLjk2Mi40NjJ6TTI2LjAwMyAzMi4zNDhoLS4xODVjLS40NjMtLjA5Mi0uODMzLS42NDYtLjc0LTEuMTA5LjI3Ny0xLjM4Ni4yNzctMi44NjUtLjA5My00LjI1MS0xLjI5NS00Ljg5OS02LjI5Mi03Ljc2NC0xMS4xOTctNi40Ny0yLjQwNi42NDctNC4zNSAyLjEyNi01LjU1MiA0LjI1Mi0uMjc4LjQ2Mi0uODMzLjU1NC0xLjI5Ni4zNy0uNDYyLS4yNzgtLjU1NS0uODMyLS4zNy0xLjI5NSAxLjQ4LTIuNTg3IDMuODg3LTQuMzQzIDYuNzU1LTUuMTc1IDUuODMtMS41NzIgMTEuODQ1IDEuOTQgMTMuNDE4IDcuNzYzLjQ2MyAxLjY2NC40NjMgMy40Mi4wOTMgNS4xNzYtLjA5My40NjItLjQ2My43NC0uODMzLjc0eiIvPgogICAgICAgICAgICA8cGF0aCBkPSJNNy40MDMgMjUuMjMyYy0uNDYzIDAtLjkyNS0uMzctLjkyNS0uODMybC0uMTg1LTMuOTc0YzAtLjU1NS4zNy0uOTI0LjgzMi0xLjAxNy41NTYgMCAuOTI2LjM3IDEuMDE4LjgzMmwuMTg1IDMuOTc0Yy4wOTMuNTU1LS4zNyAxLjAxNy0uOTI1IDEuMDE3LjA5MyAwIDAgMCAwIDB6Ii8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik03LjQwMyAyNS4yMzJjLS40NjMgMC0uODMzLS4zNy0uOTI1LS44MzItLjA5My0uNDYyLjI3Ny0uOTI0LjgzMi0xLjAxN2wzLjcwMi0uNDYyYy40NjMtLjA5Mi45MjUuMjc3IDEuMDE4LjgzMi4wOTIuNDYyLS4yNzguOTI0LS44MzMgMS4wMTdsLTMuNzAxLjQ2MmgtLjA5M3pNMjEuMDA2IDM1Ljc2OGMtLjQ2MyAwLS44MzMtLjM3LS45MjUtLjgzMi0uMDkzLS40NjIuMjc3LS45MjQuODMyLTEuMDE2bDMuNzk0LS40NjJjLjQ2My0uMDkzLjkyNi4yNzcgMS4wMTguODMxLjA5My40NjMtLjI3Ny45MjUtLjgzMiAxLjAxN2wtMy43OTQuNDYyaC0uMDkzeiIvPgogICAgICAgICAgICA8cGF0aCBkPSJNMjQuOTg1IDM5LjE4OGEuOTI3LjkyNyAwIDAgMS0uOTI1LS45MjRsLS4xODUtMy44ODJjMC0uNTU1LjM3LS45MjQuOTI1LS45MjRzLjkyNS4zNy45MjUuOTI0bC4xODUgMy44ODJjMCAuNDYyLS4zNy45MjQtLjkyNS45MjQuMDkzIDAgMCAwIDAgMHoiLz4KICAgICAgICA8L2c+CiAgICAgICAgPHBhdGggZD0iTTIzLjg3NSA1My4yMzZINi4xMDdjLS41NTUgMC0uOTI1LS4zNy0uOTI1LS45MjR2LTYuMDA3YzAtLjU1NS4zNy0uOTI1LjkyNS0uOTI1aDE3Ljc2OGMuNTU1IDAgLjkyNS4zNy45MjUuOTI1djYuMDA3YzAgLjU1NS0uMzcuOTI0LS45MjUuOTI0ek03LjAzMyA1MS4zODhoMTUuOTE2di00LjE2SDcuMDMzdjQuMTZ6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=
Build a large training set by instrumenting repos with tests
Icon for data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCIgdmlld0JveD0iMCAwIDYwIDYwIj4KICAgIDxwYXRoIGZpbGw9IiM2RkQwOEQiIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTU2IDhoLTJWNGE0IDQgMCAwIDAtNC00SDEwYTQgNCAwIDAgMC00IDR2NEg0YTQgNCAwIDAgMC00IDR2MzRhNCA0IDAgMCAwIDQgNGgxOS42NTZsLTIuNCA4SDE5djJoMjJ2LTJoLTIuMjU1bC0uNi0yLjAwN2ExNi45IDE2LjkgMCAwIDAgOS40NTUtMi45NzdsNS44NjIgNS44NjFBMy44NTQgMy44NTQgMCAwIDAgNTYuMTcgNjAgMy44MzQgMy44MzQgMCAwIDAgNjAgNTYuMTdhMy44NTMgMy44NTMgMCAwIDAtMS4xMjMtMi43MDdMNTUuNDE0IDUwSDU2YTQgNCAwIDAgMCA0LTRWMTJhNCA0IDAgMCAwLTQtNHpNMiAxMmEyIDIgMCAwIDEgMi0yaDJ2MzBoMlY0YTIgMiAwIDAgMSAyLTJoNDBhMiAyIDAgMCAxIDIgMnYyMmgyVjEwaDJhMiAyIDAgMCAxIDIgMnYzMGgtMy4yODFhMTcgMTcgMCAxIDAtMzMuNDM4IDBIMlYxMnptMzYgNDJjLTguMjg0IDAtMTUtNi43MTYtMTUtMTUgMC04LjI4NCA2LjcxNi0xNSAxNS0xNSA4LjI4NCAwIDE1IDYuNzE2IDE1IDE1LS4wMSA4LjI4LTYuNzIgMTQuOTktMTUgMTV6TTIgNDZ2LTJoMTkuNzUzYTE2LjkgMTYuOSAwIDAgMCAxLjg0NyA0SDRhMiAyIDAgMCAxLTItMnptMjEuMzQ0IDEybDIuMjMxLTcuNDM2YTE2Ljk0NSAxNi45NDUgMCAwIDAgMTAuNDQ4IDUuMzExTDM2LjY1NyA1OEgyMy4zNDR6TTU4IDU2LjE3Yy4wMDEuNDg1LS4xOTIuOTUxLS41MzcgMS4yOTNhMS44OCAxLjg4IDAgMCAxLTIuNTg2IDBsLTUuNjkzLTUuNjkyYy45Mi0uODA5IDEuNzUtMS43MTQgMi40NzctMi43bDUuOCA1LjhjLjM0NS4zNDQuNTM5LjgxMi41MzkgMS4yOTl6TTU4IDQ2YTIgMiAwIDAgMS0yIDJoLTIuNTg2bC0uNjMzLS42MzNBMTYuODc0IDE2Ljg3NCAwIDAgMCA1NC4yNDcgNDRINTh2MnpNMTIgNmgtMlY0aDJ2MnptNCAwaC0yVjRoMnYyem00IDBoLTJWNGgydjJ6bS0xMCA0VjhoNDB2MkgxMHptMTYuNiAxNC41bC0xLjczMSAxYTEgMSAwIDEgMC0xLjM2OSAxLjM2N2wtMSAxLjczMWEzIDMgMCAxIDEgNC4xLTQuMXYuMDAyem0tNy41NTMgOS4wMDljLjQzLjI4Ni44ODQuNTM1IDEuMzU3Ljc0M2wtLjggMS44MzJhMTAuNyAxMC43IDAgMCAxLS45NTgtLjQ3OWwtMS43MTMgMS43MTNhMSAxIDAgMCAxLTEuNDE0IDBsLTIuODMtMi44M2ExIDEgMCAwIDEgMC0xLjQxNEwxNC40IDMxLjM2YTEwLjc4NyAxMC43ODcgMCAwIDEtLjk4Ni0yLjM2SDExYTEgMSAwIDAgMS0xLTF2LTRhMSAxIDAgMCAxIDEtMWgyLjQxNGMuMjMzLS44MjMuNTYyLTEuNjE1Ljk4Mi0yLjM2bC0xLjcxMy0xLjcxM2ExIDEgMCAwIDEgMC0xLjQxNGwyLjgzLTIuODNhMSAxIDAgMCAxIDEuNDE0IDBMMTguNjQgMTYuNGExMC43ODcgMTAuNzg3IDAgMCAxIDIuMzYtLjk4NlYxM2ExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXYyLjQxNGMuODIzLjIzMyAxLjYxNS41NjIgMi4zNi45ODJsMS43MTMtMS43MTNhMSAxIDAgMCAxIDEuNDE0IDBsMi44MyAyLjgzYTEgMSAwIDAgMSAwIDEuNDE0bC0yLjI3IDIuMjctMS40MTQtMS40MTRMMzMuMiAxOC4yMmwtMS40Mi0xLjQyLTEuNTYzIDEuNTYzYTEgMSAwIDAgMS0xLjI2Mi4xMjVBOC44MjEgOC44MjEgMCAwIDAgMjUuOCAxNy4xOGExIDEgMCAwIDEtLjgtLjk4VjE0aC0ydjIuMmExIDEgMCAwIDEtLjguOTggOC44MjEgOC44MjEgMCAwIDAtMy4xNTQgMS4zMTIgMSAxIDAgMCAxLTEuMjYyLS4xMjVMMTYuMjIgMTYuOGwtMS40MiAxLjQyIDEuNTYzIDEuNTYzYTEgMSAwIDAgMSAuMTI1IDEuMjYyIDguODE5IDguODE5IDAgMCAwLTEuMzA3IDMuMTU1IDEgMSAwIDAgMS0uOTgxLjhIMTJ2MmgyLjJhMSAxIDAgMCAxIC45ODEuOCA4LjgxOSA4LjgxOSAwIDAgMCAxLjMxMSAzLjE1NCAxIDEgMCAwIDEtLjEyNSAxLjI2MkwxNC44IDMzLjc4bDEuNDIgMS40MiAxLjU2My0xLjU2M2ExIDEgMCAwIDEgMS4yNjItLjEyOWwuMDAyLjAwMXptMi40NTMtMy4xODJsLTEgMS43MzNhNyA3IDAgMSAxIDkuMzM0LTkuOTIxbC0xLjY2OCAxLjEwNmE1IDUgMCAxIDAtNi42NjYgNy4wODJ6TTQ3LjkgMjBINTB2MmgtMi4xMTFjLS4wMTcuMDgzLS4wMjcuMTY5LS4wNDguMjUxbC0xLjkzNi0uNWEzLjAxOCAzLjAxOCAwIDAgMC0uNzg3LTIuODc5IDMuMDg5IDMuMDg5IDAgMCAwLTQuMjQ2LjAxQTMuMDEgMy4wMSAwIDAgMCA0MCAyMWgtMmMwLS45OC4yODgtMS45NC44MjktMi43NTdsLTEuNDg2LTEuNDg2IDEuNDE0LTEuNDE0IDEuNDg4IDEuNDg4QTQuOTYgNC45NiAwIDAgMSA0MiAxNi4xVjE0aDJ2Mi4xYTQuOTgzIDQuOTgzIDAgMCAxIDEuNzU2LjcyNmwxLjQ4Ny0xLjQ4NiAxLjQxNCAxLjQxNC0xLjQ4OCAxLjQ4OEE0Ljk2IDQuOTYgMCAwIDEgNDcuOSAyMHpNMzggMjZjLTcuMTggMC0xMyA1LjgyLTEzIDEzczUuODIgMTMgMTMgMTMgMTMtNS44MiAxMy0xM2MtLjAwOC03LjE3Ni01LjgyNC0xMi45OTItMTMtMTN6bTAgMjRjLTYuMDc1IDAtMTEtNC45MjUtMTEtMTFzNC45MjUtMTEgMTEtMTEgMTEgNC45MjUgMTEgMTFjLS4wMDcgNi4wNzItNC45MjggMTAuOTkzLTExIDExem0tMy0xM2gydjJoLTJ2LTJ6bTQgMGgydjJoLTJ2LTJ6bTcuNDQ1LS44MzJMNDUgMzcuMTMyVjM3YTcgNyAwIDEgMC0xNCAwdi4xMzJsLTEuNDQ1LS45NjQtMS4xMSAxLjY2NEwzMSAzOS41MzVWNDBhMyAzIDAgMCAwIDMgM3YuNDY1bC0yLjU1NSAxLjcgMS4xMSAxLjY2NEwzNCA0NS44NjhWNDZhMSAxIDAgMCAwIDEgMWg2YTEgMSAwIDAgMCAxLTF2LS4xMzJsMS40NDUuOTY0IDEuMTEtMS42NjRMNDIgNDMuNDY1VjQzYTMgMyAwIDAgMCAzLTN2LS40NjVsMi41NTUtMS43LTEuMTEtMS42Njd6TTQzIDQwYTEgMSAwIDAgMS0xIDFoLTFhMSAxIDAgMCAwLTEgMXYzaC00di0zYTEgMSAwIDAgMC0xLTFoLTFhMSAxIDAgMCAxLTEtMXYtM2E1IDUgMCAwIDEgMTAgMHYzeiIvPgo8L3N2Zz4K
Runtime tracing to annotate training set
Icon for data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NSIgaGVpZ2h0PSI2MSIgdmlld0JveD0iMCAwIDY1IDYxIj4KICAgIDxnIGZpbGw9IiM1Q0M2RkYiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgPHBhdGggZD0iTTU3LjQxNy4xOEg3LjU4M0MzLjc5Mi4xOC44MTMgMy4yMy44MTMgNi45MDZ2MzUuNjE0YzAgMy43NjcgMy4wNjkgNi43MjggNi43NyA2LjcyOGgxOS43NzFjLjM2MSAwIC42MzIuMjY5LjYzMi42Mjd2My4yM2MwIC4yNjktLjE4LjUzOC0uNTQyLjUzOC00LjA2Mi42MjgtNi45NSAxLjg4NC02Ljk1IDMuNDA5IDAgMi4wNjMgNS4zMjUgMy43NjggMTIuMDA2IDMuNzY4IDYuNjggMCAxMi4wMDctMS43MDUgMTIuMDA3LTMuNzY4IDAtMS41MjUtMi43OTktMi43OC02Ljk1MS0zLjQwOS0uMjcxIDAtLjU0Mi0uMjY5LS41NDItLjUzOHYtMy4yM2MwLS4zNTguMjctLjYyNy42MzItLjYyN2gxOS43N2MzLjc5MiAwIDYuNzcyLTMuMDUgNi43NzItNi43MjhWNi45MDdjMC0zLjc2Ny0yLjk4LTYuNzI4LTYuNzcxLTYuNzI4em0yLjQzNyA0Mi4zNGEyLjQyIDIuNDIgMCAwIDEtMi40MzcgMi40MjNINy41ODNhMi40MiAyLjQyIDAgMCAxLTIuNDM3LTIuNDIyVjYuOTA3YTIuNDIgMi40MiAwIDAgMSAyLjQzNy0yLjQyMmg0OS44MzRhMi40MiAyLjQyIDAgMCAxIDIuNDM3IDIuNDIydjM1LjYxNHoiLz4KICAgICAgICA8cGF0aCBkPSJNMjAuNDkzIDM5Ljc0VjI5LjUxM2MwLS45ODctLjgxMi0xLjcwNC0xLjcxNS0xLjcwNC0uOTkzIDAtMS43MTUuODA3LTEuNzE1IDEuNzA0VjM5LjY1YzAgLjk4Ny44MTIgMS43MDQgMS43MTUgMS43MDQuOTAzLjA5IDEuNzE1LS43MTcgMS43MTUtMS42MTR6TTI5LjYxMSAzOS43NFYyMS4yNmMwLS45ODYtLjgxMi0xLjcwNC0xLjcxNS0xLjcwNC0uOTkzIDAtMS43MTUuODA3LTEuNzE1IDEuNzA0djE4LjM5YzAgLjk4Ny44MTIgMS43MDQgMS43MTUgMS43MDQuOTkzLjA5IDEuNzE1LS43MTcgMS43MTUtMS42MTR6TTM4LjgyIDM5Ljc0di03Ljg5NGMwLS45ODctLjgxMy0xLjcwNS0xLjcxNi0xLjcwNS0uOTkzIDAtMS43MTUuODA4LTEuNzE1IDEuNzA1djcuODk0YzAgLjk4Ni44MTIgMS43MDQgMS43MTUgMS43MDRzMS43MTUtLjgwNyAxLjcxNS0xLjcwNHpNNDQuNTA3IDkuODY4VjM5LjY1YzAgLjk4Ny44MTIgMS43MDQgMS43MTUgMS43MDRzMS43MTUtLjgwNyAxLjcxNS0xLjcwNFY5Ljg2OGMwLS45ODctLjgxMi0xLjcwNS0xLjcxNS0xLjcwNXMtMS43MTUuODA4LTEuNzE1IDEuNzA1eiIvPgogICAgPC9nPgo8L3N2Zz4K
Represented code as graphs
Icon for data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NSIgaGVpZ2h0PSI2MiIgdmlld0JveD0iMCAwIDY1IDYyIj4KICAgIDxwYXRoIGZpbGw9IiNGRkREOTIiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTI4LjE2Ny4zOTRoOC42NjZ2MjguMjhoLTguNjY2Vi4zOTV6bS0xMyA4LjcwMmg4LjY2NnYxOS41NzloLTguNjY2VjkuMDk1em0zOSAyLjE3NWg4LjY2NnYxNy40MDRoLTguNjY2VjExLjI3em0tNTIgNS40MzloOC42NjZ2MTEuOTY1SDIuMTY3VjE2Ljcxem0zOSAyLjE3NWg4LjY2NnY5Ljc5aC04LjY2NnYtOS43OXpNMS4xMiAyOS43NjJINjMuODhjLjYyIDAgMS4xMjEuNDcgMS4xMjEgMS4wNTJ2LjA3MmMwIC41ODMtLjUgMS4wNTItMS4xMjEgMS4wNTJoLTIuMzcybC02LjMyMyA2LjM1LTEuMDE3IDEuMDIydi0xLjUzOGwuMjUxLS4yNTMgNS41NTctNS41ODFoLTEuNTMybC00LjI3NiA0LjI5M3YtMS41MzhsMi43NDQtMi43NTVoLTEuNTMybC0xLjIxMiAxLjIxN3YtMS4yMTdoLTUuNjZsLTYuMzIzIDYuMzUtMS4wMTcgMS4wMjJ2LTEuNTM4bC4yNTEtLjI1MyA1LjU1Ny01LjU4MWgtMS41MzJsLTQuMjc2IDQuMjkzdi0xLjUzOGwyLjc0NC0yLjc1NWgtMS41MzJsLTEuMjEyIDEuMjE3di0xLjIxN2gtNS42NmwtNi4zMjMgNi4zNS0xLjAxNyAxLjAyMnYtMS41MzhsLjI1MS0uMjUzIDUuNTU3LTUuNTgxaC0xLjUzMmwtNC4yNzYgNC4yOTN2LTEuNTM4bDIuNzQ0LTIuNzU1aC0xLjUzMmwtMS4yMTIgMS4yMTd2LTEuMjE3aC01LjY2bC02LjMyMyA2LjM1LTEuMDE3IDEuMDIydi0xLjUzOGwuMjUxLS4yNTMgNS41NTctNS41ODFoLTEuNTMybC00LjI3NiA0LjI5M3YtMS41MzhsMi43NDQtMi43NTVoLTEuNTMybC0xLjIxMiAxLjIxN3YtMS4yMTdoLTQuMzM0djEuNDEzbC04LjY2NiA4LjcwMXYtMS41MzhsOC41NDEtOC41NzZIOS4xNzdsLTcuMDEgNy4wMzh2LTEuNTM4bDUuNDc4LTUuNUg2LjExM0wyLjE2NyAzNS45di0xLjUzOGwyLjQxNC0yLjQyNEgzLjA0OWwtLjg4Mi44ODZ2LS44ODZIMS4xMmMtLjYyIDAtMS4xMjEtLjQ3LTEuMTIxLTEuMDUydi0uMDcyYzAtLjU4Mi41LTEuMDUyIDEuMTIxLTEuMDUyem0yMi43MTIgMi4zODR2MS41MzhsLTYuMTE3IDYuMTQyLTEuNTMyIDEuNTM4LTEuMDE3IDEuMDIydi0xLjUzOGwuMjUxLS4yNTMgMS41MzItMS41MzggNi44ODMtNi45MTF6bTEzIDB2MS41MzhsLTYuMTE3IDYuMTQyLTEuNTMyIDEuNTM4LTEuMDE3IDEuMDIydi0xLjUzOGwuMjUxLS4yNTMgMS41MzItMS41MzggNi44ODMtNi45MTF6bTEzIDB2MS41MzhsLTYuMTE3IDYuMTQyLTEuNTMyIDEuNTM4LTEuMDE3IDEuMDIydi0xLjUzOGwuMjUxLS4yNTMgMS41MzItMS41MzggNi44ODMtNi45MTF6bTEzIDB2MS41MzhsLTYuMTE3IDYuMTQyLTEuNTMyIDEuNTM4LTEuMDE3IDEuMDIydi0xLjUzOGwuMjUxLS4yNTMgMS41MzItMS41MzggNi44ODMtNi45MTF6bS01MiAyLjc0M3YxLjUzOGwtOC40OTcgOC41MzIuMDMyLjAzMWgtLjIwMXYtMS40bDguNjY2LTguNzAxem0xMyAuMzMzdjEuNTM4bC00LjU4NSA0LjYwNC00LjA4MSA0LjA5OHYtMS41MzhsMS43ODMtMS43OSAxLjUzMi0xLjUzOSA1LjM1MS01LjM3M3ptMTMgMHYxLjUzOGwtNC41ODUgNC42MDQtNC4wODEgNC4wOTh2LTEuNTM4bDEuNzgzLTEuNzkgMS41MzItMS41MzkgNS4zNTEtNS4zNzN6bTEzIDB2MS41MzhsLTQuNTg1IDQuNjA0LTEuNDQ1IDEuNDUxaC0xLjUzMmwuNjgtLjY4MiAxLjUzMS0xLjUzOCA1LjM1MS01LjM3M3ptMTMgMHYxLjUzOGwtNC41ODUgNC42MDQtNC4wODEgNC4wOTh2LTEuNTM4bDEuNzgzLTEuNzkgMS41MzItMS41MzkgNS4zNTEtNS4zNzN6bS01MiAyLjc0M3YxLjUzOEw1LjM2OCA0NC45OUgzLjgzNmw2Ljk5Ny03LjAyNXptMTMgLjMzM3YxLjUzOWwtMy4wNTMgMy4wNjUtNS42MTMgNS42MzZWNDdsNC44NDctNC44NjcgMy44Mi0zLjgzNXptMTMgMHYxLjUzOWwtMy4wNTMgMy4wNjUtNS42MTMgNS42MzZWNDdsNC44NDctNC44NjcgMy44Mi0zLjgzNXptMTMgMHYxLjUzOWwtMi45NjYgMi45NzhoLTEuNTMybC42OC0uNjgyIDMuODE4LTMuODM1em0xMyAwdjEuNTM5bC0zLjA1MyAzLjA2NS01LjYxMyA1LjYzNlY0N2w0Ljg0Ny00Ljg2NyAzLjgyLTMuODM1em0tNTIgMi43NDN2MS41MzhMOC40MzIgNDQuOTlINi45bDMuOTMzLTMuOTQ5em0xMyAuMzM0djEuNTM4bC0xLjUyMSAxLjUyNy03LjE0NSA3LjE3N3YtMS41NGw2LjM4LTYuNDA2IDIuMjg2LTIuMjk2em0xMyAwdjEuNTM4bC0xLjUyMSAxLjUyNy03LjE0NSA3LjE3N3YtMS41NGw2LjM4LTYuNDA2IDIuMjg2LTIuMjk2em0xMyAwdjEuNDRINDguNGwxLjQzNC0xLjQ0em0xMyAwdjEuNTM4bC0xLjUyMSAxLjUyNy01Ljk2MyA1Ljk4OWgtMS4xODJ2LS4zNTNsNi4zOC02LjQwNSAyLjI4Ni0yLjI5NnptLTUyIDIuNzQ0di44NzFoLS44NjdsLjg2Ny0uODd6bTEzIC4zMzJ2MS41MzhsLTYuNTg2IDYuNjE1aC0xLjUzMmw3LjM2My03LjM5NS43NTUtLjc1OHptMTMgMHYxLjUzOGwtOC42NjYgOC43MDR2LTEuNTM4bDcuOTExLTcuOTQ2Ljc1NS0uNzU4em0yNiAwdjEuNTM4bC00LjQyIDQuNDRoLTEuNTMybDUuMTk3LTUuMjIuNzU1LS43NTh6bS0zOSAzLjA3NnYxLjUzOGwtMy41MjUgMy41NGgtMS41M2w1LjA1NS01LjA3OHptMTMgMHYxLjUzOGwtOC42NjYgOC43MDR2LTEuNTM4bDguNjY2LTguNzA0em0yNiAwdjEuNTM4bC0xLjM1OCAxLjM2NGgtMS41MzJsMi44OS0yLjkwMnptLTM5IDMuMDc2djEuNTM4bC0uNDYuNDYzSDIxLjg0bDEuOTkzLTJ6bTEzIDB2MS41MzhsLTguNjY2IDguNzA0di0xLjUzOGw4LjY2Ni04LjcwNHptMCAzLjA3OXYxLjUzOGwtNi4wNjIgNi4wODZIMjkuMjRsNy41OTQtNy42MjR6bTAgMy4wNzZ2MS41MzhsLTIuOTk4IDMuMDFoLTEuNTMybDQuNTMtNC41NDh6bTAgMy4wNzZ2MS40NzJoLTEuNDY2bDEuNDY2LTEuNDcyeiIvPgo8L3N2Zz4K
Static analysis to enrich graph with more edges
Icon for data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NyIgaGVpZ2h0PSI2MSIgdmlld0JveD0iMCAwIDY3IDYxIj4KICAgIDxnIGZpbGw9IiNGNDhENkIiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgPHBhdGggZD0iTTYzLjg2IDh2Mi4yMzZhMi4wNzMgMi4wNzMgMCAwIDEgMS4wNDYgMS43OTR2NDAuNjM1YzAgMS4xNS0uOTM3IDIuMDg0LTIuMDk0IDIuMDg0SDQuMTg4YTIuMDg5IDIuMDg5IDAgMCAxLTIuMDk0LTIuMDg0VjEyLjAzYy4wMDEtLjc0MS40LTEuNDI1IDEuMDQ3LTEuNzk0VjhBNC4xNzUgNC4xNzUgMCAwIDAgMCAxMi4wM3Y0MC42MzVjLjAwMyAyLjMgMS44NzYgNC4xNjUgNC4xODggNC4xNjdoMjAuNDE0djIuMDg0aC01LjIzNWMtLjU3OCAwLTEuMDQ3LjQ2Ny0xLjA0NyAxLjA0MiAwIC41NzYuNDY5IDEuMDQyIDEuMDQ3IDEuMDQyaDI4LjI2NmMuNTc4IDAgMS4wNDctLjQ2NiAxLjA0Ny0xLjA0MiAwLS41NzUtLjQ2OS0xLjA0Mi0xLjA0Ny0xLjA0MmgtNS4yMzV2LTIuMDg0aDIwLjQxNGMyLjMxMi0uMDAyIDQuMTg1LTEuODY3IDQuMTg4LTQuMTY3VjEyLjAzQTQuMTc1IDQuMTc1IDAgMCAwIDYzLjg2IDh6TTQwLjMwNCA1OC45MTZoLTEzLjYxdi0yLjA4NGgxMy42MXYyLjA4NHoiLz4KICAgICAgICA8cGF0aCBkPSJNNjAuOTQ0IDUyYy41ODMgMCAxLjA1Ni0uNDc1IDEuMDU2LTEuMDYxVjMuMTg0QTMuMTYgMy4xNiAwIDAgMCA1OC44NzMgMEg4LjEyN0EzLjE2IDMuMTYgMCAwIDAgNSAzLjE4NHY0Ny43NTVDNSA1MS41MjUgNS40NzMgNTIgNi4wNTYgNTJoNTQuODg4ek03LjExMSAzLjE4NGExLjA0IDEuMDQgMCAwIDEgMS4wMTYtMS4wNjJoNTAuNzQ2YTEuMDQgMS4wNCAwIDAgMSAxLjAxNiAxLjA2MlY4LjQ5SDcuMTExVjMuMTg0em0wIDcuNDI4SDU5Ljg5djM5LjI2Nkg3LjExVjEwLjYxMnoiLz4KICAgICAgICA8cGF0aCBkPSJNNTYgNGgtMmExIDEgMCAwIDAgMCAyaDJhMSAxIDAgMCAwIDAtMnpNNTAgNGgtMmExIDEgMCAwIDAgMCAyaDJhMSAxIDAgMCAwIDAtMnpNMzAgMzZoLTRjLTEuMTA1IDAtMiAuOTM4LTIgMi4wOTV2Ni44MWMwIDEuMTU3Ljg5NSAyLjA5NSAyIDIuMDk1aDRjMS4xMDUgMCAyLS45MzggMi0yLjA5NXYtNi44MUMzMiAzNi45MzggMzEuMTA1IDM2IDMwIDM2em0wIDguOTA1aC00di02LjgxaDR2Ni44MXpNNDEgMzFoLTRjLTEuMTA1IDAtMiAuOTI0LTIgMi4wNjV2MTEuODdjMCAxLjE0Ljg5NSAyLjA2NSAyIDIuMDY1aDRjMS4xMDUgMCAyLS45MjQgMi0yLjA2NXYtMTEuODdjMC0xLjE0LS44OTUtMi4wNjUtMi0yLjA2NXptMCAxMy45MzVoLTR2LTExLjg3aDR2MTEuODd6TTUxIDI2aC00Yy0xLjEwNSAwLTIgLjk2LTIgMi4xNDZ2MTcuNzA4YzAgMS4xODUuODk1IDIuMTQ2IDIgMi4xNDZoNGMxLjEwNSAwIDItLjk2IDItMi4xNDZWMjguMTQ2QzUzIDI2Ljk2MSA1Mi4xMDUgMjYgNTEgMjZ6bTAgMTkuODU0aC00VjI4LjE0Nmg0djE3LjcwOHpNMjAgMzloLTRjLTEuMTA1IDAtMiAuOTU1LTIgMi4xMzN2My43MzRjMCAxLjE3OC44OTUgMi4xMzMgMiAyLjEzM2g0YzEuMTA1IDAgMi0uOTU1IDItMi4xMzN2LTMuNzM0QzIyIDM5Ljk1NSAyMS4xMDUgMzkgMjAgMzl6bTAgNS44NjdoLTR2LTMuNzM0aDR2My43MzR6TTM1LjM4IDIyYS41MS41MSAwIDAgMCAuNDI0LS4yMzguNjA1LjYwNSAwIDAgMCAuMDY3LS41MTJsLS40NTctMS40MjdhLjU5LjU5IDAgMCAxIC4xOTgtLjY1bDEuMTYtLjg1NmEuNTg4LjU4OCAwIDAgMCAuMjA1LS42My41MjYuNTI2IDAgMCAwLS40OTYtLjM5OGgtMS41MWEuNTI0LjUyNCAwIDAgMS0uNDktLjM3OGwtLjQ5MS0xLjUzM0EuNTI0LjUyNCAwIDAgMCAzMy41IDE1YS41MjQuNTI0IDAgMCAwLS40OS4zNzhsLS40OTEgMS41MzNhLjUyNC41MjQgMCAwIDEtLjQ5LjM3OGgtMS41MWEuNTI2LjUyNiAwIDAgMC0uNDk2LjM5Ny41ODguNTg4IDAgMCAwIC4yMDQuNjMxbDEuMTYuODU1YS41OS41OSAwIDAgMSAuMi42NWwtLjQ1OCAxLjQyOGEuNjA1LjYwNSAwIDAgMCAuMDY3LjUxMi41MS41MSAwIDAgMCAuNDI0LjIzOC40ODYuNDg2IDAgMCAwIC4yOS0uMWwxLjI5OS0uOTU2YS40ODUuNDg1IDAgMCAxIC41ODIgMGwxLjI5OS45NTZjLjA4NS4wNjUuMTg2LjEuMjkuMXpNNDUuMjQzIDE4LjYwNmwuNDYzLjMyOGEuNjEuNjEgMCAwIDEgLjIxMi42ODVsLS4yLjU5OGEuNjI2LjYyNiAwIDAgMCAuMDY3LjUzNGMuMS4xNTYuMjY1LjI0OS40NC4yNDlhLjUwNC41MDQgMCAwIDAgLjI5NC0uMDk4bC42ODYtLjQ4NmEuNTA0LjUwNCAwIDAgMSAuNTkgMGwuNjg2LjQ4NmMuMDg3LjA2My4xODkuMDk3LjI5NC4wOTguMTc1IDAgLjM0LS4wOTMuNDQtLjI1YS42MjYuNjI2IDAgMCAwIC4wNjYtLjUzM2wtLjE5OS0uNTk4YS42MS42MSAwIDAgMSAuMjEyLS42ODVsLjQ2My0uMzI4YS42MDguNjA4IDAgMCAwIC4yMi0uNjU0LjU0NS41NDUgMCAwIDAtLjUxNS0uNDE2aC0uNjk1YS41NDIuNTQyIDAgMCAxLS41MDYtLjM4NmwtLjI1NS0uNzY1QS41NDIuNTQyIDAgMCAwIDQ3LjUgMTZhLjU0Mi41NDIgMCAwIDAtLjUwNi4zODVsLS4yNTUuNzY1YS41NDIuNTQyIDAgMCAxLS41MDYuMzg2aC0uNjk1YS41NDUuNTQ1IDAgMCAwLS41MTYuNDE2LjYwOC42MDggMCAwIDAgLjIyMS42NTR6TTE2LjI0MyAxOC42MDZsLjQ2My4zMjhhLjYxLjYxIDAgMCAxIC4yMTIuNjg1bC0uMi41OThhLjYyNi42MjYgMCAwIDAgLjA2Ny41MzRjLjEuMTU2LjI2NS4yNDkuNDQuMjQ5YS41MDQuNTA0IDAgMCAwIC4yOTQtLjA5OGwuNjg2LS40ODZhLjUwNC41MDQgMCAwIDEgLjU5IDBsLjY4Ni40ODZjLjA4Ny4wNjMuMTg5LjA5Ny4yOTQuMDk4LjE3NSAwIC4zNC0uMDkzLjQ0LS4yNWEuNjI2LjYyNiAwIDAgMCAuMDY2LS41MzNsLS4xOTktLjU5OGEuNjEuNjEgMCAwIDEgLjIxMi0uNjg1bC40NjMtLjMyOGEuNjA4LjYwOCAwIDAgMCAuMjItLjY1NC41NDUuNTQ1IDAgMCAwLS41MTUtLjQxNmgtLjY5NWEuNTQyLjU0MiAwIDAgMS0uNTA2LS4zODZsLS4yNTUtLjc2NUEuNTQyLjU0MiAwIDAgMCAxOC41IDE2YS41NDIuNTQyIDAgMCAwLS41MDYuMzg1bC0uMjU1Ljc2NWEuNTQyLjU0MiAwIDAgMS0uNTA2LjM4NmgtLjY5NWEuNTQ1LjU0NSAwIDAgMC0uNTE2LjQxNi42MDguNjA4IDAgMCAwIC4yMjEuNjU0eiIvPgogICAgPC9nPgo8L3N2Zz4K
Optimisations for traiing and execution performance

Screenshots

Context

Types are useful in programming languages - they help to prevent bugs, guide development (e.g. autocompletion), and guide optimizations. Nonetheless, dynamically typed languages have remained popular for several reasons. There is a growing trend towards adding partial type annotations to dynamic languages, for example TypeScript for JavaScript and mypy for Python.

Adding type annotations to a large existing codebase can be challenging, and there are two main approaches: tracing execution of the code to find out what the actual types are at run-time, and static analysis to infer types from a set of initial annotations.

Limits

The training data and task architecture limit the types that can be predicted to concrete types. Handling named types would be a more complex task.

Going to market with this was hard because we've struggled to find JavaScript developers that knew enough about types to understand the point, and yet were not already typing their code manually with TypeScript. In retrospect, we should have looked for a potential customer or partner looking to add types to a untyped JavaScript codebase (instead of focusing on people starting new apps).

Potential

The project achieved a high accuracy on predicting concrete types for sample Javascript code. There are several possible potential applications for this tool.

The first and most obvious is the prediction of types for migration from Javascript to TypeScript or Python to mypy. It could be used in cases where runtime tracing is not straightforward (e.g. when interacting with an external API) or where formal type inference fails due to missing initial annotations or the presence of bugs that cause inference of conflicting types.

Alternatively, such type inference could be used to improve interactive development tools, for example by ordering autocomplete suggestions according to their predicted type. This would require some additional work to allow the system to deal with incomplete source code.

Leveraged Technologies