[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7202":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":15,"starSnapshotCount":15,"syncStatus":35,"lastSyncTime":36,"discoverSource":37},7202,"javalin","javalin\u002Fjavalin","A simple and modern Java and Kotlin web framework","https:\u002F\u002Fjavalin.io",null,"Kotlin",8279,642,107,11,0,4,25,1,68.92,"Apache License 2.0",false,"master",[24,25,5,26,27,28,29,30,31],"hacktoberfest","java","jetty","kotlin","microservice","rest-api","servlet","web-framework","2026-06-12 04:00:32","\u003Ca name=\"readme-top\">\u003C\u002Fa>\n\n\u003Cdiv align=\"center\">\n\n  \u003C!--Logo-->\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin\">\n    \u003Cimg src=\"img\u002Fjavalin.png\" alt=\"Logo\" width=\"70%\">\n  \u003C\u002Fa>\n\n  \u003C!--Title-->\n\u003Ch3 align=\"center\">A simple web framework for Java and Kotlin\u003C\u002Fh3>\n\n  \u003Ch2>\n    \u003Ca href=\"https:\u002F\u002Fjavalin.io\u002Fdocumentation\">\u003Cstrong>View the documentation →\u003C\u002Fstrong>\u003C\u002Fa>\n    \u003Cbr>\n    \u003Cbr>\n  \u003C\u002Fh2>\n  \u003Cbr>\n\n  \u003C!--License badge-->\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin\u002Fblob\u002Fmaster\u002FLICENSE\">\n    \u003Cimg alt=\"Static Badge\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-Apache_2.0-blue\">\n  \u003C\u002Fa>\n  \u003C!--Maven central stable version badge-->\n  \u003Ca href=\"https:\u002F\u002Fcentral.sonatype.com\u002Fartifact\u002Fio.javalin\u002Fjavalin\">\n    \u003Cimg alt=\"Stable Version\" src=\"https:\u002F\u002Fimg.shields.io\u002Fmaven-central\u002Fv\u002Fio.javalin\u002Fjavalin?label=stable\">\n  \u003C\u002Fa>\n  \u003C!--Reposilite snapshot version badge-->\n  \u003Ca href=\"https:\u002F\u002Frepo.reposilite.com\u002F#\u002Fsnapshots\u002Fio\u002Fjavalin\u002Fjavalin\">\n    \u003Cimg alt=\"Snapshot Version\" src=\"https:\u002F\u002Fimg.shields.io\u002Fmaven-metadata\u002Fv?metadataUrl=https%3A%2F%2Frepo.reposilite.com%2Fsnapshots%2Fio%2Fjavalin%2Fjavalin%2Fmaven-metadata.xml&label=snapshot\">\n  \u003C\u002Fa>  \n  \u003C!--Discord badge-->\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002Fsgak4e5NKv\">\n    \u003Cimg alt=\"Discord Link\" src=\"https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F804862058528505896?label=discord%20chat&logo=discord&logoColor=white\">\n  \u003C\u002Fa>\n  \u003C!--Build Status badge-->\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin\u002Factions\u002Fworkflows\u002Fmain.yml\">\n    \u003Cimg alt=\"Build Status\" src=\"https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin\u002Factions\u002Fworkflows\u002Fmain.yml\u002Fbadge.svg\"\u002F>\n  \u003C\u002Fa>\n  \u003C!--Codecov badge-->\n  \u003Ca href=\"https:\u002F\u002Fcodecov.io\u002Fgh\u002Fjavalin\u002Fjavalin\" >\n    \u003Cimg src=\"https:\u002F\u002Fcodecov.io\u002Fgh\u002Fjavalin\u002Fjavalin\u002Fgraph\u002Fbadge.svg?token=3L3CvpyMPI\"\u002F>\n  \u003C\u002Fa>\n\u003C\u002Fdiv>\n\n#  \n\nJavalin is a very lightweight web framework for Kotlin and Java which supports WebSockets, HTTP2 and async requests. \nJavalin’s main goals are simplicity, a great developer experience, and first class interoperability between Kotlin and Java.\n\nJavalin is more of a library than a framework. Some key points:\n\n* You don't need to extend anything\n* There are no @Annotations\n* There is no reflection\n* There is no other magic; just code.\n\n#### General information\n\n* The project webpage is [javalin.io](https:\u002F\u002Fjavalin.io) (the source is at [javalin\u002Fjavalin.github.io](https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin.github.io)).\n* Read the documentation on: [javalin.io\u002Fdocumentation](https:\u002F\u002Fjavalin.io\u002Fdocumentation)\n* A summary of the license can be found at [TLDR Legal](https:\u002F\u002Ftldrlegal.com\u002Flicense\u002Fapache-license-2.0-(apache-2.0))\n* [Interesting issues](https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin\u002Fissues?q=is%3Aissue+label%3AINFO)\n\n#### Community\n\nWe have a very active [Discord](https:\u002F\u002Fdiscord.gg\u002Fsgak4e5NKv) server where you can get help quickly.\n\nContributions are very welcome, you can read more about contributing in our guide:\n[CONTRIBUTING](https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin\u002Fcontribute)\n\nPlease consider [:heart: Sponsoring](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Ftipsy) or starring Javalin if you want to support the project.\n\n## Quickstart\n\n### Add dependency\n\n#### Maven\n\n```xml\n\n\u003Cdependency>\n    \u003CgroupId>io.javalin\u003C\u002FgroupId>\n    \u003CartifactId>javalin\u003C\u002FartifactId>\n    \u003Cversion>7.2.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n#### Gradle\n\n```kotlin\nimplementation(\"io.javalin:javalin:7.2.0\")\n```\n\n### Start programming (Java)\n\n```java\nimport io.javalin.Javalin;\n\npublic class HelloWorld {\n    public static void main(String[] args) {\n        var app = Javalin.create(config -> {\n            config.routes.get(\"\u002F\", ctx -> ctx.result(\"Hello World\"));\n        }).start(7070);\n    }\n}\n```\n\n### Start programming (Kotlin)\n\n```kotlin\nimport io.javalin.Javalin\n\nfun main() {\n    val app = Javalin.create { config ->\n        config.routes.get(\"\u002F\") { it.result(\"Hello World\") }\n    }.start(7070)\n}\n```\n\n## Examples\n\nThis section contains a few examples, mostly just extracted from the [docs](https:\u002F\u002Fjavalin.io\u002Fdocumentation).\nAll examples are in Kotlin, but you can find them in Java in the documentation (it's just syntax changes).\n\nYou can find more examples in the [javalin-samples](https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin-samples) repository.\n\n### Api structure and server config\n\n```kotlin\nimport io.javalin.Javalin\nimport io.javalin.apibuilder.ApiBuilder.*\n\nfun main() {\n    val app = Javalin.create { config ->\n        config.concurrency.useVirtualThreads = true\n        config.http.asyncTimeout = 10_000L\n        config.staticFiles.add(\"\u002Fpublic\")\n        config.staticFiles.enableWebjars()\n        config.routes.apiBuilder {\n            path(\"\u002Fusers\") {\n                get(UserController::getAll)\n                post(UserController::create)\n                path(\"\u002F{userId}\") {\n                    get(UserController::getOne)\n                    patch(UserController::update)\n                    delete(UserController::delete)\n                }\n                ws(\"\u002Fevents\", userController::webSocketEvents)\n            }\n        }\n    }.start(7070)\n}\n```\n\n### WebSockets\n\n```kotlin\nconfig.routes.ws(\"\u002Fwebsocket\u002F{path}\") { ws ->\n    ws.onConnect { ctx -> println(\"Connected\") }\n    ws.onMessage { ctx ->\n        val user = ctx.messageAsClass\u003CUser>() \u002F\u002F convert from json string to object\n        ctx.send(user) \u002F\u002F  convert to json string and send back\n    }\n    ws.onClose { ctx -> println(\"Closed\") }\n    ws.onError { ctx -> println(\"Errored\") }\n}\n```\n\n### Filters and Mappers\n\n```kotlin\nconfig.routes.before(\"\u002Fsome-path\u002F*\") { ctx -> ... } \u002F\u002F runs before requests to \u002Fsome-path\u002F*\nconfig.routes.before { ctx -> ... } \u002F\u002F runs before all requests\nconfig.routes.after { ctx -> ... } \u002F\u002F runs after all requests\nconfig.routes.exception(Exception::class.java) { e, ctx -> ... } \u002F\u002F runs if uncaught Exception\nconfig.routes.error(404) { ctx -> ... } \u002F\u002F runs if status is 404 (after all other handlers)\n\nconfig.routes.wsBefore(\"\u002Fsome-path\u002F*\") { ws -> ... } \u002F\u002F runs before ws events on \u002Fsome-path\u002F*\nconfig.routes.wsBefore { ws -> ... } \u002F\u002F runs before all ws events\nconfig.routes.wsAfter { ws -> ... } \u002F\u002F runs after all ws events\nconfig.routes.wsException(Exception::class.java) { e, ctx -> ... } \u002F\u002F runs if uncaught Exception in ws handler\n```\n\n### JSON-mapping\n\n```kotlin\nvar todos = arrayOf(...)\nconfig.routes.get(\"\u002Ftodos\") { ctx -> \u002F\u002F map array of Todos to json-string\n    ctx.json(todos)\n}\nconfig.routes.put(\"\u002Ftodos\") { ctx -> \u002F\u002F map request-body (json) to array of Todos\n    todos = ctx.bodyAsClass\u003CArray\u003CTodo>>()\n    ctx.status(204)\n}\n```\n\n### File uploads\n\n```kotlin\nconfig.routes.post(\"\u002Fupload\") { ctx ->\n    ctx.uploadedFiles(\"files\").forEach { uploadedFile ->\n        FileUtil.streamToFile(uploadedFile.content(), \"upload\u002F${uploadedFile.filename()}\")\n    }\n}\n```\n\n## Plugins\n\nJavalin has a plugin system that allows you to add functionality to the core library.\nYou can find a list of plugins [here](https:\u002F\u002Fjavalin.io\u002Fplugins).\n\nInstalling a plugin is as easy as adding a dependency to your project and registering it with Javalin:\n\n```kotlin\nJavalin.create { config ->\n    config.registerPlugin(MyPlugin())\n}\n```\n\nSome of the most popular plugins are:\n\n### OpenAPI Plugin\n\nThe [Javalin OpenAPI](https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin-openapi) plugin allows you to generate an OpenAPI 3.0 specification for your API at compile time.\n\nAnnotate your routes with `@OpenApi` to generate the specification:\n\n```kotlin\n@OpenApi(\n    summary = \"Get all users\",\n    operationId = \"getAllUsers\",\n    tags = [\"User\"],\n    responses = [OpenApiResponse(\"200\", [OpenApiContent(Array\u003CUser>::class)])],\n    path = \"\u002Fusers\",\n    methods = [HttpMethod.GET]\n)\nfun getAll(ctx: Context) {\n    ctx.json(UserService.getAll())\n}\n```\n\nSwagger UI and ReDoc UI implementations for viewing the generated specification in your browser are also available.\n\nFor more information, see the [Javalin OpenAPI Wiki](https:\u002F\u002Fgithub.com\u002Fjavalin\u002Fjavalin-openapi\u002Fwiki).\n\n### SSL Plugin\n\nThe [Javalin SSL](https:\u002F\u002Fjavalin.io\u002Fplugins\u002Fssl-helpers) plugin allows you to easily configure SSL for your Javalin server, supporting a variety of formats such as PEM, PKCS12, DER, P7B, and JKS.\n\nEnabling SSL on the 443 port is as easy as:\n\n```kotlin\nval plugin = SslPlugin { conf ->\n    conf.pemFromPath(\"\u002Fpath\u002Fto\u002Fcert.pem\", \"\u002Fpath\u002Fto\u002Fkey.pem\")\n}\n\nJavalin.create { javalinConfig ->\n    javalinConfig.registerPlugin(plugin)\n}.start()\n```\n\n## Sponsors\n\n| Logo | Sponsor | Amount |\n|------|---------|--------|\n| \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F07bf134b-db7a-4e53-b3db-f1681b0443ff\" alt=\"Barbary Software\" width=\"32\" height=\"32\"> | [@barbarysoftware](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fbarbarysoftware) | (50 USD\u002Fm) |\n| \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F06236654-649d-46dd-b174-11ce61e325ec\" alt=\"Vasilis Soumakis\" width=\"32\" height=\"32\"> | \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FVassilisSoum\">@VassilisSoum\u003C\u002Fa> | (25 USD\u002Fm) |\n\n## Special thanks\n\n* Blake Mizerany, for creating [Sinatra](http:\u002F\u002Fwww.sinatrarb.com\u002F)\n* Per Wendel, for creating [Spark](http:\u002F\u002Fsparkjava.com\u002F)\n* [Christian Rasmussen](https:\u002F\u002Fgithub.com\u002Fchrrasmussen), for being a great guy\n* [Per Kristian Kummermo](https:\u002F\u002Fgithub.com\u002Fpkkummermo), also for being a great guy\n","Javalin是一个为Java和Kotlin设计的简单现代的Web框架。它支持WebSocket、HTTP2以及异步请求，旨在提供简洁的API与出色的开发体验，同时确保Kotlin与Java之间的无缝互操作性。Javalin摒弃了复杂的继承结构、注解及反射机制，采用直接编码的方式实现功能，使得整个框架更加轻量且易于理解。适用于需要快速搭建REST API或微服务架构的场景，特别适合追求代码简洁性和高效开发流程的小型到中型企业级应用。",2,"2026-06-11 03:11:08","top_language"]