libctru is the user mode floor under 3DS homebrew
Homebrew development library for Nintendo 3DS/Horizon OS user mode (Arm11)
At a glance
- What is it?
- libctru is the C library for writing user mode ARM11 code on the Nintendo 3DS, and the interesting thing about it is the line it draws around itself. It is not a game framework and it does not try to be, it provides the foundations needed to write homebrew and a straightforward way to reach the services the console's operating system exposes, which is why it also says where it expects to sit in a stack.
- Who is it for?
- libctru fits a developer writing homebrew for the 3DS who needs the operating system services without reverse engineering them, and it fits a larger project looking for the layer that would sit between the OS and a port of SDL, which is exactly the position the library describes.
- Can I use it commercially?
- Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
- Is it still maintained?
- Yes. The repository last received commits 23 days ago.
- What is it written in?
- Mainly C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What the library actually is
The README calls the project libctru, the CTR User Library, and describes it plainly as a library for writing user mode ARM11 code for the 3DS, with the repository description naming Horizon OS and the Arm11 architecture. The stated aim is to provide the foundations necessary to write 3DS homebrew and to straightforwardly access the different functionalities provided by the 3DS operating system. Two words in that sentence carry the design. Foundations implies a low layer, and straightforwardly access implies that the awkward part, which is how a user mode program talks to the console's services, is the part the library takes care of. For a console without a public SDK, that access layer is most of the work, and a library that has already solved it is the reason most 3DS homebrew is written in C rather than in something with a runtime that would have to solve the same problem again.
The line it refuses to cross
The README is unusually clear about what the library is not. It is not meant to provide higher level functions, and to put things in perspective, the purpose of libctru would be to sit between the OS and a possible port of SDL rather than replace it. That single sentence tells you a lot about the intended architecture of a homebrew project. You get a foundation layer with the console's services exposed, and above it you would put whatever higher level library you want, whether that is a port of SDL or something else. The consequence for a reader is that libctru is not a framework you adopt and then write a game in, it is a layer you link against and build your own stack on top of, which is a different kind of dependency and a different upgrade story. The history line adds the detail that the project was originally located at github.com/smealum/ctrulib, which is the earlier home of this code before devkitPro took it in.
The toolchain is the real dependency
libctru is just a library and needs a toolchain to function, and the README is unambiguous about which one. devkitARM, created by devkitPro, is the officially supported ARM cross compiling toolchain, and it provides the framework necessary to supply a usable POSIX-like environment with working C and C++ standard libraries, as well as the tools required to compile homebrew in the 3DSX format and to assemble GPU shaders. The use of other ARM toolchains is severely discouraged, and the most recent version of devkitARM is always recommended. The two capabilities worth noting are the POSIX-like layer and the shader assembler, because both are things a homebrew developer would otherwise have to solve themselves. A C library that assumes a hosted environment is not a library you can point any ARM compiler at, and the discouraged wording is the maintainers being explicit that the guarantee only holds for the toolchain they support.
The package manager ships the library for you
The install path runs through devkitPro's own package manager. The installers and setup scripts supplied by devkitPro install a prebuilt copy of the latest stable version of libctru, and the README says that is recommended for general use. Instructions for installing devkitARM are on the devkitPro wiki. The policy note that comes with it is the part to plan around. devkitPro has a policy of keeping legacy code to a minimum, so a library upgrade may result in older code failing to compile or behave properly, and developers are encouraged to keep their code working with the latest versions of the tools and libraries. For a homebrew developer that is a deliberate trade. The ecosystem is small, the toolchain moves together with the library, and a project that is expected to keep compiling across a major version of the console's low level API is not a reasonable expectation here. The alternative is to pin an old libctru and an old toolchain and lose access to the rest of the ecosystem.
A permissive licence with a warranty disclaimer
The licence section is short and is worth reading rather than skimming, because the permission is broad and the disclaimer is emphatic. The software is provided as-is, without any express or implied warranty, and in no event will the authors be held liable for any damages arising from the use of it. Permission is granted to anyone to use it for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to three restrictions. The origin of the software must not be misrepresented, so you cannot claim you wrote the original, and an acknowledgment in the product documentation is appreciated but not required. Altered source versions must be plainly marked as such and not misrepresented as the original. And the notice itself may not be removed or altered from any source distribution. That is a permissive licence with a zlib style shape, which means a commercial 3DS project is not a licensing question, unlike a homebrew library that restricted use to non-commercial purposes would be.
Documentation, releases and the shape of the repository
The documentation is built automatically upon each release and published at the devkitpro.github.io/libctru site, so the reference you read always corresponds to a specific version rather than to whatever the branch happens to contain. The project page is at libctru.devkitpro.org, and the release history is v2.7.0 published on 2026-02-19, v2.6.2 on 2025-06-26 and v2.6.1 on 2025-06-20, with the last push to the repository on 2026-09-29. The repository itself is minimal, with a libctru/ directory holding the library, a Changelog.md, the README and the GitHub configuration, and there is a GitHub Actions build workflow badge for the build. The two consecutive releases in June 2025 and the gap to the next one in February 2026 suggest a cadence tied to the toolchain rather than to a schedule, which fits a library whose main dependency is a toolchain that moves in step with it. The practical takeaway for an adopter is to treat the libctru and devkitARM versions as a pair and to upgrade them together.
Editorial conclusion
libctru fits a developer writing homebrew for the 3DS who needs the operating system services without reverse engineering them, and it fits a larger project looking for the layer that would sit between the OS and a port of SDL, which is exactly the position the library describes. It does not fit a beginner, because the toolchain requirement is strict and other ARM toolchains are severely discouraged, and it does not fit anyone with an existing homebrew project written against an older release, since devkitPro keeps legacy code to a minimum and an upgrade can leave older code failing to compile. Before you start, install devkitARM through the devkitPro package manager, take the prebuilt libctru it supplies, and read the licence terms, which are permissive and include commercial use but come with an as-is warranty disclaimer.
Frequently asked questions
What is libctru?
It is a C library for writing user mode ARM11 code for the Nintendo 3DS, providing the foundations needed to write 3DS homebrew and straightforward access to the functionalities the console's operating system provides. It was originally located at github.com/smealum/ctrulib.
Does libctru provide a game framework?
No. It is not meant to provide higher level functions, and its stated purpose is to sit between the operating system and a possible port of SDL rather than to replace it, so you build your own higher level stack on top of it.
What toolchain does libctru need?
devkitARM, the officially supported ARM cross compiling toolchain from devkitPro, which supplies a POSIX-like environment with working C and C++ standard libraries, the tools to compile homebrew in the 3DSX format, and the GPU shader assembler. The use of other ARM toolchains is severely discouraged.
How do I get libctru?
Through the devkitPro installers and setup scripts, which install a prebuilt copy of the latest stable version of libctru, the recommended route for general use. The devkitPro wiki has the devkitARM installation instructions.
Is libctru still updated?
The repository is not archived and the last push was on 2026-09-29, with v2.7.0 released on 2026-02-19 after v2.6.2 in June 2025 and v2.6.1 earlier that month. The documentation is rebuilt automatically on each release and published at devkitpro.github.io/libctru.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/devkitpro-libctru)