๐ŸŒฑ๐Ÿฆ€๐ŸŒฑ Trillium is a composable toolkit for building web applications with async rust ๐ŸŒฑ๐Ÿฆ€๐ŸŒฑ

Overview

Welcome to Trillium!

๐Ÿ“– Guide ๐Ÿ“–

The guide provides an architectural overview and lay of the land connecting the trillium crates.

๐Ÿ“‘ Rustdocs ๐Ÿ“‘

The rustdocs represent the best way to learn about any of trillium's individual crates and the specific interfaces.




Legal:

Licensed under either of

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Comments
  • allow to send static compiled file when 404

    allow to send static compiled file when 404

    I have a trillium server that is backed by create-react-app.

    In dev mode I would like to proxy directly to the server created by create-react-app, while in release mode I would like to serve the file that is embedded in the binary. Working sample of this can be found at https://github.com/prabirshrestha/objstor/pull/16.

    Here is the main snippet:

    use trillium::Handler;
    
    #[cfg(not(debug_assertions))]
    lazy_static_include::lazy_static_include_str! {
        INDEX_HTML => "../client/build/index.html",
    }
    
    #[cfg(debug_assertions)]
    pub fn spa() -> impl Handler {
        use trillium_rustls::RustlsConnector;
        use trillium_tokio::TcpConnector;
        type Proxy = trillium_proxy::Proxy<RustlsConnector<TcpConnector>>;
        Proxy::new("http://localhost:3000")
    }
    
    #[cfg(not(debug_assertions))]
    pub fn spa() -> impl Handler {
        use trillium_static_compiled::static_compiled;
        let handler = static_compiled!("../client/build").with_index_file("index.html");
        (handler, serve_index_file)
    }
    
    #[cfg(not(debug_assertions))]
    async fn serve_index_file(conn: trillium::Conn) -> trillium::Conn {
        conn.with_header("content-type", "text/html; charset=UTF-8")
            .ok(INDEX_HTML.as_bytes())
    }
    

    I had to introduce lazy_static_include library and do a bit of custom code. It would be great if this was simplified as it is a common pattern for single page applications where there is usually just a single html file with most of the code logic in js. This could then be simplified as following.

    #[cfg(not(debug_assertions))]
    pub fn spa() -> impl Handler {
        trillium_static_compiled::static_compiled! 
            ("../client/build").with_index_file("index.html").with_fallback_file("index.html")
    }
    

    The other option would be to introduce static_compiled_file but then the file contents would be duplicated.

    enhancement 
    opened by prabirshrestha 8
  • tera: Attempt to obtain mutable reference.

    tera: Attempt to obtain mutable reference.

    I've come into a situation where I need to call Tera::full_reload so I can reload templates in a development environment (versus respawning this application). I'm not sure if allowing for a From<Arc<Tera>> for TeraHandler would have helped here (because then I can control the instance of Tera being used (to a degree).

    I know I opened this up as a PR versus going into discussionsโ€”mainly because it seemed simple enough. However, I can't get this imported into my project locally so I wasn't able to fully test this.

    opened by jalcine 7
  • Feature suggestion for `trillium-websocket`: Add access to peer_ip from WebSocketConn

    Feature suggestion for `trillium-websocket`: Add access to peer_ip from WebSocketConn

    Currently, there is no way to access some methods of trillium::Conn from trillium_websocket::WebSocketConn, with the same issues as to require trillium::Conn's own .inner escape hatch. Alternatively, exposing said hatch of trillium::Conn would also be viable to provide such access to lower-level methods.

    enhancement 
    opened by enderger 4
  • Bug report for `trillium-method-override`: Not converting from method field in request body

    Bug report for `trillium-method-override`: Not converting from method field in request body

    Describe the bug While using htmx.org, namely hx-post with <input type="hidden" name="_method" value="put"> in a form, I noticed that the request wasn't being translated into an PUT request on the server side.

    To Reproduce Reproduction of this could work by copying one of the tests at trillium-rs/trillium#main/method-override/tests/tests.rs:L16-L29 but instead of checking the query string , putting the test body as the request body, like:

    assert_ok!(post("/").with_request_body("_method=put").on(&amp;app), "it was a PUT");
    

    This way, it'll show that the use of only query string extraction wouldn't be enough. However, it looks like reading the body of the request will mutate the connection itself at https://docs.rs/trillium/latest/src/trillium/conn.rs.html#257-274. Perhaps an updated test will show otherwise.

    Expected behavior Proper conversion of a POST request with a hint to the expected HTTP Verb.

    Additional context I figure that the code of method-override is a bit older than the tests and perhaps led to this not being covered.

    (Originally published at: https://jacky.wtf/2022/4/W1/W1YTNu6QaaLQ33o0zcbWFhRr)

    opened by jalcine 4
  • trillium-static should respect If-None-Match and ETag and return no content if it matches

    trillium-static should respect If-None-Match and ETag and return no content if it matches

    Seems like trillium-static sends the file with correct response headers but never looks at the request header and always sends the full response body instead of a 304 Not Modified.

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#caching_of_unchanged_resources

    The server compares the client's ETag (sent with If-None-Match) with the ETag for its current version of the resource, and if both values match (that is, the resource has not changed), the server sends back a 304 Not Modified status, without a body, which tells the client that the cached version of the response is still good to use (fresh).

    bug 
    opened by prabirshrestha 4
  • Use ToString for `with_host`

    Use ToString for `with_host`

    I tend to use SocketAddr to define the listening address for Web applications. SocketAddr::ip gives back a type that implements ToString. This would make it a bit easier to pass in any sort of value.

    opened by jalcine 4
  • Running code after response is sent

    Running code after response is sent

    Trillium looks really nice and I thought I'd give it a go for a small project. I was wondering if it's possible to run some code after the response is finished? I have a situation where I need to perform an operation that will affect the machine's ability to send a response, so this can only be started once the response has actually been sent.

    enhancement 
    opened by hasali19 4
  • document systemfd/listenfd support

    document systemfd/listenfd support

    It will be good if there are examples on https://github.com/mitsuhiko/systemfd and https://docs.rs/listenfd/0.3.3/listenfd/ or a first class create/optional feature on this.

    guide docs 
    opened by prabirshrestha 4
  • Update base64 requirement from 0.13.1 to 0.20.0

    Update base64 requirement from 0.13.1 to 0.20.0

    Updates the requirements on base64 to permit the latest version.

    Changelog

    Sourced from base64's changelog.

    0.20.0

    Breaking changes

    • Update MSRV to 1.57.0
    • Decoding can now either ignore padding, require correct padding, or require no padding. The default is to require correct padding.
      • The NO_PAD config now requires that padding be absent when decoding.

    0.20.0-alpha.1

    Breaking changes

    • Extended the Config concept into the Engine abstraction, allowing the user to pick different encoding / decoding implementations.
      • What was formerly the only algorithm is now the FastPortable engine, so named because it's portable (works on any CPU) and relatively fast.
      • This opens the door to a portable constant-time implementation (#153, presumably ConstantTimePortable?) for security-sensitive applications that need side-channel resistance, and CPU-specific SIMD implementations for more speed.
      • Standard base64 per the RFC is available via DEFAULT_ENGINE. To use different alphabets or other settings (padding, etc), create your own engine instance.
    • CharacterSet is now Alphabet (per the RFC), and allows creating custom alphabets. The corresponding tables that were previously code-generated are now built dynamically.
    • Since there are already multiple breaking changes, various functions are renamed to be more consistent and discoverable.
    • MSRV is now 1.47.0 to allow various things to use const fn.
    • DecoderReader now owns its inner reader, and can expose it via into_inner(). For symmetry, EncoderWriter can do the same with its writer.
    • encoded_len is now public so you can size encode buffers precisely.

    0.13.1

    • More precise decode buffer sizing, avoiding unnecessary allocation in decode_config.

    0.13.0

    • Config methods are const
    • Added EncoderStringWriter to allow encoding directly to a String
    • EncoderWriter now owns its delegate writer rather than keeping a reference to it (though refs still work)
      • As a consequence, it is now possible to extract the delegate writer from an EncoderWriter via finish(), which returns Result<W> instead of Result<()>. If you were calling finish() explicitly, you will now need to use let _ = foo.finish() instead of just foo.finish() to avoid a warning about the unused value.
    • When decoding input that has both an invalid length and an invalid symbol as the last byte, InvalidByte will be emitted instead of InvalidLength to make the problem more obvious.

    0.12.2

    • Add BinHex alphabet

    0.12.1

    • Add Bcrypt alphabet

    0.12.0

    • A Read implementation (DecoderReader) to let users transparently decoded data from a b64 input source
    • IMAP's modified b64 alphabet
    • Relaxed type restrictions to just AsRef<[ut8]> for main encode*/decode* functions
    • A minor performance improvement in encoding

    0.11.0

    • Minimum rust version 1.34.0

    ... (truncated)

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 3
  • Feature suggestion for `trillium-router`: Allow `String` or `&str` to be used as the path

    Feature suggestion for `trillium-router`: Allow `String` or `&str` to be used as the path

    While working on Lighthouse, I wanted a way to 'build' route URLs for use elsewhere (like returning in a page or in my case, checking if it's referenced in a remote document as part of Webmention discovery). I attempted to do the following to build my pathsโ€”a change from manually writing in the URL, and it didn't work. It looks like TryFrom for RouteSpec is a thing, so I'm curious as to why it's been restricted to require a lifetime across the entire application.

        static URL_PATH_WEBMENTION_PREFIX: &str = "/endpoints/webmention";
    
    Router::build(|mut router| {
        let path = format!("{}/:token", URL_PATH_WEBMENTION_PREFIX).as_str();
    
        // This _will_ fail, I did `path.as_str()` initially but of course, that's a short-lived reference.
        router.get(path, |conn: Conn| async move { conn.halt() })
    })
    

    (Originally posted at https://jacky.wtf/2022/4/nS/nSsFq7XHDUUOpXCc6ptwtfOx)

    enhancement 
    opened by jalcine 3
  • Feature suggestion for `trillium-websockets`: Make websocket limits configurable

    Feature suggestion for `trillium-websockets`: Make websocket limits configurable

    By default, tungstenite imposes a message size limit of about 67 megabytes. Unless I am missing something, these limits don't seem to be configurable in trillium. This isn't the end of the world, but I would like to be able to set more conservative limits as the defaults far exceed the largest messages permitted by my application.

    enhancement 
    opened by dexgs 3
  • add set_json in trillium::ApiConnExt

    add set_json in trillium::ApiConnExt

    When using trillium-error it takes &mut Conn.

    Would need to add support for the following.

    fn set_json(&mut self, response: &impl Serialize) -> Result<(), JsonValue>;
    
    enhancement 
    opened by prabirshrestha 0
  • Feature suggestion for `trillium-api`: ApiConnExt should include is_json_request()

    Feature suggestion for `trillium-api`: ApiConnExt should include is_json_request()

    This is primarily used for content negotiation or special handling for api vs non api requests.

    pub async fn not_found(conn: Conn) -> Conn {
        if conn.is_json_request() {
          conn.with_status(404).with_json(JsonError { message = "Not found", code = "NotFound" }).halt()
        } else {
           conn.with_status(404).with_body("Not Found").halt()
        }
        
    }
    
    enhancement 
    opened by prabirshrestha 0
  • trillium on io-uring

    trillium on io-uring

    I'm investigating utilizing io-uring runtimes for http servers. Trillium is my favorite so far. trillium-http has no runtime dependencies, so I think it won't be a big problem adding support for io-uring runtimes like monoio and glommio

    enhancement 
    opened by trickster 0
  • Integration with Tracing

    Integration with Tracing

    Discussed in https://github.com/trillium-rs/trillium/discussions/212

    Originally posted by trickster June 15, 2022 Is there a way to integrate Logger with tracing?

    I see tracing_log has env_logger setup, don't know how to set it up.

    opened by jbr 1
Releases(trillium-rustls-v0.2.0)
  • trillium-rustls-v0.2.0(Nov 30, 2022)

    Summary

    trillium-rustls v0.2.0 updates async-rustls to 0.3 and rustls to 0.20

    What's Changed

    • clippy is my copilot by @jbr in https://github.com/trillium-rs/trillium/pull/224
    • Update async-tungstenite requirement from 0.17.0 to 0.18.0 by @dependabot in https://github.com/trillium-rs/trillium/pull/230
    • Update env_logger requirement from 0.9.0 to 0.10.0 by @dependabot in https://github.com/trillium-rs/trillium/pull/233
    • Clippies by @jbr in https://github.com/trillium-rs/trillium/pull/235
    • Update hashbrown requirement from 0.12.0 to 0.13.1 by @dependabot in https://github.com/trillium-rs/trillium/pull/232
    • async-rustls 0.3 by @jbr in https://github.com/trillium-rs/trillium/pull/236

    Full Changelog: https://github.com/trillium-rs/trillium/compare/trillium-websockets-v0.5.1...trillium-rustls-v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • trillium-websockets-v0.5.1(Jul 8, 2022)

  • trillium-v0.2.3(Jul 8, 2022)

    • dc9c28809 feature: add Conn::{set_}peer_ip
    • 32011e89d feature: add trillium::init
    • 353843a42 update deps
    • a61d6b8ad, 610adcaae: add Handler implementation for Status
    Source code(tar.gz)
    Source code(zip)
  • trillium-router-v0.3.3(Apr 1, 2022)

    • 9bb397803f564a5ac3d81b245d5d8c94d431c733 [feature] accept any TryInto instead of &'static str
    • a782fa48bfc685be733b306bb79b7f71573c6472 [chore] clippy pass
    • 1531fb0f7ca025949ca6cf7b25bcb3267afa09f9 [perf] remove some unnecessary string allocations
    Source code(tar.gz)
    Source code(zip)
  • trillium-proxy-v0.2.1(Mar 16, 2022)

    • 97b5e5ae8 proxy patch bugfix: do not drop querystring โ€”ย previous to this release, querystrings were not forwarded along with the outbound request. this was a bug.
    • 0fa8409ba edition 2021
    Source code(tar.gz)
    Source code(zip)
  • trillium-client-v0.2.2(Mar 10, 2022)

  • trillium-client-v0.2.1(Mar 9, 2022)

    • d1cc76980 patch feature: add json crate feature
    • 6622fc6de patch feature: add chainable Conn::with_header for inserting a request header
    • 353843a42, bb1c6642a, 2f0da81fa update deps
    • 0fa8409ba switch to 2021 edition
    • ef2abe215 add caching header support
    Source code(tar.gz)
    Source code(zip)
  • trillium-websockets-v0.5.0(Mar 7, 2022)

    • 5b67d9048 patch feature: add support for protocol config
    • a5662adc8 minor: Update async-tungstenite requirement from 0.16.1 to 0.17.0
    • 9eec3ab2a patch feature: downgrade disconnect failures to log warnings
    • 7718cd2e6 patch: update sha-1
    Source code(tar.gz)
    Source code(zip)
  • trillium-tera-v0.3.0(Mar 7, 2022)

    6021c318b patch feature: Export more traits. 8f64da17d, 353843a42, 4e8a7dd03, bb1c6642a, 18b170bb4, 2f0da81fa: upgrade dependencies 0fa8409ba use 2021 edition

    Source code(tar.gz)
    Source code(zip)
  • trillium-http-v0.2.7(Mar 7, 2022)

  • trillium-router-v0.3.2(Jan 7, 2022)

    this patch release addresses #162 by changing the internal usage of routefinder.

    Instead of storing HashMap<Method, BTreeMap<RouteSpec, Box<dyn Handler>>>, we now store BTreeMap<RouteSpec, (MethodSelection, Box<dyn Handler>)>. This means that now we first filter by matching route and then matching methods instead of filtering by method first, as we previously did. The introduction of MethodSelection (currently crate-private) means that we no longer need to Arc the Handler, allowing for safe mutation in the init handler callback.

    Source code(tar.gz)
    Source code(zip)
  • trillium-static-compiled-v0.5.0(Jan 3, 2022)

  • trillium-cookies-v0.3.0(Jan 3, 2022)

  • trillium-channels-v0.2.0(Jan 3, 2022)

    This release adds initial support for phoenix channels protocol version 2.0.0. This serialization format does not replace version 1.0, which remains the default, but is switched to per connection by the presence of a ?vsn=2.0.0 query parameter.

    Source code(tar.gz)
    Source code(zip)
  • trillium-http-v0.2.6(Dec 14, 2021)

    This release fixes a largely-unsupported feature of http: Pipelining. Previous to this commit, pipelining was broken, but is now believed to be fully functional.

    Source code(tar.gz)
    Source code(zip)
  • trillium-tokio-v0.2.1(Dec 13, 2021)

  • trillium-testing-v0.4.0(Dec 13, 2021)

    • 6f4f4ea2a4 testing minor feature: make TestConn::take_response_body_string sync
    • 4de6d21b8 matching a None value in assert_headers asserts that the header was not set
    • 0fa8409ba9 2021
    • ef2abe2151 minor removal: remove TestConn:: run_async and TestConn::async_on
    • c59708f006 use with_socket to abstract away tcpconnections
    • 8e6723b56d testing: use init and a channel to wait for the server to come up
    • y9ad8a388a2 add TestConn::secure
    Source code(tar.gz)
    Source code(zip)
  • trillium-smol-v0.2.1(Dec 13, 2021)

  • trillium-router-v0.3.1(Dec 13, 2021)

    previous to this release, trillium-router did not call init on handlers held in the router. this was an egregious bug, and has been addressed.

    Source code(tar.gz)
    Source code(zip)
  • trillium-channels-v0.1.1(Dec 9, 2021)

    this release fixes a bug in 0.1.0: the phoneix js client does not accept null as the top-level payload, so we replace it with {} in this patch

    Source code(tar.gz)
    Source code(zip)
  • trillium-sse-v0.1.0(Dec 5, 2021)

  • trillium-http-v0.2.5(Dec 4, 2021)

  • trillium-compression-v0.1.0(Dec 4, 2021)

  • trillium-websockets-v0.4.0(Dec 3, 2021)

    trillium-websockets v0.4.0 introduces a websocket handler trait that can be implemented for common functionality, as well as adding a json feature to the crate which enables a json handler trait. see the documentation for more details

    Source code(tar.gz)
    Source code(zip)
  • trillium-v0.2.2(Dec 3, 2021)

    • 43ff89f9f2 patch feature: add state as an alias for State::new
    • 9e6694d69f patch feature: Conn is AsRef+AsMut StateSet
    • 0fa8409ba9 upgrade to rust 2021
    Source code(tar.gz)
    Source code(zip)
  • trillium-static-compiled-v0.4.0(Dec 3, 2021)

    • f6e832dc1e patch feature: reexport Dir, File
    • 01a63a2b47 minor feature: add support for last modified in static compiled
    • 0fa8409ba9 upgrade to edition 2021
    • ef2abe2151 minor feature: add caching header support
    Source code(tar.gz)
    Source code(zip)
  • trillium-http-v0.2.4(Dec 3, 2021)

    • ce3f09aba0 patch feature: add Upgrade::querystring for retrieving the query
    • 149c0f2e4d http patch bugfix: only return the path from Upgrade::path -- previously, we returned path AND query, which was a bug.
    • 0fa8409ba9 upgrade to edition 2021
    • cd8693d9d9 patch bugfix: don't send content-length / transfer-encoding / body for 204/304
    Source code(tar.gz)
    Source code(zip)
  • trillium-forwarding-v0.2.1(Dec 3, 2021)

    • 8dccf03f18 forwarding patch bugfix: handle ipv6 addresses correctly

      This is an important bugfix -- previously, ipv6 peer ip addresses would not have been correctly set

    • bb1c6642a7 cargo upgrade (deps
    • 0fa8409ba9 upgrade to 2021
    • 46a2a25c8b remove unused Target imports in example
    • 72926a978e change the default target for the logger
    Source code(tar.gz)
    Source code(zip)
  • trillium-conn-id-v0.2.1(Dec 3, 2021)

    • 6f50e78a8d patch feature: extension trait applies to any AsRef
    • 0fa8409ba9 upgrade to edition 2021
    • ef2abe2151 patch feature: add trillium_conn_id::conn_id as alias for ConnId::new
    Source code(tar.gz)
    Source code(zip)
  • trillium-channels-v0.1.0(Dec 3, 2021)

Sauron is an html web framework for building web-apps. It is heavily inspired by elm.

sauron Guide Sauron is an web framework for creating fast and interactive client side web application, as well as server-side rendering for back-end w

Jovansonlee Cesar 1.7k Dec 26, 2022
Rust / Wasm framework for building client web apps

Yew Rust / Wasm client web app framework Documentation (stable) | Documentation (latest) | Examples | Changelog | Roadmap | ็ฎ€ไฝ“ไธญๆ–‡ๆ–‡ๆกฃ | ็น้ซ”ไธญๆ–‡ๆ–‡ๆช” | ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ A

Yew Stack 25.8k Jan 2, 2023
Noria: data-flow for high-performance web applications

Noria: data-flow for high-performance web applications Noria is a new streaming data-flow system designed to act as a fast storage backend for read-he

MIT PDOS 4.5k Dec 28, 2022
Layers, extractors and template engine wrappers for axum based Web MVC applications

axum-template Layers, extractors and template engine wrappers for axum based Web MVC applications Getting started Cargo.toml [dependencies] axum-templ

Altair Bueno 11 Dec 15, 2022
Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust.

Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust.

Actix 16.2k Jan 2, 2023
Hot reload static web server for deploying mutiple static web site with version control.

SPA-SERVER It is to provide a static web http server with cache and hot reload. ไธญๆ–‡ README Feature Built with Hyper and Warp, fast and small! SSL with

null 7 Dec 18, 2022
A fast, forbid(unsafe_code), no dependency, async executor

uAsync A fast, forbid(unsafe_code), no dependency, async executor. This crate was made primarily to see if such a thing was pheasable. The executor pe

protty 44 Dec 15, 2022
Thalo is an event-sourcing framework for building large scale systems

Thalo Event sourcing framework for building microservices. Overview Thalo is an event-sourcing framework for building large scale systems based on the

null 548 Jan 3, 2023
A blazingly fast HTTP client with a magnificent request building syntax, made for humans.

?? glue Make requests, select JSON responses, nest them in other requests: A magnificent syntax for blazingly fast cli HTTP calls, made for humans. Ta

Michele Esposito 4 Dec 7, 2022
A Rust web framework

cargonauts - a Rust web framework Documentation cargonauts is a Rust web framework intended for building maintainable, well-factored web apps. This pr

null 179 Dec 25, 2022
A Rust library to extract useful data from HTML documents, suitable for web scraping.

select.rs A library to extract useful data from HTML documents, suitable for web scraping. NOTE: The following example only works in the upcoming rele

Utkarsh Kukreti 829 Dec 28, 2022
A rust web framework with safety and speed in mind.

darpi A web api framework with speed and safety in mind. One of the big goals is to catch all errors at compile time, if possible. The framework uses

null 32 Apr 11, 2022
A web framework for Rust.

Rocket Rocket is an async web framework for Rust with a focus on usability, security, extensibility, and speed. #[macro_use] extern crate rocket; #[g

Sergio Benitez 19.4k Jan 4, 2023
Thruster - An fast and intuitive rust web framework

A fast, middleware based, web framework written in Rust

null 913 Dec 27, 2022
Rust implementation of the `URLPattern` web API

urlpattern This crate implements the URLPattern web API in Rust. We aim to follow the specification as closely as possible. Contributing We appreciate

Deno Land 40 Dec 14, 2022
A full-featured and easy-to-use web framework with the Rust programming language.

Poem Framework A program is like a poem, you cannot write a poem without writing it. --- Dijkstra A full-featured and easy-to-use web framework with t

Poem Web 2.2k Jan 6, 2023
Perseus is a blazingly fast frontend web development framework built in Rust with support for major rendering strategies

Perseus is a blazingly fast frontend web development framework built in Rust with support for major rendering strategies, reactivity without a virtual DOM, and extreme customizability

arctic_hen7 1.2k Jan 8, 2023
Seed is a Rust front-end framework for creating fast and reliable web apps with an Elm-like architecture.

Seed is a Rust front-end framework for creating fast and reliable web apps with an Elm-like architecture.

null 3.6k Jan 6, 2023
example of a full stack web app (backend and frontend) wrtiten in Rust

rust-fullstack-example An example of creating a full stack web application (backend and frontend) using Rust. Backend Go to ./backend and start the se

mario 41 Dec 16, 2022