Source code for website arcusiridis.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.3 KiB

4 years ago
4 years ago
4 years ago
  1. +++
  2. title = "Chatto - A Self Hosted E2EE Chat Application"
  3. date = "2020-06-01T15:02:07+05:30"
  4. disable_comments = true
  5. draft = false
  6. [sidebar]
  7. disable = true
  8. categories = [
  9. "Projects"
  10. ]
  11. tags = [
  12. "java",
  13. "spring-boot",
  14. "hibernate",
  15. "self-hosted",
  16. "e2ee",
  17. "encryption",
  18. "typescript"
  19. ]
  20. [menu]
  21. [menu.main]
  22. parent = "Projects"
  23. name = "Chatto"
  24. +++
  25. Chatto is a self hosted, end to end encrypted chat application.
  26. [Repository](https://git.arcusiridis.com/nova/Chatto)
  27. [Documentation](https://git.arcusiridis.com/nova/Chatto/wiki)
  28. ## Key Features
  29. 1. Open Source, Self Hosted
  30. 2. Messages are encrypted end to end using AES GCM encryption (paramters like keysize can be configured)
  31. 3. No personal information such as names or email required
  32. 4. Does not rely on any external services like auth services, mail servers or captcha services
  33. 5. You are in control of your data.
  34. 6. Backend exposes a JSON API that can be used by third party clients
  35. 7. The chat messages support markdown
  36. ## Technical Features
  37. 1. Made with Java, Spring Boot and Hibernate
  38. 2. Front end is made with Thymeleaf templates and uses AJAX(written in TypeScript) to provide dynamic functionality
  39. 3. All password are stored hashed using Bcrypt
  40. 4. Uses a custom token based authentication scheme making use of Spring Security. Tokens are cached using EhCache
  41. 5. Care has been taken to safeguard against attacks like CSRF and XSS
  42. * Server side cookies are protected against CSRF using CSRF tokens
  43. * To protect the JSON API auth token against XSS, DomPurify is used to sanitize any user provided HTML
  44. * Server side DTO validation is used to sanitize user input
  45. ## Tech Stack
  46. * **Backend** - Java, Spring Boot, Hibernate, Maven
  47. + Database migrations using flyway
  48. * Caching using EhCache
  49. * **Frontend** -
  50. + Server side templating - Thymeleaf
  51. + JS - TypeScript, Browserify (and plugins like tsify), Terser, Grunt, Yarn
  52. * Templating using Handlebars
  53. ## Preview
  54. ### Design
  55. + **Full layout**
  56. <p align="center"> ![Preview](/img/projects/chatto/chatto-preview-main.png)
  57. Design adapted from [bootsnip](https://bootsnipp.com/snippets/nNg98)</p>
  58. + **Mobile layout** <br>
  59. The UI uses bootstrap grid system for a fully responsive layout. This is how it might look on a mobile screen -
  60. <p align="center">![chatto-on-mobile](/img/projects/chatto/chatto-preview-main-2.png)</p>
  61. <!-- <video autoplay loop style=" width: 100% !important;
  62. height: auto !important;">
  63. <source type="video/mp4" src="/img/projects/chatto/chatto-preview-infinite-scroll.mkv">
  64. </source>
  65. </video> -->
  66. ### Infinite scroll
  67. {{< apvid >}}/img/projects/chatto/chatto-preview-infinite-scroll-2.webm{{< /apvid >}}
  68. Decryption takes place on the fly on a background thread using the web worker API for a smooth user experience.
  69. ### E2EE Passphrase
  70. {{< avid >}}/img/projects/chatto/chatto-preview-passphrase.mp4{{</ avid>}}
  71. Note - passphrase is not stored on the server, or anywhere other than client's memory. The app simply checks whether decryption was successful to determine whether the passphrase is correct.
  72. ### Markdown in chat
  73. {{< avid >}}/img/projects/chatto/chatto-preview-markdown.webm{{</ avid>}}
  74. ### User search
  75. {{< apvid >}}/img/projects/chatto/chatto-preview-usersearch.webm{{< /apvid >}}