Freely available programming books
View the Project on GitHub EbookFoundation/free-programming-books
By contributing, you agree to the LICENSE of this repository.
By contributing, you agree to respect the Code of Conduct of this repository. (translations)
“A link to easily download a book” is not always a link to a free book. Please only contribute free content. Make sure it’s free. We do not accept links to pages that require working email addresses to obtain books, but we welcome listings that request them.
We have 6 kinds of lists. Choose the right one:
Make sure to follow the guidelines below and respect the Markdown formatting of the files.
https
link over a http
one – as long as they are on the same domain and serve the same contenthttp://example.com
instead of http://example.com/
http://example.com/dir/
is better than http://example.com/dir/index.html
http://example.com/dir/book/current/
is better than http://example.com/dir/book/v1.0.0/index.html
http
counterpart if possible (because accepting exceptions can be complicated on mobile devices).http
version is available but the link is still accessible through https
by adding an exception to the browser or ignoring the warning.et al.
”.in process
” notation, as described below.archived
” notation, as described below. The best versions to use are recent and complete.(email address *requested*, not required)
..md
files. Try to learn Markdown syntax. It’s simple!###
), and subsections are level 4 headings (####
).The idea is to have:
2
empty lines between last link and new section.1
empty line between heading & first link of its section.0
empty line between two links.1
empty line at the end of each .md
file.Example:
[...]
* [An Awesome Book](http://example.com/example.html)
(blank line)
(blank line)
### Example
(blank line)
* [Another Awesome Book](http://example.com/book.html)
* [Some Other Book](http://example.com/other.html)
Don’t put spaces between ]
and (
:
BAD : * [Another Awesome Book] (http://example.com/book.html)
GOOD: * [Another Awesome Book](http://example.com/book.html)
If you include the author, use ` - ` (a dash surrounded by single spaces):
BAD : * [Another Awesome Book](http://example.com/book.html)- John Doe
GOOD: * [Another Awesome Book](http://example.com/book.html) - John Doe
Put a single space between the link and its format:
BAD : * [A Very Awesome Book](https://example.org/book.pdf)(PDF)
GOOD: * [A Very Awesome Book](https://example.org/book.pdf) (PDF)
Author comes before format:
BAD : * [A Very Awesome Book](https://example.org/book.pdf)- (PDF) Jane Roe
GOOD: * [A Very Awesome Book](https://example.org/book.pdf) - Jane Roe (PDF)
Multiple formats (We prefer a single link for each resource. When there is no single link with easy access to different formats, multiple links may make sense. But every link we add creates maintenance burden so we try to avoid it.):
BAD : * [Another Awesome Book](http://example.com/)- John Doe (HTML)
BAD : * [Another Awesome Book](https://downloads.example.org/book.html)- John Doe (download site)
GOOD: * [Another Awesome Book](http://example.com/) - John Doe (HTML) [(PDF, EPUB)](https://downloads.example.org/book.html)
Include publication year in title for older books:
BAD : * [A Very Awesome Book](https://example.org/book.html) - Jane Roe - 1970
GOOD: * [A Very Awesome Book (1970)](https://example.org/book.html) - Jane Roe
GOOD: * [Will Be An Awesome Book Soon](http://example.com/book2.html) - John Doe (HTML) *(:construction: in process)*
GOOD: * [A Way-backed Interesting Book](https://web.archive.org/web/20211016123456/http://example.com/) - John Doe (HTML) *(:card_file_box: archived)*
Free Licenses (While we include resources that are “All Rights Reserved” but free to read, we encourage the use of free licenses, such as Creative Commons):
GOOD: * [A Very Awesome Book](https://example.org/book.pdf) - Jane Roe (PDF) (CC BY-SA)
Supported Licences (no versioning):
CC BY
‘Creative Commons attribution’CC BY-NC
‘Creative Commons non-commercial’CC BY-SA
‘Creative Commons share-alike’CC BY-NC-SA
‘Creative Commons non-commercial, share-alike’CC BY-ND
‘Creative Commons no-derivatives’CC BY-NC-ND
‘Creative Commons non-commercial, no-derivatives’GFDL
‘Gnu Free Documentation License’aa
comes before ab
.one two
comes before onetwo
If you see a misplaced link, check the linter error message to know which lines should be swapped.
While the basics are relatively simple, there is a great diversity in the resources we list. Here are some notes on how we deal with this diversity.
Our lists provide a minimal set of metadata: titles, URLs, creators, platforms, and access notes.
https
) URLs are always preferred over non-secure (http
) urls where HTTPS has been implemented.For translated works the original author should be credited. We recommend using MARC relators to credit creators other than authors, as in this example:
* [A Translated Book](http://example.com/book.html) - John Doe, `trl.:` Mike The Translator
here, the annotation trl.:
uses the MARC relator code for “translator”.
,
to delimit each item in the author list.et al.
”.Compiled from StackOverflow documentation
”.*(Leanpub account or valid email requested)*
.The first rule in deciding which list a resource belongs in is to see how the resource describes itself. If it calls itself a book, then maybe it’s a book.
Because the Internet is vast, we don’t include in our lists:
Our competitive programming lists are not as strict about these exclusions. The scope of the repo is determined by the community; if you want to suggest a change or addition to the scope, please use an issue to make the suggestion.
We’re not that fussy about book-ness. Here are some attributes that signify that a resource is a book:
There are lots of books that we list that don’t have these attributes; it can depend on context.
Sometimes these can be hard to distinguish!
Courses often have associated textbooks, which we would list in our books lists. Courses have lectures, exercises, tests, notes or other didactic aids. A single lecture or video by itself is not a course. A PowerPoint is not a course.
If you can print it out and retain its essence, it’s not an Interactive Tutorial.
.github/workflows/fpb-lint.yml
)To trigger URL validation, push a commit that includes a commit message containing check_urls=file_to_check
:
check_urls=free-programming-books.md free-programming-books-en.md