Solution Strategy
Quality Goals
Quality goal | Solution approch |
---|---|
The backend server is resource efficient. | written in Rust |
The user interface is customizable. | TailwindCSS / CSS-in-JS allow for dynamic, client-side styling. |
The backend server is easy to work on. | The database implementation is filesystem based. It's written against an interface and may later be swapped out with relational database for increased performance. |
The UX must be of the highest quality. | Use a service worker and indexedDB for offline availability. Use websockets for live updates when many devices are used simultaneously. |
Technological Decisions
Web app
- capable of fulfilling our key quality goal of first-class offline support via a service worker
- the only pragmatic option, as a bookmark manager that doesn't run in the browser can't deliver a great user experience
Rust on the server
- zero-cost abstractions and performance on par with C and C++
- loved by many programmers
- a modern type system with null safety, algebraic data types, powerful generics, exception-free error handling and no inheritance
- our developers are experienced with it
Top-level / Architectural Design Patterns
- frontend: TODO
- backend: traditional layered architecture
Organizational Decisions
Implicit API specification
OpenAPI is a great tool to achieve strongly typed interactions with a well-defined API. However, the code generators needed to make an openAPI based workflow productive are usually lagging behind for cutting edge languages and frameworks. Because we want to use these, openAPI is much less appealing. Moreover, the development team is small and informal communication about API changes is sufficient.
Development process
The team organization is lean and informal, as there are only two developers and a product owner. Scheduled meetings in the spirit of a sprint review, retrospective and planning combined are held every four weeks. Requirements are developed in a GitHub project, where individual developers may organize their tasks as well. Additional communication / meetings may always be initiated by any team member. The junior backend developer is responsible themself to seek guidance by the lead developer when needed.