Philosophy

Why raylib exists, what it stands against, and the design principles behind its radical simplicity.

Programming Should Be Fun

raylib's fundamental belief is that programming is inherently enjoyable, and that most of the frustration people associate with game development comes not from the work itself, but from the tools and complexity that have been layered on top of it.

Modern game engines give you a GUI, a scene editor, a component system, a scripting language, an asset pipeline, a build system, and a plugin marketplace. You can spend hours configuring nodes and properties before writing a single line of code. For some developers, this is paradise. For others, it's a prison.

raylib is for the second group. It strips away everything except the code. You open a text editor, write C, compile, and run. There's nothing between you and the machine except your program. That directness — that feeling of I wrote this and it does exactly what I said — is what raylib exists to preserve.

"raylib is a tool for people who enjoy the craft of programming. It doesn't try to hide the complexity — it just removes the unnecessary complexity so you can focus on the real problems."
— Ramon Santamaria
The 8 Design Principles
Principle 01
No External Dependencies

raylib bundles everything it needs: GLFW, miniaudio, stb_image, stb_truetype, and more. You never need to install, link, or configure an external library. One download, one include, one link flag.

Principle 02
Pure C99

Not C++, not a subset of C++, not "C-like." Pure ISO C99. This means raylib compiles on virtually any compiler, links with virtually any language, and will still compile in 30 years. C is the universal ABI.

Principle 03
Simple API

Every function name is self-explanatory: DrawCircle(), LoadTexture(), PlaySound(), IsKeyPressed(). No namespaces, no method chaining, no overloads. If you can read English, you can read raylib code.

Principle 04
No Hidden State

raylib avoids global singletons and hidden magic. You call InitWindow() to create a window. You call CloseWindow() to destroy it. You call LoadTexture() to load a texture and UnloadTexture() to free it. Everything is explicit.

Principle 05
No OOP

No classes, no inheritance, no polymorphism, no design patterns. Data is structs. Behavior is functions. This isn't a limitation — it's a feature. The simplest solution is usually the best one.

Principle 06
Batteries Included

raylib handles windowing, rendering, input, audio, and math out of the box. You don't need to stitch together 5 different libraries to draw a triangle and play a sound. One library does it all.

Principle 07
Learn by Example

140+ fully commented code examples ship with raylib. Every feature has a working demo. The best documentation is code that runs, and raylib has more running examples than most engines have documentation pages.

Principle 08
Permissive License

zlib/libpng license. Use it commercially, modify it, sell games made with it, don't credit raylib if you don't want to. Zero legal friction. The code is a gift.

Library vs Engine

raylib is often compared to game engines, but the comparison misses the point. They solve different problems for different people.

DimensionGame Engine (Unity, Godot)raylib
InterfaceGUI editor, scene tree, inspectorsText editor + compiler
LanguageC#, GDScript, visual scriptingC99 (+ 60 bindings)
BuildManaged by enginegcc/clang, one command
DependenciesEngine runtime (100MB+)Single .a/.lib (~2MB)
Learning curveLearn the engine, then the languageLearn C, then call functions
Binary size50–500 MB100 KB – 5 MB
Startup timeSeconds to minutesInstant
Upgrade pathEngine version migrationsRecompile with new .h
ControlEngine owns the loopYou own the loop
Best forLarge teams, complex gamesSolo devs, learning, tools, jams
The Spartan Way

Ramon calls raylib "the most pure spartan way" of making games. It's a deliberate choice to reject convenience features that add complexity. No visual editor means you understand your game's structure. No auto-complete means you learn the API. No abstraction layers mean when something breaks, you can read the source and fix it.

This isn't masochism — it's the same philosophy behind Vim, Plan 9, SQLite, and the Unix command line. Simple tools that do one thing well, controlled by people who understand what they're doing. Complexity is the enemy of reliability, and raylib refuses to be complex.

The result is a library that compiles in seconds, produces tiny binaries, runs on everything from a Raspberry Pi to a modern gaming PC, and can be understood completely by reading a single header file. That's not a limitation. That's freedom.

"I don't need a 500MB engine to draw a triangle. I need 8 lines of C and a library that respects my intelligence."
— A raylib user
Why raylib Will Outlast Engines

Game engines come and go. Unity changes its pricing model. Godot rewrites its renderer. Epic pivots Unreal's focus. Every engine is one corporate decision away from breaking your workflow.

raylib is C. C was here before any of us were born, and it will be here after we're gone. A raylib program written in 2014 still compiles and runs today with zero changes. Try that with a Unity 4 project.

That's the real power of simplicity. Not that it's easy (it isn't always), but that it's durable. Simple code survives. Simple interfaces remain stable. Simple dependencies don't break. In a world of constant churn, raylib is a rock.