Ask HN: What tech stack would you use to build an open-source Google Keep clone?
190 points| mud_dauber | 7 years ago | reply
So I'm going to attempt to build my own - despite being a real noob when it comes to JS-based tech stacks. What would you use as a starting point for a tech stack, if you want:
- public/private/sharable card options - import/export to a couple of mainstream alternate formats - reasonable response times - an improvement over downloading the entire DB upon page load - markdown-capable cards - sort/filter/tag options
I'm assuming this is going to be some flavor of Angular/Vue/React. Suggestions?
[+] [-] saulrh|7 years ago|reply
For the frontend, then, we're talking tables and forms. Really simple lowest-common-denominator stuff. Design the API before touching any of the code - that's the only place where "without pulling the entire DB at page load" can happen. Build the backend in something with a safe, stable standard lib or core ecosystem, python or common lisp or the like.
Of course, those are ultimately stretch goals. Like another commenter here said, use whatever you're most comfortable with. On the vast majority of software projects the biggest obstacle is the programmer. I can't really help there because I don't know what you're familiar with. Sorry. Good luck.
[+] [-] insomniacity|7 years ago|reply
(Not linked, just a happy paying user)
[+] [-] tmpfrosreponse|7 years ago|reply
[+] [-] tga|7 years ago|reply
I suggest you figure out what looks interesting to learn and go with it. You can also “outsource” parts e.g. getting storage and backend as a service from something like Firebase, so you can focus only on building the front end.
[+] [-] brobdingnagians|7 years ago|reply
1. good ecosystem for Java libraries on serverside (and mobile) for parsers with Markdown, etc. you could re-use the parsers between mobile & server to reduce dependencies
2. Code re-use on apps for Android & with multiplatform projects you get a lot of re-use for iOS (and swift is pretty similar, so you'd have an easier time porting)
3. Code re-use between the apps and the Javascript front-end for web (kotlin transpiled to Javascript). One language for both front-end and back-end (similar to why a lot of people use npm for serverside), which I find to be way more maintanable
4. You get similiar ease of programming as Python, etc. but with better performance
5. Kotlin can be used with React, Vue, & Angular and can integrate with existing Typescript annotation files by a conversion tool
6. You can use ktor to easily setup a server without having to setup a full Java servlet container
[+] [-] wtmt|7 years ago|reply
> "I'm sick of waiting for Google's Keep team to improve their app, or even to respond to feature requests. (Crickets.)"
Choose a stack that:
a. has many developers using it on GitHub (since that happens to be the most popular platform for hosting open source code)
AND
b. is easier to use or fork as well.
Life will take over at some point after you develop some version of a Keep alternative. It may be the same as Keep today or lacking a lot comparatively or better than it. In any case, you'd need something that others can contribute to (sending pull requests), fork and create different/better versions of, etc. If you go with some relatively obscure stack or a dying stack because it promises to be fun or promises that you'll learn something new or promises something very fancy, then you'd either not get many users for your application or would have people in the future screaming the same sentence you started with above.
In other words, try not to do to others what you imagine the Google Keep team has done to you (or not done for you)!
[+] [-] sitkack|7 years ago|reply
Application developers need to open their platforms. Had Keep made their application open and layered, your new features would be locked behind the Keep gate.
[+] [-] spinningslate|7 years ago|reply
First off, a few requirements I inferred from your Q:
1. Performance (response time + concurrency)
2. Simplicity (you're a noob, but it's always a good thing anyway)
3. Stability + ease of maintenance/evolution (you don't state this explicitly - but if you're building on your own, I'd guess you'll have limited time to do this).
Based on those, here's a suggestion.
1. Write you back end in Erlang, using Cowboy or WebMachine to expose RESTful services. Simple, performant, robust, scalable, proven, stable.
2. Start with the premise that simple term/text storage (i.e. no DB) will suffice. Only move from that if you disprove that premise
3. Ask yourself how much of your front end can be handled with straight CSS + HTML. Probably not all, but you'd be surprised how much
4. Instead of a javascript framework, have a look at Elm where you do need client-side behaviour.
I fully accept that neither Erlang nor Elm are mainstream choices. Certainly not for everyone. But they're both well-designed, robust and pretty stable (Erlang more so than Elm on the stability front admittedly - the Elm language is still evolving).
I'll also freely admit that I really dislike the javascript ecosystem. I say "ecosystem" deliberately; I'm not crazy for the language itself, but it's the infuriating instability of packages, frameworks, build tools etc that means I avoid it as far as possible. It seems to take more time just keeping up with with the ecosystem than actually delivering meaningful functionality. I don't find that with Erlang or Elm. Yes, Elm 19 introduced quite a few breaking changes. Though I didn't find porting too painful given the tooling is so good.
YMMV of course.
[+] [-] mud_dauber|7 years ago|reply
[+] [-] gglitch|7 years ago|reply
[+] [-] PascalW|7 years ago|reply
- Ease of deploying.
- Amount of resources required to run it.
I've been building an open source notes app recently and I picked Rust + ReasonML and React in the front end.
It's super easy to deploy; it all compiles down to a single native binary that contains both the server and frontend.
It's super easy to deploy this, with or without Docker. It consumes almost no resources at all. The binary is 12 MB and consumes around 5 MB of RAM.
On the frontend it's a PWA, so it's available offline too. This is the most important part. You could build the PWA in other frameworks as well.
[+] [-] Klathmon|7 years ago|reply
I've been meaning to pick it up for a while now and keep reading over the docs but still haven't done much. Would you be willing to talk about some of the pitfalls and rough edges you've hit or things you would do differently?
[+] [-] yarinr|7 years ago|reply
Could you share a link to the repo? I'd love to take a look :)
[+] [-] rco8786|7 years ago|reply
Use what you know. Choose stability over cuteness. The app you’re building doesn’t dictate any specific stack.
[+] [-] lbacaj|7 years ago|reply
I would use AWS Lambda or Azure functions for the entire backend for something like this. You could make it incredibly scalable and do it incredibly fast. Both AWS and Azure have great managed Document database you could use to power the features you mentioned. It has never been easier than it is right now to build some incredibly things.
Shameless plug, this is exactly what I did with a recent app I built that can take any article and convert it to Audio. Check it out https://Articulu.com got it out for iOS and Android incredibly fast.
[+] [-] hwc|7 years ago|reply
[+] [-] scabarott|7 years ago|reply
[+] [-] pizza|7 years ago|reply
React is hard until your understanding of it finally 'clicks' - and having a wireframed visual reference of what your app is supposed to look like actually makes it easier to think about how it should be layed out in code, imo.
I actually just started learning React Native and I re-wrote the first iteration of my app's home screen many times (and kind of aimlessly) until I had something that actually made sense and was easily maintainable - still re-factoring it into something even simpler, tbh. That said, I think that was mainly due to me not knowing what was in the library or having approached the UI components properly in the first place, so I think I will be prototyping quite a bit faster over time.
re: state management/backend, I'm also confused as to what stack would be best for what I want to do. I'm guessing Firebase with some minimal manual state management? All the state updates my app needs to do is essentially record the user ticking some checkboxes, and some timers updating in the UI, and those persisting on a user's phone but also optionally associated with their account online if they so choose.
edit: I might actually go the PouchDB route
[+] [-] goloroden|7 years ago|reply
To get started, you find everything you need in the documentation, see https://docs.wolkenkit.io/3.1.0/
There is also an existing sample application that you might use as a starting point: https://github.com/thenativeweb/wolkenkit-boards
For the frontend I'd use React, probably, just because it is the UI library / frontend I'm most familiar with and the one I value the most.
PS: Please note that I am one of the core developers of wolkenkit, so please take my answer with a grain of salt.
[+] [-] rakoo|7 years ago|reply
[+] [-] paulirish|7 years ago|reply
[+] [-] mud_dauber|7 years ago|reply
[+] [-] joshmn|7 years ago|reply
[+] [-] mud_dauber|7 years ago|reply
[+] [-] developit|7 years ago|reply
[+] [-] pier25|7 years ago|reply
Back end: You could certainly do that with cloud functions without a database. Store encrypted JSONs somewhere. It would scale effortlessly. Use Auth0 for authentication.
Another option could be hasura.io which provides so much out of the box and can be installed everywhere with docker.
[+] [-] LeanderK|7 years ago|reply
I also think all the available APIs would be enough for a note-taking app. iOS improved it's support massivly in the latest beta.
You just need to keep it snappy! I take notes quickly and often.
[+] [-] bobbydreamer|7 years ago|reply
Feel free to try it out.
What I used is JavaScript, bootstrap for menus, Firebase for storage & authentication.
Next phase for learning ofcourse, 1. Option to write Notes in Markdown 2. UI look like Outlook 3. Not fully load entire db in homepage.
Below items I have already in my todos, I am sure I will never do it as I have other personal apps in mind. 1. Export/Import 2. Mark a note as public or private. If public anybody can comment on your notes. Suggest changes.
[+] [-] platz|7 years ago|reply
It's kind of like a crossover between a private Pinterest, a bookmarking app, and a note taking app.
So it's multi-paradigm.
But of you know your use case better, you can tailor your soltution to fit.
You can then make better decisions on online/offline, where to store state, web vs native etc.. this is the benefit of simplyfing and clarifying your use case.
For example, I am a heavy bookmarker (~70k bookmarks), so I built an open-source, self-hosted (I don't want to own your bookmarks) bookmarking web app (https://github.com/jonschoning/espial). It is pretty minimal, but it is tailored to quickly bookmarks while browsing. I didn't bother with native because I am already in a browser context when I want to bookmark something.
But maybe I am just biased towards web hosted tech. I just don't see the value add for native unless it's doing something intimately connected with the physical device or physical user.
[+] [-] mud_dauber|7 years ago|reply
And I'm always in a browser context too. Thanks.
[+] [-] jnskw|7 years ago|reply
[+] [-] tmaly|7 years ago|reply
After reading GTD, I ended up switching to the Things 3 app. I think I paid a one time $10 or $20 but it has been worth it in my opinion.
The one app I have not found yet, is one that can help me organize all the knowledge I discover online. I end up using favorite on HN and had a bunch of links in Google bookmarks. Still, its hard to find the stuff once it gets in there.
[+] [-] thwave|7 years ago|reply
[0] https://en.wikipedia.org/wiki/Bi-directional_text