├── .github └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── CONTRIBUTING.md ├── README.md ├── app ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .prettierrc.json ├── LICENSE ├── README.md ├── gatsby-browser.js ├── gatsby-config.js ├── gatsby-node.js ├── gatsby-ssr.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── src │ ├── components │ │ ├── amazonurl.js │ │ ├── bookcard.js │ │ ├── bookmark.js │ │ ├── categorydescription.js │ │ ├── feed.js │ │ ├── goodreadsimage.js │ │ ├── header.js │ │ ├── image.js │ │ ├── layout.css │ │ ├── layout.js │ │ ├── seo.js │ │ ├── sidebar.js │ │ └── sortByDropdown.js │ ├── context │ │ ├── bookReducer.js │ │ └── globalState.js │ ├── data │ │ ├── books.json │ │ └── categories.json │ ├── images │ │ ├── amazon.png │ │ ├── gatsby-astronaut.png │ │ ├── gatsby-icon.png │ │ └── goodreads.png │ ├── pages │ │ ├── 404.js │ │ ├── index.js │ │ ├── page-2.js │ │ └── readingList.js │ ├── styles │ │ ├── global.css │ │ └── sidebar.css │ └── templates │ │ └── categoryTemplate.js └── yarn.lock ├── package-lock.json └── utils ├── .gitignore ├── HOUSEKEEPING.md ├── README.MD ├── book_name_to_details.json ├── books.json ├── config-sample.py ├── gooodreads.py ├── housekeep.py ├── pyvenv.cfg ├── read_file.py ├── requirements.txt ├── update_json_files.py └── write_file.py /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | (todo:please remove this todo and the sections you did not check below before you make your pull request. 2 | If you are unsure, please check other PRs like this one: https://github.com/hackerkid/Mind-Expanding-Books/pull/207#issue-377268434) 3 | 4 | ## In this pull request 5 | - [ ] I am adding a new book. 6 | - [ ] I am adding a new category 7 | - [ ] Removing a book 8 | 9 | ## Adding new book 10 | * The book I am adding is _ _ _ _ 11 | * I am adding this book to _ _ _ _ section. 12 | * I have read this book _ _ times. 13 | * I think this book deserves to be in this list because _ _ _ _ 14 | 15 | **If you are adding more than 1 books duplicate this section** 16 | 17 | ## Add new category 18 | * The category I am adding is _ _ _ _ 19 | * The reason why I think this category should be there is because _ _ _ _ 20 | * - [ ] I have added at least one book to this category 21 | 22 | **If you are adding more than 1 category duplicate this section** 23 | 24 | ## Remove a book 25 | * The book I am removing is _ _ _ _ 26 | * I am removing this book from _ _ _ _ section. 27 | * I have read this book _ _ times. 28 | * I think this book should not be in this list because _ _ _ _ 29 | 30 | **If you are removing more than 1 book duplicate this section.** 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution Guidelines 2 | 3 | ## What are the criteria for adding a new book? 4 | The mission of this list is to curate books that can change the lives of people for the better. 5 | 6 | So you should add a book that has changed your life!! 7 | 8 | Here are some questions that you can potentially ask yourself to help make this decision. If the answer is yes for most of them, feel free to create a pull request! 9 | 10 | 1. If you had the money to gift a book to every college graduate this year, would you gift this book? 11 | 2. Would you gift this book to your children at any point in their lives? 12 | 3. If there are only 3 books that you can keep a physical copy of in your life, would this book be one of them? 13 | 4. Would your life have been better off had you read this book 10 years back? 14 | 5. Would this book be relevant 1000 years from now? 15 | 16 | 17 | ## How to create a pull request? 18 | - Search for existing books in [README.md](README.md) and make sure that you are not adding a duplicate. 19 | - Insert the book in the following format in [README.md](README.md). Don't change any other files. 20 | `| Book name | Author | [Goodreads rating](Goodreads url) | Year published |` 21 | - Make sure that the book is inserted in the correct order according to the Goodreads rating. 22 | - Mention in pull request clearly why you think the book deserves to be on the list. 23 | 24 | Thank you! 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mind Expanding Books 2 | 3 | [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) 4 | 5 | Looking to find a book an interesting book to read but don't know where to start? You are in the right place! 6 | 7 | See [Contributing Guidelines](CONTRIBUTING.md) for details on how the books are curated. 8 | 9 | 10 | ## Table of Contents 11 | - [Mind Expanding Books](#mind-expanding-books) 12 | - [Table of Contents](#table-of-contents) 13 | - [Books](#books) 14 | - [Startups and Business](#startups-and-business) 15 | - [Philosophy And Psychology](#philosophy-and-psychology) 16 | - [Autobiographies and Biographies](#autobiographies-and-biographies) 17 | - [History](#history) 18 | - [Science and Medicine](#science-and-medicine) 19 | - [Logic and Problem Solving](#logic-and-problem-solving) 20 | - [Politics](#politics) 21 | - [Economics](#economics) 22 | - [Gender](#gender) 23 | - [Sexuality](#sexuality) 24 | - [Race](#race) 25 | - [Education](#education) 26 | - [Writing](#writing) 27 | - [Theater and Film](#theater-and-film) 28 | - [Shakespeare](#shakespeare) 29 | - [Fiction](#fiction) 30 | - [Classics](#classics) 31 | - [Fantasy](#fantasy) 32 | - [Historical Fiction](#historical-fiction) 33 | - [Humor](#humor) 34 | - [Mystery](#mystery) 35 | - [Science Fiction](#science-fiction) 36 | - [Horror](#horror) 37 | - [Miscellaneous](#miscellaneous) 38 | - [Health](#health) 39 | - [Design](#design) 40 | - [Travel](#travel) 41 | - [Language](#language) 42 | - [Nature](#nature) 43 | - [Art](#art) 44 | - [Credits](#credits) 45 | - [License](#license) 46 | 47 | # Books 48 | 49 | ## Startups and Business 50 | | Name | Author | Goodreads Rating | Year Published | 51 | |------|--------|------------------|----------------| 52 | | Shoe Dog: A Memoir by the Creator of Nike | Phil Knight | [4.46](https://www.goodreads.com/book/show/27220736-shoe-dog) | 2016 | 53 | | The Ride of a Lifetime: Lessons Learned from 15 Years as CEO of the Walt Disney Company | Robert Iger, Joel Lovell | [4.44](https://www.goodreads.com/book/show/44525305-the-ride-of-a-lifetime) | 2019 | 54 | | Bad Blood: Secrets and Lies in a Silicon Valley Startup | John Carreyrou | [4.4](https://www.goodreads.com/book/show/37976541-bad-blood) | 2018 | 55 | | The Compound Effect | Darren Hardy | [4.40](https://www.goodreads.com/book/show/9420697-the-compound-effect) | 2010 | 56 | | Never Split the Difference | Chris Voss | [4.39](https://www.goodreads.com/book/show/26156469-never-split-the-difference) | 2016 | 57 | | Failing to Succeed: The Story of India's First E-Commerce Company | K. Vaitheeswaran | [4.39](https://www.goodreads.com/book/show/35626210-failing-to-succeed) | 2017 | 58 | | High Output Management | Andy Grove | [4.38](https://www.goodreads.com/book/show/324750.High_Output_Management) | 1995 | 59 | | Outwitting the Devil: The Secret to Freedom and Success | Napoleon Hill | [4.38](https://www.goodreads.com/book/show/10713286-outwitting-the-devil) | 2011 | 60 | | The Millionaire Fastlane: Crack the Code to Wealth and Live Rich for a Lifetime! | M.J. DeMarco | [4.28](https://www.goodreads.com/book/show/18872437-the-millionaire-fastlane) | 2011 | 61 | | How to Get From Where You Are to Where You Want to Be : The 25 Principles of Success | Jack Canfield, Janet Switzer | [4.26](https://www.goodreads.com/book/show/96593.The_Success_Principles) | 2007 | 62 | | The Big Short: Inside the Doomsday Machine | Michael Lewis | [4.26](https://www.goodreads.com/book/show/8032112-the-big-short) | 2015 | 63 | | The Future Is Faster Than You Think: How Converging Technologies Are Transforming Business, Industries, and Our Lives | Peter H. Diamandis, Steven Kotler | [4.25](https://www.goodreads.com/book/show/52290273-the-future-is-faster-than-you-think) | 2020 | 64 | | The Middle Finger Project | Ash Ambirge | [4.22](https://www.goodreads.com/book/show/46064079-the-middle-finger-project?from_search=true&from_srp=true&qid=WY4obsfps3&rank=1) | 2020 | 65 | | Creativity, Inc.: Overcoming the Unseen Forces That Stand in the Way of True Inspiration | Ed Catmull, Amy Wallace | [4.21](https://www.goodreads.com/book/show/18077903-creativity-inc) | 2014 | 66 | | The Score Takes Care of Itself: My Philosophy of Leadership | Bill Walsh, Steve Jamison, Craig Walsh | [4.21](https://www.goodreads.com/book/show/6342995-the-score-takes-care-of-itself) | 2009 | 67 | | The Hard Thing About Hard Things: Building a Business When There Are No Easy Answers | Ben Horowitz | [4.20](https://www.goodreads.com/book/show/18176747-the-hard-thing-about-hard-things) | 2014 | 68 | | Think and Grow Rich | Napoleon Hill | [4.17](https://www.goodreads.com/book/show/30186948-think-and-grow-rich) | 1937 | 69 | | AI Superpowers: China, Silicon Valley, and the New World Order | Kai-Fu Lee | [4.16](https://www.goodreads.com/book/show/38242135-ai-superpowers) | 2018 | 70 | | Nail it then Scale it: The Entrepreneur's Guide to Creating and Managing Breakthrough | Nathan Furr | [4.13](https://www.goodreads.com/book/show/12236649-nail-it-then-scale-it) | 2011 | 71 | | Outliers: Story of Success | Malcolm Gladwell | [4.11](https://www.goodreads.com/work/quotes/3364437-outliers-the-story-of-success) | 2008 | 72 | | The Strategy and Tactics of Pricing : A Guide to Move More Profitable | Thomas Nagle, John Hogan, Joseph Zale | [4.09](https://www.goodreads.com/book/show/99919.The_Strategy_and_Tactics_of_Pricing) | 2005 | 73 | | Principles: Life and Work | Ray Dalio | [4.07](https://www.goodreads.com/book/show/34536488-principles) | 2017 | 74 | | Start with Why: How Great Leaders Inspire Everyone to Take Action | Simon Sinek | [4.07](https://www.goodreads.com/book/show/7108725-start-with-why) | 2009 | 75 | | Leaving Microsoft to Change the World: An Entrepreneur's Odyssey to Educate the World's Children | John Wood | [4.07](https://www.goodreads.com/book/show/95429.Leaving_Microsoft_to_Change_the_World) | 2006 | 76 | | Hackers and Painters | Paul Graham | [4.06](https://www.goodreads.com/book/show/41793.Hackers_Painters) | 2004 | 77 | | How Google Works | Eric Schmidt, Jonathan Rosenberg | [4.06](https://www.goodreads.com/book/show/23158207-how-google-works) | 2014 | 78 | | Crucial Conversations: Tools for Talking When Stakes Are High | Kerry Patterson, Joseph Grenny, Ron McMillan, Al Switzler | [4.05](https://www.goodreads.com/book/show/15014.Crucial_Conversations) | 2002 | 79 | | Good to Great: Why Some Companies Make the Leap And Others Don't | Jim Collins | [4.05](https://www.goodreads.com/book/show/76865.Good_to_Great) | 2001 | 80 | | The Lean Startup: How Constant Innovation Creates Radically Successful Businesses | Eric Ries | [4.04](https://www.goodreads.com/book/show/10127019-the-lean-startup) | 2011 | 81 | | The Power of Full Engagement: Managing Energy, Not Time, is the Key to High Performance and Personal Renewal | Jim Loehr, Tony Schwartz | [4.03](http://www.goodreads.com/book/show/68985.The_Power_of_Full_Engagement) | 2005 | 82 | | The Checklist Manifesto: How To Get Things Right | Atul Gawande | [4.03](http://www.goodreads.com/book/show/6667514-the-checklist-manifesto) | 2009 | 83 | | Where Good Ideas Come From | Steven Johnson | [4.03](https://www.goodreads.com/book/show/8034188-where-good-ideas-come-from) | 2010 | 84 | | Delivering Happiness: A Path to Profits, Passion, and Purpose | Tony Hsieh | [4.01](http://www.goodreads.com/book/show/6828896-delivering-happiness) | 2010 | 85 | | The Innovator's Dilemma | clayton m. christensen | [4.00](https://www.goodreads.com/book/show/2615.The_Innovator_s_Dilemma) | 1997 | 86 | | Influencer: The New Science of Leading Change | Joseph Grenny, Kerry Patterson | [3.98](https://www.goodreads.com/book/show/914211.Influencer) | 2007 | 87 | | The E-Myth Revisited: Why Most Small Businesses Don't Work and What to Do About It | Michael E. Gerber | [3.98](https://www.goodreads.com/book/show/81948.The_E_Myth_Revisited) | 1995 | 88 | | Getting Things Done: The Art of Stress-Free Productivity | David Allen | [3.98](https://www.goodreads.com/book/show/1633.Getting_Things_Done) | 2001 | 89 | | Losing My Virginity: How I Survived, Had Fun, and Made a Fortune Doing Business My Way | Richard Branson | [3.97](https://www.goodreads.com/book/show/211099.Losing_My_Virginity) | 1998 | 90 | | SuperFreakonomics: Global Cooling, Patriotic Prostitutes, and Why Suicide Bombers Should Buy Life Insurance | Steven D. Litt | [3.96](https://www.goodreads.com/book/show/6402364-superfreakonomics) | 2009 | 91 | | The Ten Faces of Innovation | Tom Kelley | [3.96](https://www.goodreads.com/book/show/95656.The_Ten_Faces_of_Innovation) | 2005 | 92 | | Rich Dad Poor Dad : What The Rich Teach Their Kids About Money That The Poor And Middle Class Don't | Robert T. Kiyosaki | [3.95](https://www.goodreads.com/book/show/69571.Rich_Dad_Poor_Dad) | 1997 | 93 | | Founders At Work: Stories Of Startups Early Days | Jessica Livingston | [3.94](https://www.goodreads.com/book/show/98233.Founders_at_Work) | 2007 | 94 | | The Paypal Wars | Eric M. Jackson | [3.94](https://www.goodreads.com/book/show/4052.The_PayPal_Wars) | 2010 | 95 | | Lean In : Women, Work and the Will to Lead | Sheryl Sandberg | [3.94](http://www.goodreads.com/book/show/16071764-lean-in) | 2013 | 96 | | ReWork: Change the Way You Work Forever | David Heinemeier Hansson | [3.93](https://www.goodreads.com/book/show/6732019-rework) | 2010 | 97 | | The 22 Immutable Laws Of Branding | Laura Ries and Al Ries | [3.93](https://www.goodreads.com/book/show/1565533.The_22_Immutable_Laws_of_Branding) | 1998 | 98 | | Freakonomics: A Rogue Economist Explores the Hidden Side of Everything | Steven D. Levitt, Stephen J. Dubner | [3.93](https://www.goodreads.com/book/show/1202.Freakonomics) | 2006 | 99 | | The Tipping Point: How Little Things Can Make a Big Difference | Malcolm Gladwell | [3.92](https://www.goodreads.com/book/show/2612.The_Tipping_Point) | 2002 | 100 | | The Four Steps to the Epiphany | Steve Blank | [3.92](https://www.goodreads.com/book/show/762542.The_Four_Steps_to_the_Epiphany) | 2005 | 101 | | The Curse of the Mogul | Jonathan A. Knee, Bruce C. Greenwald, Ava Seave | [3.91](https://www.goodreads.com/book/show/7162410-the-curse-of-the-mogul) | 2009 | 102 | | David and Goliath: Underdogs, Misfits, and the Art of Battling Giants | Malcolm Gladwell | [3.90](https://www.goodreads.com/book/show/15751404-david-and-goliath) | 2013 | 103 | | Strategy for Sustainability: A Business Manifesto | Adam Werbach | [3.89](https://www.goodreads.com/book/show/6553353-strategy-for-sustainability) | 2009 | 104 | | The Black Swan: The Impact of the Highly Improbable | Nassim Nicholas Taleb | [3.88](http://www.goodreads.com/book/show/242472.The_Black_Swan) | 2007 | 105 | | Contagious: Why Things Catch On | Jonah Berger | [3.88](https://www.goodreads.com/book/show/15801967-contagious) | 2013 | 106 | | Who Says Elephants Can't Dance?: Leading a Great Enterprise through Dramatic Change | Louis V Gerstner, Jr | [3.88](https://www.goodreads.com/book/show/603985.Who_Says_Elephants_Can_t_Dance_) | 2003 | 107 | | Linchpin: Are You Indispensable | Seth Godin | [3.87](https://www.goodreads.com/book/show/7155145-linchpin) | 2010 | 108 | | The $100 Startup: Reinvent the Way You Make a Living, Do What You Love, and Create a New Future | Chris Guillebeau | [3.85](https://www.goodreads.com/book/show/12605157-the-100-startup) | 2012 | 109 | | Too Big to Fail | Andrew Ross Sorkin | [3.85](https://www.goodreads.com/book/show/6687247-too-big-to-fail) | 2011 | 110 | | The Paradox of Choice: Why More Is Less | Barry Shwartz | [3.84](https://www.goodreads.com/book/show/10639.The_Paradox_of_Choice) | 2005 | 111 | | The Art of the Start: The Time-Tested, Battle-Hardened Guide for Anyone Starting Anything | Guy Kawasaki | [3.82](https://www.goodreads.com/book/show/37875.The_Art_of_the_Start) | 2004 | 112 | | Crowdsourcing: Why the Power of the Crowd Is Driving the Future of Business | Jeff Howe | [3.82](https://www.goodreads.com/book/show/2601510-crowdsourcing) | 2008 | 113 | | Cognitive Surplus: Creativity and Generosity in a Connected Age | Clay Shirky | [3.82](https://www.goodreads.com/book/show/7614793-cognitive-surplus) | 2010 | 114 | | Data Driven | D.J. Patil | [3.80](https://www.goodreads.com/book/show/24780653-data-driven) | 2015 | 115 | | Zero to One | Peter Thiel, Blake Masters | [3.75](https://www.goodreads.com/book/show/18050143-zero-to-one) | 2014 | 116 | | One Click: Jeff Bezos and the Rise of Amazon.com | Richard Brandt | [3.75](https://www.goodreads.com/book/show/11223478-one-click) | 2011 | 117 | | Big Data: A Revolution That Will Transform How We Live, Work, and Think | Kenneth Cukier | [3.70](https://www.goodreads.com/book/show/15815598-big-data) | 2013 | 118 | | The 4-Hour Work Week: Escape the 9-5, Live Anywhere and Join the New Rich | Timothy Ferriss | [3.61](https://www.goodreads.com/book/show/368593.The_4_Hour_Workweek) | 2012 | 119 | | The Accidental Billionaires : The Founding of Facebook, a Tale of Sex, Money, Genius and Betrayal | Ben Mezrich | [3.50](https://www.goodreads.com/book/show/6326920-the-accidental-billionaires) | 2009 | 120 | 121 | If you like Mind Expanding books you should check out my new project http://diff.blog. It's a platform that help you keep updated with the developer community. 122 | 123 | 124 | 125 | ## Philosophy And Psychology 126 | | Name | Author | Goodreads Rating | Year Published | 127 | |------|--------|------------------|----------------| 128 | | The Almanack of Naval Ravikant: A Guide to Wealth and Happiness | Eric Jorgenson | [4.64](https://www.goodreads.com/book/show/54898389-the-almanack-of-naval-ravikant) | 2020 | 129 | | Karma Yoga | Swami Vivekanand | [4.51](https://www.goodreads.com/book/show/827031.Karma_Yoga) | 1999 | 130 | | The Ascent of Humanity | Charles Eisenstein | [4.43](https://www.goodreads.com/book/show/482505.The_Ascent_of_Humanity) | 2007 131 | | Tattoos on the Heart: The Power of Boundless Compassion | Gregory Boyle | [4.41](https://www.goodreads.com/book/show/7090193-tattoos-on-the-heart) | 2010 | 132 | | The Slight Edge - Secret to a Successful Life | Jeff Olson | [4.39](https://www.goodreads.com/book/show/590652.The_Slight_Edge) | 2005 | 133 | | Education and the Significance of Life | Krishnamurti | [4.38](https://www.goodreads.com/book/show/353435.Education_and_the_Significance_of_Life) | 2008 | 134 | | Passions Within Reason: The Strategic Role of the Emotions | Robert H. Frank | [4.34](https://www.goodreads.com/book/show/452114.Passions_Within_Reason) | 1989 | 135 | | The Daily Stoic: 366 Meditations on Wisdom, Perseverance, and the Art of Living | Ryan Holiday, Stephan Hanselman | [4.34](https://www.goodreads.com/book/show/29093292-the-daily-stoic) | 2016 | 136 | | Man's Search for Meaning | Viktor E. Frankl | [4.33](https://www.goodreads.com/book/show/4069.Man_s_Search_for_Meaning) | 2006 | 137 | | Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones| James Clear | [4.32](https://www.goodreads.com/book/show/40121378-atomic-habits) | 2018 | 138 | | The User Illusion: Cutting Consciousness Down to Size | Tor Norretranders | [4.30](https://www.goodreads.com/book/show/106732.The_User_Illusion) | 1999 | 139 | | Born to Run: A Hidden Tribe, Superathletes, and the Greatest Race the World Has Never Seen | Christopher McDougall | [4.27](https://www.goodreads.com/book/show/6289283-born-to-run) | 2009 | 140 | | Prometheus Rising | Robert Anton Wilson | [4.26](https://www.goodreads.com/book/show/28597.Prometheus_Rising) | 2010 | 141 | | The Concise 48 Laws of Power | Robert Greene | [4.25](https://www.goodreads.com/book/show/18224060-the-concise-48-laws-of-power) | 2011 | 142 | | The Hero with a Thousand Faces | Joseph Campbell | [4.24](https://www.goodreads.com/book/show/588138.The_Hero_With_a_Thousand_Faces) | 1972 | 143 | | The Magic of Thinking Big | David J. Schwartz | [4.23](https://www.goodreads.com/book/show/759945.The_Magic_of_Thinking_Big) | 1959 | 144 | | Zen Mind, Beginner's Mind | Shunryu Suzuki, David Chadwick | [4.23](https://www.goodreads.com/book/show/402843.Zen_Mind_Beginner_s_Mind) | | 145 | | The Age of Insight: The Quest to Understand the Unconscious in Art, Mind, and Brain, from Vienna 1900 to the Present | Eric Kandel | [4.22](https://www.goodreads.com/book/show/12263681-the-age-of-insight) | 2012 | 146 | | Meditations | Marcus Aurelius | [4.21](https://www.goodreads.com/book/show/30659.Meditations) | | 147 | | Influence: The Psychology of Persuasion | Robert B. Cialdini | [4.18](https://www.goodreads.com/book/show/5752.The_Blank_Slate) | 2006 | 148 | | The Gift of Fear: Survival Signals That Protect Us from Violence | Gavin de Becker | [4.18](https://www.goodreads.com/book/show/56465.The_Gift_of_Fear) | 2000 | 149 | | Gifts of Imperfection | Brene Brown | [4.18](https://www.goodreads.com/book/show/7015403-the-gifts-of-imperfection) | | 150 | | Metamagical Themas: Questing For The Essence Of Mind And Pattern | Douglas Hofstadter | [4.16](https://www.goodreads.com/book/show/181239.Metamagical_Themas) | 1996 | 151 | | The Truth About Everything: An Irreverent History of Philosophy : With Illustrations | Matthew Stewart | [4.15](https://www.goodreads.com/book/show/18528861-the-truth-about-everything) | 1997 | 152 | | Illusions: The Adventures of a Reluctant Messiah | Richard Bach | [4.15](https://www.goodreads.com/book/show/29946.Illusions) | 1977 | 153 | | How to Win Friends and Influence People | Dale Carnegie | [4.14](https://www.goodreads.com/book/show/4865.How_to_Win_Friends_and_Influence_People) | 1998 | 154 | | Creative Visualization: Use the Power of Your Imagination to Create What You Want in Your Life | Shakti Gawain | [4.13](https://www.goodreads.com/book/show/582533.Creative_Visualization) | 2002 | 155 | | Bulfinch's Mythology | Thomas Bulfinch | [4.13](https://www.goodreads.com/book/show/588147.Bulfinch_s_Mythology) | 1998 | 156 | | Ego Is the Enemy | Ryan Holiday | [4.12](https://www.goodreads.com/book/show/27036528-ego-is-the-enemy) | 2016 | 157 | | Awaken the Giant Within: How to Take Immediate Control of Your Mental, Emotional, Physical and Financial Destiny! | Anthony Robbins | [4.11](https://www.goodreads.com/book/show/180116.Awaken_the_Giant_Within) | 1991 | 158 | | The Power of Now: A Guide to Spiritual Enlightenment | Eckhart Tolle | [4.11](https://www.goodreads.com/book/show/6708.The_Power_of_Now) | 1997 | 159 | | Tuesdays with Morrie | Mitch Albom | [4.11](https://www.goodreads.com/book/show/6900.Tuesdays_with_Morrie) | 1997 | 160 | | The Way of the Monk | Gaur Gopal Das | [4.10](https://www.goodreads.com/book/show/45712959-the-way-of-the-monk) | 2020 | 161 | | Predictably Irrational | Dan Ariely | [4.10](https://www.goodreads.com/book/show/1713426.Predictably_Irrational) | 2008 | 162 | | Flow: The Psychology of Optimal Experience | Mihaly Csikszentmihalyi | [4.10](https://www.goodreads.com/book/show/66354.Flow) | 1990 | 163 | | Thinking, Fast and Slow | Daniel Kahneman | [4.09](https://www.goodreads.com/book/show/11468377-thinking-fast-and-slow) | 2011 | 164 | | Irrational Man: A Study in Existential Philosophy | William Barrett | [4.09](https://www.goodreads.com/book/show/83321.Irrational_Man) | | 165 | | Happy: Why More or Less Everything is Absolutely Fine | Derren Brown | [4.08](https://www.goodreads.com/book/show/30142270-happy) | 2016 | 166 | | The Beginning of Infinity: Explanations That Transform the World | David Deutsch | [4.08](https://www.goodreads.com/book/show/10483171-the-beginning-of-infinity) | 2011 | 167 | | Metaphors We Live By | George Lakoff, Mark Johnson | [4.08](https://www.goodreads.com/book/show/34459.Metaphors_We_Live_By) | 2003 | 168 | | Grit | Angela Duckworth | [4.08](https://www.goodreads.com/book/show/27213329-grit) | 2016 | 169 | | In Defense of Food: An Eater's Manifesto | Michael Pollan | [4.07](https://www.goodreads.com/book/show/315425.In_Defense_of_Food) | 2008 | 170 | | The Blank Slate: The Modern Denial of Human Nature | Steven Pinker | [4.07](http://www.goodreads.com/book/show/5752.The_Blank_Slate) | 2003 | 171 | | The History of Western Philosophy | Bertrand Russell | [4.06](https://www.goodreads.com/book/show/243685.A_History_of_Western_Philosophy) | 2008 | 172 | | Moral Tribes: Emotion, Reason, and the Gap Between Us and Them | Joshua Greene | [4.05](https://www.goodreads.com/book/show/17707599-moral-tribes) | 2013 | 173 | | Thus Spoke Zarathustra | Friedrich Nietzsche | [4.05](https://www.goodreads.com/book/show/51893.Thus_Spoke_Zarathustra) | 1883 | 174 | | The Elephant in the Brain: Hidden Motives in Everyday Life | Kevin Simler, Robin Hanson | [4.05](https://www.goodreads.com/book/show/28820444-the-elephant-in-the-brain) | 2017 | 175 | | Quiet: The Power of Introverts in a World That Can't Stop Talking | Susan Cain | [4.04](https://www.goodreads.com/book/show/8520610-quiet) | 2012 | 176 | | The Future of the Mind: The Scientific Quest to Understand, Enhance, and Empower the Mind | Michio Kaku | [4.04](https://www.goodreads.com/book/show/17978489-the-future-of-the-mind) | 2014 | 177 | | Every Thing Must Go: Metaphysics Naturalized | James Ladyman, Don Ross, et al | [4.04](https://www.goodreads.com/book/show/757403.Every_Thing_Must_Go) | 2007 | 178 | | Antifragile: Things That Gain from Disorder (Incerto) | Nassim Nicholas Taleb | [4.04](https://www.goodreads.com/book/show/13530973-antifragile) | 2012 | 179 | | Mindset: The new psychology of success | Carol S. Dweck,Ph.D. | [4.04](https://www.goodreads.com/book/show/40745.Mindset) | 2006 | 180 | | The Power of Habit: Why We Do What We Do In Life And Business | Charles Duhigg | [4.03](https://www.goodreads.com/book/show/12609433-the-power-of-habit) | 2012 | 181 | | The Upside of Irrationality: The Unexpected Benefits of Defying Logic | Dan Ariely | [4.00](https://www.goodreads.com/book/show/7815744-the-upside-of-irrationality) | 2010 | 182 | | Outsmarting IQ: The Emerging Science of Learnable Intelligence | David Perkins | [4.00](https://www.goodreads.com/book/show/1008488.Outsmarting_Iq) | 1995 | 183 | | The Art of War | Sun Tzu | [3.95](https://www.goodreads.com/book/show/10534.The_Art_of_War) | 2005 | 184 | | Willpower: Rediscovering the Greatest Human Strength | Ron P. Baumeister, John Tierney | [3.95](https://www.goodreads.com/book/show/11104933-willpower) | 2011 | 185 | | A Whole New Mind: Why Right-Brainers Will Rule the Future | Daniel H. Pink | [3.95](https://www.goodreads.com/book/show/99315.A_Whole_New_Mind) |2006 | 186 | | Vagabonding: An Uncommon Guide to the Art of Long-Term World Travel | Rolf Potts | [3.92](https://www.goodreads.com/book/show/100247.Vagabonding) |2002 | 187 | | Supernormal: Science, Yoga, and the Evidence for Extraordinary Psychic Abilities | Dean Radin | [3.91](https://www.goodreads.com/book/show/8694125-alone-together) | 2013 | 188 | | Prisoner's Dilemma | William Poundstone | [3.91](https://www.goodreads.com/book/show/29506.Prisoner_s_Dilemma) | 1993 | 189 | | The Subtle Art Of Not Giving a F@ck: A Counterintuitive Approach to Living a Good Life | Mark Manson | [3.91](https://www.goodreads.com/book/show/28257707-the-subtle-art-of-not-giving-a-f-ck) | 2017 | 190 | | The Stuff of Thought: Language as a Window into Human Nature | Steven Pinker | [3.90](https://www.goodreads.com/book/show/373969.The_Stuff_of_Thought) | 2007 | 191 | | Consilience: The Unity of Knowledge | Edward O. Wilson | [3.90](https://www.goodreads.com/book/show/55981.Consilience) | 1999 | 192 | | Why We Make Mistakes: How We Look Without Seeing, Forget Things in Seconds, and Are All Pretty Sure We Are Way Above Average | Joseph T. Hallinan | [3.87](https://www.goodreads.com/book/show/5040579-why-we-make-mistakes) | 2009 | 193 | | You Just Don't Understand: Women and Men in Conversation | Deborah Tannen | [3.86](https://www.goodreads.com/book/show/147222.You_Just_Don_t_Understand) | 2007 | 194 | | Just the Arguments: 100 of the Most Important Arguments in Western Philosophy | Michael Bruce, Steven Barbone | [3.85](https://www.goodreads.com/book/show/12838972-just-the-arguments) | 2011 | 195 | | What the Dog Saw: and other adventures | Malcolm Gladwell | [3.82](https://www.goodreads.com/book/show/6516450-what-the-dog-saw-and-other-adventures) | 2009 | 196 | | Spent: Sex, Evolution, and Consumer Behavior | Geoffrey Miller | [3.82](https://www.goodreads.com/book/show/6283340-spent) | 2009 | 197 | | Games People Play: The Basic Handbook of Transactional Analysis | Eric Berne. | [3.81](https://www.goodreads.com/book/show/49176.Games_People_Play) | 1964 | 198 | | This Will Make You Smarter: New Scientific Concepts to Improve Your Thinking | John Brockman | [3.81](https://www.goodreads.com/book/show/13035774-this-will-make-you-smarter) | 2012 | 199 | | Intuition Pumps And Other Tools for Thinking | Daniel C. Dennett | [3.80](https://www.goodreads.com/book/show/18378002-intuition-pumps-and-other-tools-for-thinking) | 2014 | 200 | | Jonathan Livingston Seagull | Richard Bach | [3.80](https://www.goodreads.com/book/show/71728.Jonathan_Livingston_Seagull) | 1970| 201 | | Why Does the World Exist?: An Existential Detective Story | Jim Holt | [3.77](http://www.goodreads.com/book/show/8854815-why-does-the-world-exist) | 2012 | 202 | | The Social Contract | Jean-Jacques Rousseau, Maurice Cranston | [3.75](https://www.goodreads.com/book/show/12651.The_Social_Contract) | 2009 | 203 | | The Ethical Brain: The Science of Our Moral Dilemmas | Michael S. Gazzaniga | [3.70](https://www.goodreads.com/book/show/328734.The_Ethical_Brain) | 2006 | 204 | | Why Smart People Can Be So Stupid | Robert J Sternberg | [3.68](https://www.goodreads.com/book/show/300300.Why_Smart_People_Can_Be_So_Stupid) | 2003 | 205 | | Alone Together: Why We Expect More from Technology and Less from Each Others | Sherry Turkle | [3.62](http://www.goodreads.com/book/show/8694125-alone-together) | 2011 | 206 | | How to Win Every Argument: The Use and Abuse of Logic | Madsen Pirie | [3.55](https://www.goodreads.com/book/show/112731.How_to_Win_Every_Argument) | 2006 | 207 | | Rapt: Attention and the Focused Life: Winifred Gallagher | Winifred Gallagher | [3.54](https://www.goodreads.com/book/show/6262510-rapt) | 2009 | 208 | | Utilitarianism | Geoffrey Scarre | [3.50](https://www.goodreads.com/book/show/3807762-utilitarianism) | 1996 | 209 | | The Age of Em: Work, Love and Life When Robots Rule the Earth | Robin Hanson | [3.41](https://www.goodreads.com/book/show/26831944-the-age-of-em) | 2016 | 210 | | The Fine Art of Small Talk: How To Start a Conversation, Keep It Going, Build Networking Skills -- and Leave a Positive Impression | Debra Fine | [3.36](https://www.goodreads.com/book/show/93409.The_Fine_Art_of_Small_Talk) | 2005 | 211 | | Snoop: What Your Stuff Says About You: Sam Gosling | Sam Gosling | [3.33](https://www.goodreads.com/book/show/1581330.Snoop) | 2001 | 212 | 213 | 214 | 215 | ## Autobiographies and Biographies 216 | | Name | Author | Goodreads Rating | Year Published | 217 | |------|--------|------------------|----------------| 218 | | Becoming | Michelle Obama | [4.53](https://www.goodreads.com/book/show/38746485-becoming) | 2018 | 219 | | Unbroken: A World War II Story of Survival, Resilience, and Redemption | Laura Hillenbrand | [4.39](https://www.goodreads.com/book/show/8664353-unbroken) | 2010 | 220 | | Everything Beautiful in Its Time: Seasons of Love and Loss | Jenna Bush Hager | [4.38](https://www.goodreads.com/book/show/51822870-everything-beautiful-in-its-time) | 2020 | 221 | | Long Walk to Freedom | Nelson Mandela | [4.31](http://www.goodreads.com/book/show/318431.Long_Walk_to_Freedom) | 1995 | 222 | | My Life and My Work | Henry Ford | [4.29](http://www.goodreads.com/book/show/1122054.My_Life_And_Work) | 1922 | 223 | | Surely You're Joking, Mr. Feynman!: Adventures of a Curious Character | Richard Feynman | [4.29](https://www.goodreads.com/book/show/5544.Surely_You_re_Joking_Mr_Feynman_) | 1997 | 224 | | The Autobiography of Malcolm X | Malcolm X, Alex Haley | [4.29](http://www.goodreads.com/book/show/92057.The_Autobiography_of_Malcolm_X) |1965 | 225 | | The Third Door:The Wild Quest to Uncover How the World's Most Successful People Launched Their Careers| Alex banayan|[4.28](https://www.goodreads.com/book/show/36739769-the-third-door) | 2018 | 226 | | Elon Musk: Inventing the Future | Ashlee Vance | [4.25](https://www.goodreads.com/book/show/22543496-elon-musk) | 2015 | 227 | | The Last Lecture | Randy Pausch | [4.25](http://www.goodreads.com/book/show/2318271.The_Last_Lecture) | 2008 | 228 | | Freedom in Exile | Dalai Lama XIV | [4.24](http://www.goodreads.com/book/show/567720.Freedom_in_Exile) | 1991 | 229 | | Madame Curie: A Biography | Marie Curie | [4.22](https://www.goodreads.com/book/show/341166.Madame_Curie) | 2001 | 230 | | Autobiography of a Yogi | Paramahansa Yogananda | [4.21](https://www.goodreads.com/book/show/639864.Autobiography_of_a_Yogi) | 1946 | 231 | | Wings of Fire | A.P.J. Abdul Kalam | [4.20](http://www.goodreads.com/book/show/634583.Wings_of_Fire) | 2011 | 232 | | Man Without Fear | Rajat Gupta | [4.20](https://www.goodreads.com/en/book/show/44334846-mind-without-fear) | 2019 | 233 | | The Man Who Knew Infinity : A Life of the Genius Ramanujan | Robert Kanigel | [4.15](https://www.goodreads.com/book/show/106139.The_Man_Who_Knew_Infinity) | 1991 | 234 | | An Astronaut's Guide to Life on Earth | Chris Hadfield | [4.14](https://www.goodreads.com/book/show/18170143-an-astronaut-s-guide-to-life-on-earth) | 2013 | 235 | | The Diary of a Young Girl | Anne Frank | [4.10](http://www.goodreads.com/book/show/48855.The_Diary_of_a_Young_Girl) | 1993 | 236 | | The Innovators: How a Group of Hackers, Geniuses and Geeks Created the Digital Revolution | Walter Isaacson | [4.10](https://www.goodreads.com/book/show/21856367-the-innovators) | 2014 | 237 | | A Sense of the World | Jason Roberts | [4.10](https://www.goodreads.com/book/show/126049.A_Sense_of_the_World?from_search=true&from_srp=true&qid=L2EvsarKWR&rank=1) | 2005 | 238 | | Einstein: His Life and Universe | Walter Isaacson | [4.09](https://www.goodreads.com/book/show/10884.Einstein) | 2007 | 239 | | Steve Jobs | Walter Issacson | [4.09](http://www.goodreads.com/book/show/11084145-steve-jobs) | 2011 | 240 | | My Experiments with Truth | Mahatma Gandhi | [4.07](http://www.goodreads.com/book/show/112803.The_Story_of_My_Experiments_With_Truth) | 1993 | 241 | | The Story of My Life | Helen Keller | [4.07](http://www.goodreads.com/book/show/821611.The_Story_of_My_Life) | 1990 | 242 | | The Immortal Life of Henrietta Lacks | Rebecca Skloot | [4.05](https://www.goodreads.com/book/show/6493208-the-immortal-life-of-henrietta-lacks?ac=1&from_search=true) | 2010 | 243 | | Losing My Virginity: The Autobiography | Richard Branson | [3.97](https://www.goodreads.com/book/show/9533705-losing-my-virginity) |1999| 244 | | My Inventions: The Autobiography of Nikola Tesla | Nikola Tesla | [3.96](https://www.goodreads.com/book/show/493.My_Inventions?ac=1&from_search=true&qid=PQw29iDQp5&rank=1) | 2006 | 245 | | Ghost in the Wires: My Adventures as the World's Most Wanted Hacker | Kevin Mitnick | [3.95](http://www.goodreads.com/book/show/10256723-ghost-in-the-wires) | 2011 | 246 | | An Autobiography: Toward Freedom | Jawaharlal Nehru | [3.85](http://www.goodreads.com/book/show/322939.An_Autobiography) | 1989 | 247 | | iWoz: Computer Geek to Cult Icon: How I Invented the Personal Computer, Co-Founded Apple, and Had Fun Doing It | Steve Wozniak | [3.82](http://www.goodreads.com/book/show/798635.iWoz) | 2007 | 248 | 249 | 250 | 251 | ## History 252 | | Name | Author | Goodreads Rating | Year Published | 253 | |------|--------|------------------|----------------| 254 | | Sapiens: A Brief History of Humankind | Yuval Noah Harari | [4.42](https://www.goodreads.com/book/show/23692271-sapiens) | 2014 | 255 | | Bloodlands: Europe Between Hitler and Stalin | Timothy Snyder | [4.36](https://www.goodreads.com/book/show/6572270-bloodlands) | 2010 | 256 | | How the Internet Happened: From Netscape to the iPhone | Brian McCullough | [4.36](https://www.goodreads.com/en/book/show/38212134-how-the-internet-happened) | 2018 | 257 | | The Discoverers | Daniel J. Boorstin | [4.34](https://www.goodreads.com/book/show/714380.The_Discoverers) | 2012 | 258 | | Homo Deus: A History of Tomorrow | Yuval Noah Harari | [4.27](https://www.goodreads.com/book/show/31138556-homo-deus) | 2017 | 259 | | One Minute to Midnight: Kennedy, Khrushchev, and Castro on the Brink of Nuclear War | Michael Dobbs | [4.20](https://www.goodreads.com/book/show/2606779-one-minute-to-midnight) | 2008 | 260 | | The Codebreakers: The Comprehensive History of Secret Communication from Ancient Times to the Internet | David Kahn | [4.18](https://www.goodreads.com/book/show/29608.The_Codebreakers) | 1996 | 261 | | Blindness | José Saramago | [4.13](https://www.goodreads.com/book/show/2526.Blindness) | 1995 | 262 | | From Dawn to Decadence: 500 Years of Western Cultural Life 1500 to the Present | Jacques Barzun | [4.12](https://www.goodreads.com/book/show/58233.From_Dawn_to_Decadence) | 2001 | 263 | | The Soul of a New Machine | Tracy Kidder | [4.12](https://www.goodreads.com/book/show/7090.The_Soul_of_a_New_Machine) | 1981 | 264 | | Why the West Rules--for Now: The Patterns of History, and What They Reveal About the Future | Ian Morris | [4.09](https://www.goodreads.com/book/show/9491855-why-the-west-rules-for-now) | 2010 | 265 | | The Nazi Doctors: Medical Killing and the Psychology of Genocide | Robert Jay Lifton | [4.07](https://www.goodreads.com/book/show/173187.The_Nazi_Doctors) | 1986 | 266 | | God Created The Integers: The Mathematical Breakthroughs that Changed History | Stephen Hawking | [4.06](https://www.goodreads.com/book/show/2096.God_Created_The_Integers) | | 267 | | Churchill's Secret War: The British Empire and the Ravaging of India during World War II | Madhusree Mukerjee | [4.05](https://www.goodreads.com/book/show/8890989-churchill-s-secret-war) | 2010 | 268 | | El Tiempo Entre Costuras | María Dueñas | [4.04](https://www.goodreads.com/book/show/7502166-el-tiempo-entre-costuras) |2009 | 269 | | Guns, Germs, And Steel : The Fates Of Human Societies | Jared M. Diamond | [4.00](https://www.goodreads.com/book/show/1842.Guns_Germs_and_Steel) | 2005 | 270 | | Discovery of India | Jawaharlal Nehru | [3.98](http://www.goodreads.com/book/show/154126.The_Discovery_of_India) | 1946 | 271 | | The Rational Optimist: How Prosperity Evolves (P.S.) | Matt Ridley | [3.98](https://www.goodreads.com/book/show/7776209-the-rational-optimist) | 2010 | 272 | | Kingpin: How One Hacker Took Over the Billion-Dollar Cybercrime Underground | Kevin Poulson | [3.96](http://www.goodreads.com/book/show/9319468-kingpin) | 2011 | 273 | | The Ghost Map: The Story of London's Most Terrifying Epidemic--and How It Changed Science, Cities, and the Modern World | Steven Johnson | [3.91](https://www.goodreads.com/book/show/36086.The_Ghost_Map) |2006 | 274 | | The Rise and Fall of the British Empire | Lawrence James | [3.89](https://www.goodreads.com/book/show/143980.The_Rise_and_Fall_of_the_British_Empire) | 1997 | 275 | | The Master Switch: The Rise and Fall of Information Empires | Tim Wu | [3.89](https://www.goodreads.com/book/show/8201080-the-master-switch) | 2010 | 276 | | Spycraft | Robert Wallace, H. Keith Melton, Henry R. Schlesinger | [3.81](http://www.goodreads.com/book/show/971936.Spycraft) |1987 | 277 | | Civilization: The West and the Rest: Niall Ferguson | Niall Ferguson | [3.78](https://www.goodreads.com/book/show/10475421-civilization) | 2011 | 278 | | The UNIX-HATERS Handbook | Simson Garfinkel, Daniel Weise, Steven Strassmann | [3.78](https://www.goodreads.com/book/show/174904.The_UNIX_Hater_s_Handbook) | 1994 | 279 | | The Revenge of Geography: What the Map Tells Us About Coming Conflicts and the Battle Against Fate | Robert D. Kaplan | [3.68](https://www.goodreads.com/book/show/13330422-the-revenge-of-geography) | 2012 | 280 | | The World Is Flat: A Brief History of the Twenty-first Century | Thomas L. Friedman | [3.66](https://www.goodreads.com/book/show/1911.The_World_Is_Flat) | 2006 | 281 | 282 | 283 | 284 | ## Science and Medicine 285 | | Name | Author | Goodreads Rating | Year Published | 286 | |------|--------|------------------|----------------| 287 | | Behave: The Biology of Humans at Our Best and Worst | Robert M. Sapolsky | [4.42](https://www.goodreads.com/book/show/31170723-behave) | 2017 | 288 | | Asimov's New Guide to Science | Isaac Asimov | [4.36](https://www.goodreads.com/book/show/977262.Asimov_s_New_Guide_To_Science) | 1985 | 289 | | Factfulness: Ten Reasons We're Wrong About the World – and Why Things Are Better Than You Think | Hans Rosling | [4.36](https://www.goodreads.com/book/show/34890015-factfulness) | 2018 | 290 | | The Gene: An Intimate History | Siddhartha Mukherjee | [4.35](https://www.goodreads.com/book/show/27276428-the-gene) | 2016 | 291 | | Origins of Form: The Shape of Natural and Man-Made Things | Christopher Williams | [4.31](https://www.goodreads.com/book/show/16255011-origins-of-form) | 2013 | 292 | | The Body: A Guide for Occupants | Bill Bryson | [4.31](https://www.goodreads.com/book/show/43582376-the-body) | 2019 | 293 | | Gödel, Escher, Bach: An Eternal Golden Braid | Douglas R. Hofstadter | [4.30](https://www.goodreads.com/book/show/24113.G_del_Escher_Bach) | 1979 | 294 | | The Little Schemer | Daniel P. Friedman, Matthias Felleisen, Duane Bibby, Gerald J. Sussman | [4.27](https://www.goodreads.com/book/show/548914.The_Little_Schemer) | 1995 | 295 | | Scientific Genius: A Psychology of Science | Dean Keith Simonton | [4.25](https://www.goodreads.com/book/show/1752295.Scientific_Genius) | 1988 | 296 | | Out of Control: The New Biology of Machines, Social Systems, and the Economic World | Kevin Kelly | [4.24](https://www.goodreads.com/book/show/16080353-out-of-control) | 1995 | 297 | | The Brain: The Story of You | David Eagleman | [4.20](https://www.goodreads.com/book/show/25776132.the-brain) | 2015 | 298 | | A Short History of Nearly Everything | Bill Bryson | [4.19](https://www.goodreads.com/book/show/21.A_Short_History_of_Nearly_Everything) |2003 | 299 | | Things to Make and Do in the Fourth Dimension | Matt Parker | [4.19](https://www.goodreads.com/en/book/show/21805670-things-to-make-and-do-in-the-fourth-dimension) | 2014 | 300 | | The Symbolic Species: The Co-evolution of Language and the Brain | Terrence W. Deacon | [4.17](https://www.goodreads.com/book/show/733691.The_Symbolic_Species) | 1998 | 301 | | A Brief History of Time | Stephen Hawking | [4.12](https://www.goodreads.com/book/show/3869.A_Brief_History_of_Time) | 1998 | 302 | | The Selfish Gene | Richard Dawkins | [4.11](http://www.goodreads.com/book/show/61535.The_Selfish_Gene) |1976 | 303 | | Figments of Reality: The Evolution of the Curious Mind | Ian Stewart, Jack Cohen | [4.11](https://www.goodreads.com/book/show/164560.Figments_of_Reality) | 2009 | 304 | | The New Executive Brain: Frontal Lobes in a Complex World | Elkhonon Goldberg | [4.07](https://www.goodreads.com/book/show/6745893-the-new-executive-brain) | | 305 | | The Extended Phenotype: The Long Reach of the Gene | Richard Dawkins | [4.07](https://www.goodreads.com/book/show/61538.The_Extended_Phenotype) | 1999 | 306 | | Rare Earth: Why Complex Life is Uncommon in the Universe | Peter D. Ward, Donald Brownlee | [4.06](https://www.goodreads.com/book/show/88552.Rare_Earth) | 2003 | 307 | | Stiff: The Curious Lives of Human Cadavers | Mary Roach | [4.05](https://www.goodreads.com/book/show/32145.Stiff) | 2004 | 308 | | The Man Who Mistook His Wife for A Hat and Other Clinical Tales | Oliver Sacks | [4.05](https://www.goodreads.com/book/show/63697.The_Man_Who_Mistook_His_Wife_for_a_Hat_and_Other_Clinical_Tales) | 1998 | 309 | | Darwin's Dangerous Idea | Daniel C. Dennett | [4.03](https://www.goodreads.com/book/show/2068.Darwin_s_Dangerous_Idea) |1995 | 310 | | The Inevitable: Understanding the 12 Technological Forces That Will Shape Our Future | Kevin Kelly | [4.02](https://www.goodreads.com/book/show/27209431-the-inevitable) | 2016 | 311 | | The Outer Limits of Reason: What Science, Mathematics, and Logic Cannot Tell Us | Noson S. Yanofsky | [4.00](http://www.goodreads.com/book/show/17841838-the-outer-limits-of-reason) | 2013 | 312 | | The Structure of Scientific Revolutions: 50th Anniversary Edition | Thomas S. Kuhn | [3.99](https://www.goodreads.com/book/show/61539.The_Structure_of_Scientific_Revolutions) | 1996 | 313 | | At Home in the Universe: The Search for the Laws of Self-Organization and Complexity | Stuart Kauffman | [3.97](https://www.goodreads.com/book/show/319006.At_Home_in_the_Universe) | 1996 | 314 | | The Wealth of Networks: How Social Production Transforms Markets and Freedom | Yochai Benkler | [3.95](https://www.goodreads.com/book/show/14721.The_Wealth_of_Networks) | 2006 | 315 | | Mind Children: The Future of Robot and Human Intelligence | Hans Moravec. | [3.95](https://www.goodreads.com/book/show/648195.Mind_Children) | 1990 | 316 | | Profiles of the Future: An Inquiry into the Limits of the Possible | Arthur C. Clarke | [3.94](https://www.goodreads.com/book/show/169258.Profiles_of_the_Future) | 1962 | 317 | | How to Find a Habitable Planet | James Kasting | [3.93](https://www.goodreads.com/book/show/7551498-how-to-find-a-habitable-planet) | 2010 | 318 | | The 10,000 Year Explosion: How Civilization Accelerated Human Evolution | Gregory Cochran, Henry Harpending | [3.91](https://www.goodreads.com/book/show/6033964-the-10-000-year-explosion) | 2009 | 319 | | The Disappearing Spoon: And Other True Tales of Madness, Love, and the History of the World from the Periodic Table of the Elements | Sam Kean | [3.91](https://www.goodreads.com/book/show/7247854-the-disappearing-spoon) | 2010 | 320 | | Evolution for Everyone: How Darwin's Theory Can Change the Way We Think About Our Lives | David Sloan Wilson | [3.90](http://www.goodreads.com/book/show/159062.Evolution_for_Everyone) | 2007 | 321 | | Life at the Speed of Light: From the Double Helix to the Dawn of Digital Life | J. Craig Venter | [3.87](www.goodreads.com/book/show/17674969-life-at-the-speed-of-light) | 2013 | 322 | | The Shallows: What the Internet is Doing to Our Brains | Nicholas Carr | [3.85](https://www.goodreads.com/book/show/9778945-the-shallows) | 2011 | 323 | | Catching Fire: How Cooking Made Us Human | Richard Wrangham | [3.83](https://www.goodreads.com/book/show/11148989-catching-fire) | 2009 | 324 | | Heaven in a Chip: Fuzzy Visions of Society and Science in the Digital Age | Bart Kosko | [3.82](https://www.goodreads.com/book/show/172645.Heaven_in_a_Chip) | 2000 | 325 | | The Quark and the Jaguar: Adventures in the Simple and the Complex | Murray Gell-Mann | [3.81](https://www.goodreads.com/book/show/270881.The_Quark_and_the_Jaguar) |1994 | 326 | | Tomorrowland: Our Staggering Journey from Science Fiction to Science Fact | Steven Kotler | [3.80](http://www.goodreads.com/book/show/25060233-tomorrowland) | 2015 | 327 | | Origins of Genius: Darwinian Perspectives on Creativity | Dean Keith | [3.74](https://www.goodreads.com/book/show/254489.Origins_of_Genius) | 1999 | 328 | | Waters of the World: the story of the scientists who unravelled the mysteries of our seas, glaciers, and atmosphere and made the planet whole | Sarah Dry | [3.65](https://www.goodreads.com/book/show/43389003-waters-of-the-world) | 2019 | 329 | | Mind Wars: Brain Research and National Defense | Jonathan D. Moreno | [3.45](http://www.goodreads.com/book/show/599321.Mind_Wars) | 2007 | 330 | 331 | 332 | 333 | ## Logic and Problem Solving 334 | | Name | Author | Goodreads Rating | Year Published | 335 | |------|--------|------------------|----------------| 336 | | What Is the Name of This Book?: The Riddle of Dracula and Other Logical Puzzles | Raymond M. Smullyan | [4.24](https://www.goodreads.com/book/show/493576.What_Is_the_Name_of_This_Book_) | 2011 | 337 | | A Mind for Numbers: How to Excel at Math and Science even If You Flunked Algebra | Barbara Oakley | [4.22](http://www.goodreads.com/book/show/18693655-a-mind-for-numbers) | 2014 | 338 | | How to Solve It: A New Aspect of Mathematical Method | George Polya | [4.16](https://www.goodreads.com/book/show/192221.How_to_Solve_It) | 2015 | 339 | | Guide to Competitive Programming: Learning and Improving Algorithms Through Contests | Antti Laaksonen | [4.15]( https://www.goodreads.com/book/show/36881945-guide-to-competitive-programming) | 2016 | 340 | | Superforecasting: The Art and Science of Prediction | Philip E. Tetlock, Dan Gardner | [4.10](https://www.goodreads.com/book/show/23995360-superforecasting) | 2015 | 341 | | Problem Solving 101: A Simple Book | Ken Watanabe | [4.10](https://www.goodreads.com/book/show/6271219-problem-solving-101) | 2009 | 342 | | Labyrinths of Reason: Paradox, Puzzles, and the Frailty of Knowledge | William Poundstone | [4.05](https://www.goodreads.com/book/show/55436.Labyrinths_of_Reason) | 1989 | 343 | | Mazes for the Mind: Computers and the Unexpected | Clifford A. Pickover | [4.05](https://www.goodreads.com/book/show/1986400.Mazes_for_the_Mind) | 1992 | 344 | | Outnumbered: Exploring the Algorithms That Control Our Lives | David Sumpter | [3.99](https://www.goodreads.com/book/show/36762542-outnumbered) | 2018 | 345 | | Thinking Forth: A Language and Philosophy for Solving Problems | Leo Brodie | [3.96](https://www.goodreads.com/book/show/2995657-thinking-forth) | 1984 | 346 | 347 | 348 | 349 | ## Politics 350 | | Name | Author | Goodreads Rating | Year Published | 351 | |------|--------|------------------|----------------| 352 | | The New Jim Crow: Mass Incarceration in the Age of Colorblindness | Michelle Alexander | [4.49](https://www.goodreads.com/book/show/6792458-the-new-jim-crow)| 2010 353 | | Justice: What's the Right Thing to Do? | Michael J. Sandel | [4.25](https://www.goodreads.com/book/show/6452731-justice) | | 354 | | On Tyranny: Twenty Lessons from the Twentieth Century | Timothy Snyder | [4.20](https://www.goodreads.com/book/show/33917107-on-tyranny) | 2017 | 355 | | The Righteous Mind: Why Good People are Divided by Politics and Religion | Jonathan Haidt | [4.16](https://www.goodreads.com/book/show/11324722-the-righteous-mind) | 2012 | 356 | | Strangers in Their Own Land: Anger and Mourning on the American Right | Arlie Russell Hochschild | [4.15](https://www.goodreads.com/book/show/28695425-strangers-in-their-own-land) | 2016 | 357 | | Game Change: Obama and the Clintons, McCain and Palin, and the Race of a Lifetime | John Heilemann, Mark Halperin | [4.10](https://www.goodreads.com/book/show/6694937-game-change) | 2010 | 358 | | Bolo'bolo | P.M. | [4.05](https://www.goodreads.com/book/show/12395170-bolo-bolo) | 1984 | 359 | | The Myth of the Rational Voter: Why Democracies Choose Bad Policies | Bryan Caplan | [3.96](https://www.goodreads.com/book/show/698866.The_Myth_of_the_Rational_Voter) | 2007 | 360 | | The Art of Deception: Controlling the Human Element of Security | Kevin D. Mitnick | [3.76](https://www.goodreads.com/book/show/18160.The_Art_of_Deception) | 2003 | 361 | | Resource Wars: The New Landscape of Global Conflict | Michael Klare | [3.73](https://www.goodreads.com/book/show/149206.Resource_Wars) |2001 | 362 | | The Audacity of Hope: Thoughts on Reclaiming the American Dream | Barack Obama | [3.70](https://www.goodreads.com/book/show/9742.The_Audacity_of_Hope) | 2006 | 363 | 364 | 365 | 366 | ## Economics 367 | | Name | Author | Goodreads Rating | Year Published | 368 | |------|--------|------------------|----------------| 369 | | The Simple Path to Wealth: Your road map to financial independence and a rich, free life | J.L. Collins | [4.47](https://www.goodreads.com/book/show/30646587-the-simple-path-to-wealth) | 2016 | 370 | | Origin of Wealth | Eric D. Beinhocker | [4.23](https://www.goodreads.com/book/show/22456.The_Origin_of_Wealth) | 2006 | 371 | | Every Shot Counts: Using the Revolutionary Strokes Gained Approach to Improve Your Golf Performance and Strategy | Mark Broadie | [4.23](https://www.goodreads.com/book/show/17674971-every-shot-counts) | 2014 | 372 | | Economic Facts and Fallacies | Thomas Sowell | [4.18](https://www.goodreads.com/book/show/2064279.Economic_Facts_and_Fallacies) | 2008 | 373 | | Debt - Updated and Expanded: The First 5,000 Years | David Graeber | [4.17](https://www.goodreads.com/book/show/6617037-debt) | 2011 | 374 | | Capital in the Twenty-First Century | Thomas Piketty | [4.01](http://www.goodreads.com/book/show/18736925-capital-in-the-twenty-first-century) | 2014 | 375 | | Freakonomics: A Rogue Economist Explores the Hidden Side of Everything | Steven D. Levitt, Stephen J. Dubner | [3.98](https://www.goodreads.com/book/show/1202.Freakonomics) | 2006 | 376 | | 23 Things They Don't Tell You About Capitalism | Ha-Joon Chang | [3.97](http://www.goodreads.com/book/show/8913542-23-things-they-don-t-tell-you-about-capitalism) | 2010 | 377 | | The Signal and the Noise: Why So Many Predictions Fail--but Some Don't | Nate Silver | [3.96](https://www.goodreads.com/book/show/13588394-the-signal-and-the-noise) | 2012 | 378 | | Currency Wars: The Making of the Next Global Crisis | James Rickards | [3.96](https://www.goodreads.com/book/show/11515298-currency-wars) | 2011 | 379 | | The Ascent of Money: A Financial History of the World | Niall Ferguson | [3.88](https://www.goodreads.com/book/show/2714607-the-ascent-of-money) |2008 | 380 | | The Bottom Billion: Why the Poorest Countries are Failing and What Can Be Done About It | Paul Collier | [3.85](https://www.goodreads.com/book/show/493371.The_Bottom_Billion) | 2007 | 381 | | The Thank You Economy | Gary Vaynerchuk | [3.83](https://www.goodreads.com/book/show/9203287-the-thank-you-economy) | 2011 | 382 | | Super Crunchers: Why Thinking-By-Numbers is the New Way To Be Smart | Ian Ayres | [3.70](https://www.goodreads.com/book/show/1081413.Super_Crunchers) | 2007 | 383 | | A Farewell to Alms : A Brief Economic History of the World | Gregory Clark | [3.67](https://www.goodreads.com/book/show/150437.A_Farewell_to_Alms) | 2007 | 384 | 385 | 386 | 387 | ## Gender 388 | | Name | Author | Goodreads Rating | Year Published | 389 | |------|--------|------------------|----------------| 390 | | Cemetary Boys | Aiden Thomas | [4.48](https://www.goodreads.com/book/show/52339313-cemetery-boys) | 2020 391 | | Delusions of Gender: How Our Minds, Society, and Neurosexism Create Difference | Cordelia Fine | [4.15](https://www.goodreads.com/book/show/8031168-delusions-of-gender) | 2010 392 | | Paul Takes the Form of a Mortal Girl | Andrea Lawlor | [4.00](https://www.goodreads.com/book/show/35838277-paul-takes-the-form-of-a-mortal-girl) | 2017 393 | | Becoming A Man | P. Carl | [3.95](https://www.goodreads.com/book/show/50091840-becoming-a-man) | 2020 394 | 395 | 396 | 397 | ## Sexuality 398 | | Name | Author | Goodreads Rating | Year Published | 399 | |------|--------|------------------|----------------| 400 | | Sex at Dawn: The Prehistoric Origins of Modern | Christopher Ryan, Cacilda Jetha | [4.02](https://www.goodreads.com/book/show/7640261-sex-at-dawn) | 2010 | 401 | | The Ethical Slut: A Guide to Infinite Sexual Possibilities | Dossie Easton, Catherine A. Liszt. | [3.83](http://www.goodreads.com/book/show/54944.The_Ethical_Slut?from_search=true) | 2004 | 402 | | The Sex Myth | Brooke Magnanti | [3.50](https://www.goodreads.com/book/show/13569582-the-sex-myth) | 2015 | 403 | 404 | 405 | 406 | ## Race 407 | | Name | Author | Goodreads Rating | Year Published | 408 | |------|--------|------------------|----------------| 409 | | So You Want to Talk About Race | Ijeoma Oluo | [4.53](https://www.goodreads.com/book/show/35099718-so-you-want-to-talk-about-race) | 2018 | 410 | | The Origin of Others | Toni Morrison | [4.22](https://www.goodreads.com/book/show/34758228-the-origin-of-others) | 2017 | 411 | 412 | 413 | 414 | ## Education 415 | | Name | Author | Goodreads Rating | Year Published | 416 | |------|--------|------------------|----------------| 417 | | Educated: A Memoir | Tara Westover| [4.47](https://www.goodreads.com/book/show/35133922-educated) | 2018 | 418 | | Mindstorms: Children, Computers, And Powerful Ideas | Seymour A. Papert | [4.32](https://www.goodreads.com/book/show/703532.Mindstorms) | 1993 | 419 | | The Little Prince | Antoine de Saint-Exupéry | [4.31](https://www.goodreads.com/book/show/71091.Il_piccolo_principe) | 1943 | 420 | | How Children Fail | John Holt | [4.22](https://www.goodreads.com/book/show/573009.How_Children_Fail) | 1995 | 421 | | Deep Work: Rules for Focused Success in a Distracted World | Cal Newport | [4.20](https://www.goodreads.com/book/show/25744928-deep-work) | 2016 | 422 | | Make It Stick: The Science of Successful Learning | Peter C. Brown, Henry L. Roediger III, Mark A. McDaniel | [4.20](https://www.goodreads.com/book/show/18770267.make-it-stick) | 2014 | 423 | | Teaching as a Subversive Activity | Neil Postman, Charles Weingartner | [4.19](https://www.goodreads.com/book/show/79681.Teaching_as_a_Subversive_Activity) | 1971 | 424 | | Limitless: Upgrade Your Brain, Learn Anything Faster, and Unlock Your Exceptional Life | Jim Kwik | [4.09](https://www.goodreads.com/book/show/49994260-limitless?from_search=true&from_srp=true&qid=pbeSkuESjB&rank=1) | 2020 | 425 | | Summerhill School: A New View of Childhood | A. S. Neill, Albert Lamb | [4.09](https://www.goodreads.com/book/show/178734.Summerhill) | 1995 | 426 | | The Art of Learning: An Inner Journey to Optimal Performance | Josh Waitzkin | [4.08](https://www.goodreads.com/book/show/857333.The_Art_of_Learning) | 2016 | 427 | | Wounded by School: Recapturing the Joy in Learning and Standing Up to Old School Culture | Kirsten Olson, Sara Lawrence-Lightfoot, Parker J. Palmer | [3.92](https://www.goodreads.com/book/show/6425208-wounded-by-school) | 2009 | 428 | | Curious Minds: How a Child Becomes a Scientist | John Brockman | [3.72](https://www.goodreads.com/book/show/409588.Curious_Minds) | 2005 | 429 | 430 | 431 | 432 | ## Writing 433 | | Name | Author | Goodreads Rating | Year Published | 434 | |------|--------|------------------|----------------| 435 | | Hat Box: The Collected Lyrics | Stephen Sondheim | [4.77](https://www.goodreads.com/book/show/12909101-hat-box) | | 436 | | On Writing: A Memoir of the Craft | Stephen King | [4.31](https://www.goodreads.com/book/show/10569.On_Writing) | 2002 | 437 | | Bird by Bird: Some Instructions on Writing and Life | Anne Lamott | [4.23](https://www.goodreads.com/book/show/12543.Bird_by_Bird) | 1995 | 438 | | Clear and Simple as the Truth | Francis-Noël Thomas, Mark Turner | [4.06](https://www.goodreads.com/book/show/120549.Clear_and_Simple_as_the_Truth) | 1996 | 439 | | The Sense of Style: The Thinking Person's Guide to Writing in the 21st Century | Steven Pinker | [4.03](http://www.goodreads.com/book/show/20821371-the-sense-of-style) | 2014 | 440 | 441 | 442 | 443 | ## Theater and Film 444 | | Name | Author | Goodreads Rating | Year Published | 445 | |------|--------|------------------|----------------| 446 | | Different Every Night: Putting the play on stage and keeping it fresh | Mike Alfreds | [4.69](https://www.goodreads.com/book/show/3493241-different-every-night) | 2008 | 447 | | Impro: Improvisation and the Theatre | Keith Johnstone | [4.27](https://www.goodreads.com/book/show/306940.Impro) | | 448 | | The Actor and the Target | Declan Donnellan | [4.25](https://www.goodreads.com/book/show/611466.The_Actor_and_the_Target) | 2006 | 449 | | In the Blink of an Eye: A Perspective on Film Editing | Walter Murch | [4.24](https://www.goodreads.com/book/show/2141.In_the_Blink_of_an_Eye) | 1995 | 450 | | Notes on Directing: 130 Lessons in Leadership from the Director's Chair | Frank Hauser, Russell Reich | [4.21](https://www.goodreads.com/book/show/254808.Notes_on_Directing) | | 451 | | How to Stop Acting | Harold Guskin | [4.17](https://www.goodreads.com/book/show/808735.How_to_Stop_Acting) | 2003 | 452 | | A Practical Handbook for the Actor | Melissa Bruder, Lee Michael Cohn, Madeleine Olnek, Nathaniel Pollack, Robert Previtio, Scott Zigler, David Mamet | [3.87](https://www.goodreads.com/book/show/166207.A_Practical_Handbook_for_the_Actor) | 1986 | 453 | 454 | 455 | 456 | ## Shakespeare 457 | | Name | Author | Goodreads Rating | Year Published | 458 | |------|--------|------------------|----------------| 459 | | Thinking Shakespeare: A How-to Guide for Student Actors, Directors, and Anyone Else Who Wants to Feel More Comfortable With the Bard | Barry Edelstein. | [4.62](https://www.goodreads.com/book/show/1334872.Thinking_Shakespeare) | | 460 | | Hamlet and Revenge | Eleanor Prosser | [4.50](https://www.goodreads.com/book/show/625956.Hamlet_Revenge_) | 1971 | 461 | | Shakespeare's Metrical Art | George T. Wright | [4.39](https://www.goodreads.com/book/show/428615.Shakespeare_s_Metrical_Art) | 1991 | 462 | | Hamlet in Purgatory | Stephen Greenblatt | [3.98](https://www.goodreads.com/book/show/33179.Hamlet_in_Purgatory) | 2002 | 463 | 464 | 465 | 466 | ## Fiction 467 | 468 | ### Classics 469 | | Name | Author | Goodreads Rating | Year Published | 470 | |------|--------|------------------|----------------| 471 | | The Master and Margarita | Mikhail Bulgakov | [4.32](https://www.goodreads.com/book/show/117833.The_Master_and_Margarita) | 1966 | 472 | | Infinite Jest | David Foster Wallace | [4.31](https://www.goodreads.com/book/show/6759.Infinite_Jest) | 1996 | 473 | | The Brothers Karamazov | Fyodor Dostoevsky, Richard Pevear, Larissa Volokhonsky | [4.30](https://www.goodreads.com/book/show/4934.The_Brothers_Karamazov) | 1880 | 474 | | Pride And Prejudice | Jane Austen | [4.24](https://www.goodreads.com/book/show/1885.Pride_and_Prejudice) | 1813 | 475 | | A Prayer for Owen Meany | John Irving | [4.22](https://www.goodreads.com/book/show/4473.A_Prayer_for_Owen_Meany) | 1989 | 476 | | Letters From The Earth | Mark Twain | [4.22](https://www.goodreads.com/book/show/37813.Letters_from_the_Earth) | 1962 | 477 | | One Flew Over the Cuckoo's Nest | Ken Kesey | [4.18](https://www.goodreads.com/book/show/332613.One_Flew_Over_the_Cuckoo_s_Nest) | 1963 | 478 | | Crime and Punishment | Fyodor Dostoyevsky | [4.18](https://www.goodreads.com/book/show/7144.Crime_and_Punishment) | 1866 | 479 | | 1984 | George Orwell | [4.17](https://www.goodreads.com/book/show/40961427-1984) | 1949 | 480 | | The Giver | Lois Lowry | [4.13](https://www.goodreads.com/book/show/3636.The_Giver) | 1993 | 481 | | Steppenwolf: A Novel | Hermann Hesse, Basil Creighton | [4.11](https://www.goodreads.com/book/show/16631.Steppenwolf) | 1927 | 482 | | The Glass Bead Game | Hermann Hesse, Richard and Clara Winston | [4.11](https://www.goodreads.com/book/show/16634.The_Glass_Bead_Game) | 1943 | 483 | | War and Peace | Leo Tolstoy | [4.11](https://www.goodreads.com/book/show/656.War_and_Peace) | 1867 | 484 | | Jane Eyre | Charlotte Brontë | [4.10](https://www.goodreads.com/book/show/10210.Jane_Eyre) | 1847 | 485 | | Germinal | Emile Zola | [4.10](https://www.goodreads.com/book/show/28407.Germinal) | 1885 | 486 | | If on a Winter's Night a Traveler | Italo Calvino and William Weaver | [4.08](https://www.goodreads.com/book/show/374233.If_on_a_Winter_s_Night_a_Traveler) | 1979 | 487 | | Slaughterhouse-Five | Kurt Vonnegut Jr. | [4.08](https://www.goodreads.com/book/show/4981.Slaughterhouse_Five) | 1969 | 488 | | The Wall: (Intimacy) and Other Stories | Jean-Paul Sartre, Lloyd Alexander | [4.07](https://www.goodreads.com/book/show/10031.The_Wall) | 1948 | 489 | | Sense and Sensibility | Jane Austen | [4.06](https://www.goodreads.com/book/show/14935.Sense_and_Sensibility) | 1811 | 490 | | The Picture of Dorian Gray | Oscar Wilde | [4.06](https://www.goodreads.com/book/show/5297.The_Picture_of_Dorian_Gray) | 1890 | 491 | | Watership Down: A Novel | Richard Adams | [4.05 ](https://www.goodreads.com/book/show/76620.Watership_Down) |1972| 492 | | One Hundred Years of Solitude | Gabriel Garcia Marquez, Gregory Rabassa | [4.04](https://www.goodreads.com/book/show/320.One_Hundred_Years_of_Solitude) | 1967 | 493 | | The Death of Ivan Ilych | Leo Tolstoy | [4.04](https://www.goodreads.com/book/show/18386.The_Death_of_Ivan_Ilych) | 1886 | 494 | | Siddhartha | Hermann Hesse | [4.03](https://www.goodreads.com/book/show/52036.Siddhartha) | 1922 | 495 | | Anna Karenina | Leo Tolstoy | [4.02](https://www.goodreads.com/book/show/15823480-anna-karenina) | 1878 | 496 | | Bleak House | Charles Dickens | [4.00](https://www.goodreads.com/book/show/31242.Bleak_House) | 1853 | 497 | | J'accuse | Emile Zola | [3.99](https://www.goodreads.com/book/show/816964.J_accuse) | 1898 | 498 | | Catch 22 | Joseph Heller | [3.98](https://www.goodreads.com/book/show/4610.Catch_22) | 1961 | 499 | | The House of Mirth | Edith Wharton | [3.94](https://www.goodreads.com/book/show/17728.The_House_of_Mirth) | 1905 | 500 | | Confessions of a Mask | Yukio Mishima | [3.91](https://www.goodreads.com/book/show/62794.Confessions_of_a_Mask) | 1949 | 501 | | De L'esprit Des Lois | Montesquieu | [3.91](https://www.goodreads.com/book/show/29854007-de-l-esprit-des-lois-nouvelle-edition) | 1748 | 502 | | Love in the Time of Cholera | Gabriel García Marquéz | [3.9](https://www.goodreads.com/book/show/9712.Love_in_the_Time_of_Cholera) | 1985 | 503 | | Don Quixote | Miguel de Cervantes | [3.85](http://www.goodreads.com/book/show/3836.Don_Quixote) | 1605 | 504 | | Mansfield Park | Jane Austen | [3.84](https://www.goodreads.com/book/show/45032) | 1814 | 505 | | Wuthering Heights | Emily Bronte | [3.82](https://www.goodreads.com/book/show/6185.Wuthering_Heights) | 1847 | 506 | | Père Goriot | Honoré de Balzac | [3.82](https://www.goodreads.com/book/show/59145.P_re_Goriot) | 1834 | 507 | | Adventures of Huckleberry Finn | Mark Twain | [3.80](https://www.goodreads.com/book/show/2956.The_Adventures_of_Huckleberry_Finn) | 1884 | 508 | | The Catcher in the Rye | J.D. Salinger | [3.79](https://www.goodreads.com/book/show/5107.The_Catcher_in_the_Rye) | 1951 | 509 | | Eugénie Grandet | Honoré de Balzac | [3.79](https://www.goodreads.com/book/show/59142.Eug_nie_Grandet) | 1833 | 510 | | Zen and the Art of Motorcycle Maintenance: An Inquiry Into Values | Robert M. Pirsig | [3.76](https://www.goodreads.com/book/show/629.Zen_and_the_Art_of_Motorcycle_Maintenance) | 1974 | 511 | | Candide | Voltaire | [3.76](https://www.goodreads.com/book/show/19380.Candide) | 1759 | 512 | | Atlas Shrugged | Ayn Rand | [3.68](https://www.goodreads.com/book/show/9365.Atlas_Shrugged) | 1957 | 513 | | Madame Bovary | Gustave Flaubert | [3.65](https://www.goodreads.com/book/show/2175.Madame_Bovary) | 1856 | 514 | | Confessions | Jean-Jacques Rousseau | [3.61](https://www.goodreads.com/book/show/12649.Confessions) | 1782 | 515 | | Lettres persanes | Montesquieu | [3.54](http://www.goodreads.com/book/show/509686.Persian_Letters) | 1721 | 516 | | The Director | David Ignatius | [3.43](http://www.goodreads.com/book/show/23316525-the-director) | 2015 | 517 | 518 | 519 | 520 | ### Fantasy 521 | | Name | Author | Goodreads Rating | Year Published | 522 | |------|--------|------------------|----------------| 523 | | The Stormlight Archive | Brandon Sanderson | [4.81](https://www.goodreads.com/book/show/39904817-stormlight-archive-4-book-set?ac=1&from_search=true&qid=QO2o6tRJg4&rank=1) | 2007 | 524 | | The Kingkiller Chronicle | Patrick Rothfuss | [4.55](https://www.goodreads.com/series/45262-the-kingkiller-chronicle) | 2007 | 525 | | The Lord of the Rings | J.R.R. Tolkien | [4.47](https://www.goodreads.com/series/66175-the-lord-of-the-rings) | 1954 | 526 | | A Song of Ice and Fire | George R.R. Martin | [4.45](https://www.goodreads.com/series/43790-a-song-of-ice-and-fire) | 2005 | 527 | | Harry Potter | J.K. Rowling | [4.44](https://www.goodreads.com/series/45175-harry-potter) | 1997 | 528 | | Mistborn | Brandon Sanderson | [4.43](https://www.goodreads.com/series/40910-mistborn) | 2006 | 529 | | Harry Potter and the Methods of Rationality | Eliezer Yudkowsky | [4.38](https://www.goodreads.com/book/show/10016013-harry-potter-and-the-methods-of-rationality) | 2015 | 530 | | Discworld | Terry Pratchett | [4.32](https://www.goodreads.com/series/40650-discworld) | 2001 | 531 | | The Dark Tower | Stephen King | [4.27](https://www.goodreads.com/series/40750-the-dark-tower) | 1982 | 532 | | And the Mountains Echoed | Khaled Hosseini | [4.26](https://www.goodreads.com/book/show/21897740-and-the-mountains-echoed) | 2013 | 533 | | His Dark Materials | Philip Pullman | [4.25](https://www.goodreads.com/book/show/18116.His_Dark_Materials) | 1995 | 534 | | The Last Wish | Andrzej Sapkowski | [4.2](https://www.goodreads.com/book/show/1128434.The_Last_Wish) | 1993 | 535 | | The Chronicles of Narnia | Clive Staples Lewis | [4.24](https://www.goodreads.com/book/show/11127.The_Chronicles_of_Narnia) | 2002 | 536 | | The Wheel of Time | Robert Jordan | [4.19](https://www.goodreads.com/series/41526-the-wheel-of-time) | 1990 | 537 | | The City & The City | China Mieville | [3.91](https://www.goodreads.com/book/show/4703581-the-city-the-city) | 2009 | 538 | | The Broken Empire | Mark Lawrence | [3.87](https://www.goodreads.com/series/64473-the-broken-empire) | 2011 | 539 | | Of Fire and Stars Book |Audrey Coulthurst | [3.76](https://www.goodreads.com/book/show/25164304-of-fire-and-stars) | 2016 | 540 | 541 | 542 | 543 | ### Historical Fiction 544 | | Name | Author | Goodreads Rating | Year Published | 545 | |------|--------|------------------|----------------| 546 | | Lonesome Dove | Larry McMurtry | [4.47](https://www.goodreads.com/book/show/256008.Lonesome_Dove) | 1985 | 547 | | The Help | Kathryn Stockett | [4.45](https://www.goodreads.com/book/show/4667024-the-help) | 2009 | 548 | | A Thousand Splendid Suns | Khaled Hosseini | [4.4](https://www.goodreads.com/book/show/128029.A_Thousand_Splendid_Suns) | 2007 | 549 | | The Book Thief | Markus Zusak | [4.36](https://www.goodreads.com/book/show/19063.The_Book_Thief) | 2005 | 550 | | All the Light We Cannot See | Anthony Doerr | [4.31](https://www.goodreads.com/book/show/18143977-all-the-light-we-cannot-see) | 2014 | 551 | | The Kite Runner | Khaled Hosseini | [4.3](https://www.goodreads.com/book/show/77203.The_Kite_Runner) | 2003 | 552 | | The Pillars of the Earth | Ken Follett | [4.29](https://www.goodreads.com/book/show/5043.The_Pillars_of_the_Earth?from_search=true) | 1989 | 553 | | Kane and Abel | Jeffrey Archer | [4.27](http://www.goodreads.com/book/show/78983.Kane_and_Abel) | 1979 | 554 | | Memoirs of a Geisha | Arthur Golden | [4.12](https://www.goodreads.com/book/show/929.Memoirs_of_a_Geisha) | 1997 | 555 | | One Day in the Life of Ivan Denisovich | Aleksandr Solzhenitsyn | [4](https://www.goodreads.com/book/show/17125.One_Day_in_the_Life_of_Ivan_Denisovich) | 1962 | 556 | | Emma | Jane Austen | [3.99](https://www.goodreads.com/book/show/6969.Emma) | 1815 | 557 | | Sophie's World: A Novel About the History of Philosophy | Jostein Gaarder and Paulette Moller | [3.88](https://www.goodreads.com/book/show/10959.Sophie_s_World) | 1991 | 558 | 559 | 560 | 561 | ### Humor 562 | | Name | Author | Goodreads Rating | Year Published | 563 | |------|--------|------------------|----------------| 564 | | I Hope They Serve Beer In Hell | Tucker Max | [3.51](https://www.goodreads.com/book/show/9010.I_Hope_They_Serve_Beer_in_Hell) | 2006 | 565 | 566 | 567 | 568 | ### Mystery 569 | | Name | Author | Goodreads Rating | Year Published | 570 | |------|--------|------------------|----------------| 571 | | Sherlock Holmes | Arthur Conan Doyle | [4.30](https://www.goodreads.com/series/49996-sherlock-holmes) | 1998 | 572 | | And Then There Were None | Agatha Christie | [4.26](https://www.goodreads.com/series/49996-sherlock-holmes) | 1939 | 573 | | The Murder of Roger Ackroyd | Agatha Christie | [4.20](http://www.goodreads.com/book/show/16328.The_Murder_of_Roger_Ackroyd) | 2006 | 574 | | The Eight | Katherine Neville | [4.17](https://www.goodreads.com/book/show/113310.The_Eight) | | 575 | | The Girl with the Dragon Tattoo | Stieg Larsson | [4.14](https://www.goodreads.com/book/show/2429135.The_Girl_with_the_Dragon_Tattoo) | 2005 | 576 | | Memory Man | David Baldacci | [4.05](https://www.goodreads.com/book/show/23153154-memory-man) | 2015 | 577 | | The Turn of the Key | Ruth Ware | [3.94](https://www.goodreads.com/book/show/42080142-the-turn-of-the-key) | 2019 | 578 | | Angels & Demons | Dan Brown | [3.93](https://www.goodreads.com/book/show/960.Angels_Demons) | 2000 | 579 | | The Girl on the Train | Paula Hawkins | [3.88](https://www.goodreads.com/book/show/22557272-the-girl-on-the-train) | 2015 | 580 | | The Da Vinci Code | Dan Brown | [3.79](http://www.goodreads.com/book/show/968.The_Da_Vinci_Code) | 2006 | 581 | 582 | 583 | 584 | ### Science Fiction 585 | | Name | Author | Goodreads Rating | Year Published | 586 | |------|--------|------------------|----------------| 587 | | Project Hail Mary | Andy Weir | [4.52](https://www.goodreads.com/book/show/54493401-project-hail-mary) | 2021 | 588 | | The Martian | Andy Weir | [4.40](https://www.goodreads.com/book/show/18007564-the-martian) | 2012 | 589 | | The Hitchhiker's Guide to the Galaxy | Douglas Adams | [4.38](http://www.goodreads.com/book/show/11.The_Hitchhiker_s_Guide_to_the_Galaxy) | 1979| 590 | | Champion | Marie Lu | [4.32](https://www.goodreads.com/book/show/14290364-champion) | 2013 | 591 | | Ready Player One | Ernest Cline | [4.31](https://www.goodreads.com/book/show/9969571-ready-player-one) | 2011 | 592 | | 11/22/63 | Stephen King | [4.31](https://www.goodreads.com/book/show/10644930-11-22-63) | 2011 | 593 | | Ender's Game - Saga | Orson Scott Card | [4.30](https://www.goodreads.com/search?utf8=%E2%9C%93&q=ender%27s+saga&search_type=books&search%5Bfield%5D=on) | 1994 | 594 | | The Player of Games | Iain M. Banks | [4.26](https://www.goodreads.com/book/show/18630.The_Player_of_Games) | 1997 | 595 | | The Fifth Sacred Thing | Starhawk | [4.25](https://www.goodreads.com/book/show/80689.The_Fifth_Sacred_Thing) | 1994 | 596 | | Prodigy | Marie Lu | [4.24](https://www.goodreads.com/book/show/13414446-prodigy?ac=1&from_search=true&qid=BL85jNXP8P&rank=1) | 2013 597 | | Hyperion | Dan Simmons | [4.21](https://www.goodreads.com/book/show/77566.Hyperion) | 1989 | 598 | | Cosmicomics | Italo Calvino | [4.2](https://www.goodreads.com/book/show/59780.Cosmicomics) | 1965 | 599 | | The Diamond Age | Neal Stephenson | [4.19](http://www.goodreads.com/book/show/827.The_Diamond_Age) | 2000 | 600 | | Dune Chronicles | Frank Herbert | [4.19](https://www.goodreads.com/search?q=dune) | 2006 | 601 | | Roadside Picnic | Arkady Strugatsky, Boris Strugatsky | [4.16](https://www.goodreads.com/book/show/331256.Roadside_Picnic) | 1972 | 602 | | The Forever War | Joe Haldemann | [4.15](https://www.goodreads.com/book/show/21611.The_Forever_War) | 1974 603 | | Contact | Carl Sagan | [4.14](https://www.goodreads.com/book/show/61666.Contact) | 1985 | 604 | | Foundation | Isaac Asimov | [4.13](https://www.goodreads.com/book/show/29579.Foundation) | 2004 | 605 | | Snow Crash | Neal Stephenson | [4.02](https://www.goodreads.com/book/show/830.Snow_Crash) | 2000 | 606 | | Brave New World | Aldous Huxley | [3.99](https://www.goodreads.com/book/show/5129.Brave_New_World) | 1932 | 607 | | Fahrenheit 451 | Ray Bradbury | [3.97](https://www.goodreads.com/book/show/17470674-fahrenheit-451) | 2006 | 608 | | Little Brother | Cory Doctorow | [3.94](https://www.goodreads.com/book/show/954674.Little_Brother) | 2008 | 609 | | The Time Machine | H.G Wells | [3.89](https://www.goodreads.com/book/show/2493.The_Time_Machine?from_search=true&from_srp=true&qid=UOQqEw4cz3&rank=1) | 1895 | 610 | 611 | 612 | 613 | ### Horror 614 | | Name | Author | Goodreads Rating | Year Published | 615 | |------|--------|------------------|----------------| 616 | | It | Stephen King | [4.24](https://www.goodreads.com/book/show/830502.It) | 1986 | 617 | | House of Leaves | Mark Z. Danielewski | [4.13](http://www.goodreads.com/book/show/24800.House_of_Leaves) | 2000 | 618 | | If it bleeds | Stephen King | [4.10](https://www.goodreads.com/book/show/46015758-if-it-bleeds) | 2020 | 619 | | Rosemary's Baby | Ira Levin | [4.00](https://www.goodreads.com/book/show/228296.Rosemary_s_Baby) | 1967 | 620 | | Dracula | Bram Stoker | [3.98](http://www.goodreads.com/book/show/17245.Dracula) | 1986 | 621 | | London (Surviving The Evacuation #1) | Frank Tayell | [3.86](https://www.goodreads.com/book/show/18655852-london) | 2013 | 622 | | Frankenstein | Mary Shelley, Maurice Hindle | [3.75](http://www.goodreads.com/book/show/18490.Frankenstein) | 2003 | 623 | 624 | 625 | 626 | ### Miscellaneous 627 | | Name | Author | Goodreads Rating | Year Published | 628 | |------|--------|------------------|----------------| 629 | | The Queen's Gambit | Walter Tevis | [4.11](https://www.goodreads.com/book/show/62022.The_Queen_s_Gambit) | | 630 | | The Bone People | Keri Hulme | [4.06](https://www.goodreads.com/book/show/460635.The_Bone_People) | 1986 | 631 | | Cat's Eye | Margaret Atwood | [3.92](https://www.goodreads.com/book/show/51019.Cat_s_Eye) | 1998 | 632 | | Xeelee Sequence | Stephen Baxter | [3.69](http://www.goodreads.com/series/49784-xeelee-sequence) | 1992 | 633 | | Ghost Fleet | P.W. Singer and August Cole | [3.62](https://www.goodreads.com/book/show/22749719-ghost-fleet?from_search=true) | 2015 | 634 | | Future Crimes | Marc Goodman | [3.42](https://www.goodreads.com/book/show/22318398-future-crimes?from_search=true) | 1990 | 635 | 636 | 637 | 638 | ## Health 639 | | Name | Author | Goodreads Rating | Year Published | 640 | |------|--------|------------------|----------------| 641 | | How Not to Die: Discover the Foods Scientifically Proven to Prevent and Reverse Disease | Michael Greger, M.D. | [4.54](https://www.goodreads.com/book/show/25663961-how-not-to-die) | 2015 | 642 | | Overcoming Gravity: A Systematic Approach to Gymnastics and Bodyweight Strength (2nd edition) | Steven Low | [4.3](https://www.goodreads.com/book/show/33293328-overcoming-gravity) | 2016 | 643 | | Breath: The New Science of a Lost Art | James Nestor | [4.15](https://www.goodreads.com/book/show/48890486-breath) | 2020 | 644 | | Convict Conditioning | Paul Wade | [4.13](http://www.goodreads.com/book/show/7305111-convict-conditioning) | 2012 | 645 | | Eat and Run: My Unlikely Journey to Ultramarathon Greatness | Scott Jurek, Steve Friedman | [3.95](https://www.goodreads.com/book/show/13202092-eat-and-run) | 2012 | 646 | | Brain Food: The Surprising Science of Eating for Cognitive Power | Lisa Mosconi | [3.92](https://www.goodreads.com/book/show/35457267-brain-food) | 2018 | 647 | | Super Human: The Bulletproof Plan to Age Backward and Maybe Even Live Forever | Dave Asprey | [3.86](https://www.goodreads.com/book/show/43801612-super-human?ref=nav_sb_ss_3_11) | 2019 | 648 | | 8 Weeks to Optimum Health | Andrew Weil | [3.86](https://www.goodreads.com/book/show/37124.8_Weeks_to_Optimum_Health) | | 649 | | Grain Brain: The Surprising Truth about Wheat, Carbs, and Sugar--Your Brain's Silent Killers | David Perlmutter | [3.89](https://www.goodreads.com/book/show/17333302-grain-brain) | 2013 | 650 | 651 | 652 | 653 | ## Design 654 | | Name | Author | Goodreads Rating | Year Published | 655 | |------|--------|------------------|----------------| 656 | | Pattern Language: Towns, Buildings, Construction | Christopher Alexander, Sara Ishikawa, Murray Silverstein, Max Jacobson, Ingrid Fiksdahl-King and Shlomo Angel | [4.38](https://www.goodreads.com/book/show/79766.A_Pattern_Language) | 1977 | 657 | | Data visualization handbook | Juuso Koponen, Jonatan Hildén | [4.33](https://www.goodreads.com/book/show/52326089-data-visualization-handbook) | 2019 | 658 | | How Buildings Learn: What Happens After They're Built | Stewart Brand | [4.32](https://www.goodreads.com/book/show/38310.How_Buildings_Learn) | 1995 | 659 | | Don't Make Me Think, Revisited: A Common Sense Approach to Web Usability | Steve Krug | [4.24](https://www.goodreads.com/book/show/18197267-don-t-make-me-think-revisited) | 2014 | 660 | | The Design of Everyday Things | Donald Norman | [4.18](http://www.goodreads.com/book/show/840.The_Design_of_Everyday_Things) | 2002 | 661 | | Mismatch: How Inclusion Shapes Design | Kat Holmes, John Maeda | [4.14](https://www.goodreads.com/book/show/39644200-mismatch) | 2018 | 662 | | The Art of Looking Sideways | Alan Fletcher | [4.10](https://www.goodreads.com/book/show/15778.The_Art_of_Looking_Sideways) | 2001 | 663 | | Change by Design: How Design Thinking Transforms Organizations and Inspires Innovation | Tim Brown | [3.88](https://www.goodreads.com/book/show/6671664-change-by-design) | 2009 | 664 | 665 | 666 | 667 | ## Travel 668 | | Name | Author | Goodreads Rating | Year Published | 669 | |------|--------|------------------|----------------| 670 | | Atlas Obscura: An Explorer's Guide to the World's Hidden Wonders | Joshua Foer | [4.24](https://www.goodreads.com/book/show/28110891-atlas-obscura) | 2016 | 671 | 672 | 673 | 674 | ## Language 675 | | Name | Author | Goodreads Rating | Year Published | 676 | |------|--------|------------------|----------------| 677 | | Le Ton beau de Marot: In Praise of the Music of Language | Douglas R. Hofstadter | [4.22](https://www.goodreads.com/book/show/248193.Le_Ton_beau_de_Marot) | 1997 | 678 | | The Language Instinct: How the Mind Creates Language | Steven Pinker | [4.02](https://www.goodreads.com/book/show/5755.The_Language_Instinct) | 2000 | 679 | 680 | 681 | 682 | ## Nature 683 | | Name | Author | Goodreads Rating | Year Published | 684 | |------|--------|------------------|----------------| 685 | | The Wild Places | Robert Macfarlane | [4.27](https://www.goodreads.com/book/show/2688775-the-wild-places) | 2007 | 686 | | The Sixth Extinction: An Unnatural History | Elizabeth Kolbert | [4.13](https://www.goodreads.com/book/show/17910054-the-sixth-extinction) | 2014 | 687 | | Pilgrim at Tinker Creek | Annie Dillard | [4.11](https://www.goodreads.com/book/show/12527.Pilgrim_at_Tinker_Creek) | 1974 | 688 | | A Walk in the Woods: Rediscovering America on the Appalachian Trai | Bill Bryson | [4.06](https://www.goodreads.com/book/show/9791.A_Walk_in_the_Woods) | 2006 | 689 | | The Uninhabitable Earth: Life After Warming | David Wallace-Wells | [4.06](https://www.goodreads.com/book/show/41552709-the-uninhabitable-earth) | 2019 | 690 | 691 | 692 | 693 | ## Art 694 | | Name | Author | Goodreads Rating | Year Published | 695 | |------|--------|------------------|----------------| 696 | | The New Drawing on the Right Side of the Brain | Betty Edwards | [3.86](https://www.goodreads.com/book/show/627206.The_New_Drawing_on_the_Right_Side_of_the_Brain) | 1989 | 697 | | Steal Like an Artist: 10 Things Nobody Told You About Being Creative | Austin Kleon | [3.92](https://www.goodreads.com/book/show/13099738-steal-like-an-artist) | 2012 | 698 | | Show Your Work!: 10 Ways to Share Your Creativity and Get Discovered | Austin Kleon | [4.10](https://www.goodreads.com/book/show/18290401-show-your-work) | 2014 | 699 | 700 | 701 | 702 | # Credits 703 | * [@hackerkid](https://github.com/hackerkid) for starting the list. 704 | * [@geritol](https://github.com/geritol) for building the framework for maintaining the list. 705 | * All the [contributors](https://github.com/hackerkid/Mind-Expanding-Books/graphs/contributors) for keeping the list updated by adding new books. 706 | 707 | # License 708 | [![CC0](http://i.creativecommons.org/p/zero/1.0/88x31.png)](http://creativecommons.org/publicdomain/zero/1.0/) 709 | 710 | To the extent possible under law, [Vishnu Ks](https://github.com/hackerkid) has waived all copyright and related or neighboring rights to this work. 711 | -------------------------------------------------------------------------------- /app/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2020: true, 5 | }, 6 | extends: [ 7 | 'plugin:react/recommended', 8 | 'airbnb', 9 | ], 10 | parserOptions: { 11 | ecmaFeatures: { 12 | jsx: true, 13 | }, 14 | ecmaVersion: 11, 15 | sourceType: 'module', 16 | }, 17 | plugins: [ 18 | 'react', 19 | ], 20 | rules: { 21 | }, 22 | }; 23 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # dotenv environment variables file 55 | .env 56 | 57 | # gatsby files 58 | .cache/ 59 | public 60 | 61 | # Mac files 62 | .DS_Store 63 | 64 | # Yarn 65 | yarn-error.log 66 | .pnp/ 67 | .pnp.js 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # ignore package-lock as it complicates merging 72 | package-lock.json -------------------------------------------------------------------------------- /app/.prettierignore: -------------------------------------------------------------------------------- 1 | .cache 2 | package.json 3 | package-lock.json 4 | public 5 | -------------------------------------------------------------------------------- /app/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "lf", 3 | "semi": false, 4 | "singleQuote": false, 5 | "tabWidth": 2, 6 | "trailingComma": "es5" 7 | } 8 | -------------------------------------------------------------------------------- /app/.prettierrc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /app/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 gatsbyjs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /app/README.md: -------------------------------------------------------------------------------- 1 | `app/` directory contains the source code of the Mind Expanding Books [website](https://books.vishnuks.com) 2 | 3 | ## How to setup development environment 4 | 5 | #### Verify Node Install 6 | 7 | ``` 8 | node -v 9 | npm -v 10 | ``` 11 | 12 | #### Install Gatsby CLI 13 | 14 | ``` 15 | npm install -g gatsby-cli 16 | ``` 17 | 18 | ```bash 19 | 20 | git clone https://github.com/hackerkid/Mind-Expanding-Books 21 | cd app/ 22 | npm install 23 | gatsby develop 24 | ``` 25 | 26 | Once this is done, the development server should be accessible at http://localhost:8000 27 | 28 | ## High level overview of the website 29 | 30 | - The website is made using Gatsby, which is a React based static site generator. 31 | - The website is deployed in Netlify automatically whenever a commit is pushed to GitHub. 32 | - When you create a pull request with changes to the source code, Netlify will automatically 33 | create a website for previewing the changes. You can click on "Details" in the "Deploy preview ready!" 34 | message in the pull request page for seeing the website. 35 | 36 | ## From where does the website fetches the data of the books? 37 | 38 | Website fetches the data of the books from `app/src/data/books.json` file. See [README in utils directory](../utils/README.MD) 39 | for details on how this file is generated. 40 | -------------------------------------------------------------------------------- /app/gatsby-browser.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's Browser APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/browser-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it 8 | import React from "react" 9 | 10 | import GlobalState from "./src/context/globalState" 11 | 12 | export const wrapRootElement = ({ element }) => ( 13 | {element} 14 | ) 15 | -------------------------------------------------------------------------------- /app/gatsby-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | siteMetadata: { 3 | title: `Mind Expanding Books`, 4 | description: `Kick off your next, great Gatsby project with this default starter. This barebones starter ships with the main Gatsby configuration files you might need.`, 5 | author: `@gatsbyjs`, 6 | }, 7 | plugins: [ 8 | `gatsby-plugin-react-helmet`, 9 | { 10 | resolve: `gatsby-source-filesystem`, 11 | options: { 12 | name: `images`, 13 | path: `${__dirname}/src/images`, 14 | }, 15 | }, 16 | `gatsby-transformer-sharp`, 17 | `gatsby-plugin-sharp`, 18 | { 19 | resolve: `gatsby-plugin-manifest`, 20 | options: { 21 | name: `gatsby-starter-default`, 22 | short_name: `starter`, 23 | start_url: `/`, 24 | background_color: `#663399`, 25 | theme_color: `#663399`, 26 | display: `minimal-ui`, 27 | icon: `src/images/gatsby-icon.png`, // This path is relative to the root of the site. 28 | }, 29 | }, 30 | `gatsby-plugin-offline`, 31 | `gatsby-transformer-json`, 32 | { 33 | resolve: `gatsby-source-filesystem`, 34 | options: { 35 | path: `./src/data/`, 36 | }, 37 | }, 38 | `gatsby-plugin-postcss`, 39 | { 40 | resolve: `gatsby-plugin-google-analytics`, 41 | options: { 42 | trackingId: "UA-139957969-2", 43 | } 44 | } 45 | ], 46 | } 47 | -------------------------------------------------------------------------------- /app/gatsby-node.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | const categories = JSON.parse(fs.readFileSync('src/data/categories.json')); 4 | const slugify = require('slugify'); 5 | 6 | exports.createPages = async function ({ actions, graphql }) { 7 | const { createPage } = actions; 8 | await Promise.all( 9 | categories.map(async (category) => { 10 | const data = await graphql( 11 | ` 12 | query categoryBooksQuery($categoryName: String) { 13 | allBooksJson( 14 | filter: { category: { eq: $categoryName } } 15 | sort: { fields: [rating], order: DESC } 16 | ) { 17 | edges { 18 | node { 19 | id 20 | title 21 | url 22 | rating 23 | author 24 | year 25 | category 26 | image_url 27 | description 28 | amazon_url 29 | } 30 | } 31 | } 32 | } 33 | `, 34 | { categoryName: category.name }, 35 | ); 36 | console.log(category.name, data.data); 37 | createPage({ 38 | path: slugify(category.name), 39 | component: require.resolve('./src/templates/categoryTemplate.js'), 40 | context: { 41 | categoryName: category.name, 42 | data: data.data, 43 | image: category.emoji, 44 | limit: null, 45 | }, 46 | }); 47 | }), 48 | ); 49 | }; 50 | -------------------------------------------------------------------------------- /app/gatsby-ssr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's SSR (Server Side Rendering) APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/ssr-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it 8 | import React from "react" 9 | 10 | import GlobalState from "./src/context/globalState" 11 | 12 | export const wrapRootElement = ({ element }) => ( 13 | {element} 14 | ) 15 | -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gatsby-starter-default", 3 | "private": true, 4 | "description": "A simple starter to get up and developing quickly with Gatsby", 5 | "version": "0.1.0", 6 | "author": "Kyle Mathews ", 7 | "dependencies": { 8 | "bootstrap": "^4.5.2", 9 | "gatsby": "^2.24.91", 10 | "gatsby-image": "^2.2.27", 11 | "gatsby-plugin-google-analytics": "^2.3.14", 12 | "gatsby-plugin-manifest": "^2.4.37", 13 | "gatsby-plugin-offline": "^3.0.14", 14 | "gatsby-plugin-postcss": "^2.1.11", 15 | "gatsby-plugin-react-helmet": "^3.1.11", 16 | "gatsby-plugin-sharp": "^2.6.43", 17 | "gatsby-source-filesystem": "^2.1.31", 18 | "gatsby-transformer-json": "^2.2.13", 19 | "gatsby-transformer-sharp": "^2.2.21", 20 | "prop-types": "^15.7.2", 21 | "react": "^16.10.2", 22 | "react-bootstrap": "^1.3.0", 23 | "react-dom": "^16.10.2", 24 | "react-helmet": "^5.2.1", 25 | "react-star-rating-component": "^1.4.1", 26 | "react-star-ratings": "^2.3.0", 27 | "slugify": "^1.4.5" 28 | }, 29 | "devDependencies": { 30 | "eslint": "^7.7.0", 31 | "eslint-config-airbnb": "^18.2.0", 32 | "eslint-plugin-import": "^2.22.0", 33 | "eslint-plugin-jsx-a11y": "^6.3.1", 34 | "eslint-plugin-react": "^7.20.6", 35 | "eslint-plugin-react-hooks": "^4.1.0", 36 | "husky": "^4.3.0", 37 | "lint-staged": ">=10", 38 | "prettier": "1.19.1", 39 | "tailwindcss": "^1.1.2" 40 | }, 41 | "keywords": [ 42 | "gatsby" 43 | ], 44 | "license": "MIT", 45 | "scripts": { 46 | "build": "gatsby build", 47 | "develop": "gatsby develop", 48 | "format": "prettier --write \"**/*.{js,jsx,json,md}\"", 49 | "start": "npm run develop", 50 | "serve": "gatsby serve", 51 | "test": "echo \"Write tests! -> https://gatsby.dev/unit-testing \"" 52 | }, 53 | "repository": { 54 | "type": "git", 55 | "url": "https://github.com/gatsbyjs/gatsby-starter-default" 56 | }, 57 | "bugs": { 58 | "url": "https://github.com/gatsbyjs/gatsby/issues" 59 | }, 60 | "husky": { 61 | "hooks": { 62 | "pre-commit": "lint-staged" 63 | } 64 | }, 65 | "lint-staged": { 66 | "*.{js,jsx,json,md}": "prettier --write", 67 | "*.js": "eslint --cache --fix" 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = () => ({ 2 | plugins: [require("tailwindcss")], 3 | }) 4 | -------------------------------------------------------------------------------- /app/src/components/amazonurl.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { OutboundLink } from "gatsby-plugin-google-analytics" 3 | 4 | const getTargetURL = (book) => { 5 | return book.amazon_url + "?tag=vishnuks-20"; 6 | } 7 | 8 | export default ({ book }) => { 9 | return ( 10 | 11 | Amazon link 12 | 13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /app/src/components/bookcard.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import React, { useState } from 'react'; 3 | import StarRatings from 'react-star-ratings'; 4 | import { Card, Row, Col } from 'react-bootstrap'; 5 | 6 | import AmazonURL from '../components/amazonurl'; 7 | import Bookmark from '../components/bookmark'; 8 | import GoodReadsImage from '../components/goodreadsimage'; 9 | 10 | const truncateContent = (content) => { 11 | if (!content) { 12 | return ''; 13 | } 14 | return content.length > 350 ? content.substring(0, 350) + '...' : content; 15 | }; 16 | 17 | const showFullText = (content) => { 18 | if (!content) { 19 | return ''; 20 | } 21 | return content; 22 | }; 23 | 24 | const BookCard = ({ book }) => { 25 | const [ show, toggleShow ] = useState(false); 26 | return ( 27 | 28 | 29 | 30 | 39 | 40 | 41 | 42 | {book.title} 43 | 44 | 45 | {book.author} {book.year ? book.year : null} 46 | 47 | 54 |
55 |
56 | {book.amazon_url ? : null} 57 |
58 |
59 | 60 | 61 | 62 |
63 | 64 |
65 |
66 |

67 | {!show && truncateContent(book.description)} 68 | {show && showFullText(book.description)} 69 |

70 | {!show && book.description.length>350 &&( 71 | 74 | )} 75 | {show && ( 76 | 79 | )} 80 |
81 | 82 |
83 |
84 | ); 85 | }; 86 | 87 | BookCard.propTypes = { 88 | siteTitle: PropTypes.object 89 | }; 90 | 91 | BookCard.defaultProps = { 92 | book: {} 93 | }; 94 | 95 | export default BookCard; 96 | -------------------------------------------------------------------------------- /app/src/components/bookmark.js: -------------------------------------------------------------------------------- 1 | import React, { useContext } from 'react' 2 | import { Button } from "react-bootstrap" 3 | import { BookmarkContext } from '../context/globalState' 4 | 5 | export default ({ book }) => { 6 | const { updateReadingList, readingList } = useContext(BookmarkContext) 7 | const readingListIds = readingList.bookIds 8 | 9 | return ( 10 |
updateReadingList({ type: 'bookmark', retrievedBook: book })}> 11 | 24 |
25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /app/src/components/categorydescription.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | 4 | export default ({categoryName, categoryImage}) => { 5 | return ( 6 |
7 |

8 | {categoryImage} {categoryName} 9 |

10 |
11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /app/src/components/feed.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import '../styles/sidebar.css'; 3 | import BookCard from './bookcard'; 4 | import SortByDropdown, { FIELDS_TO_SORT_BY, compareFunctions } from './sortByDropdown'; 5 | 6 | export default ({ data, limit }) => { 7 | const [sortBy, setSortBy] = React.useState(FIELDS_TO_SORT_BY[0]); 8 | 9 | const sortedBooks = React.useMemo(() => [...data.allBooksJson.edges] 10 | .sort(compareFunctions[sortBy.value]), 11 | [sortBy]); 12 | 13 | return ( 14 | <> 15 | 16 | {sortedBooks.map((x, index) => { 17 | const book = x.node; 18 | if (!limit || index < limit) { 19 | if (!book.description || book.description.length < 10) { 20 | return null; 21 | } 22 | return ; 23 | } 24 | return null; 25 | })} 26 | 27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /app/src/components/goodreadsimage.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { useStaticQuery, graphql } from "gatsby" 3 | import Img from "gatsby-image" 4 | 5 | /* 6 | * This component is built using `gatsby-image` to automatically serve optimized 7 | * images with lazy loading and reduced file sizes. The image is loaded using a 8 | * `useStaticQuery`, which allows us to load the image from directly within this 9 | * component, rather than having to pass the image data down from pages. 10 | * 11 | * For more information, see the docs: 12 | * - `gatsby-image`: https://gatsby.dev/gatsby-image 13 | * - `useStaticQuery`: https://www.gatsbyjs.org/docs/use-static-query/ 14 | */ 15 | 16 | const Image = () => { 17 | const data = useStaticQuery(graphql` 18 | query { 19 | placeholderImage: file(relativePath: { eq: "goodreads.png" }) { 20 | childImageSharp { 21 | fluid(maxWidth: 30) { 22 | ...GatsbyImageSharpFluid 23 | } 24 | } 25 | } 26 | } 27 | `) 28 | 29 | return 30 | } 31 | 32 | export default Image 33 | -------------------------------------------------------------------------------- /app/src/components/header.js: -------------------------------------------------------------------------------- 1 | import { Link } from "gatsby" 2 | import PropTypes from "prop-types" 3 | import React from "react" 4 | 5 | const Header = ({ siteTitle }) => ( 6 |
7 |

8 | 14 | {siteTitle} 15 | 16 |

17 |
18 | ) 19 | 20 | Header.propTypes = { 21 | siteTitle: PropTypes.string, 22 | } 23 | 24 | Header.defaultProps = { 25 | siteTitle: ``, 26 | } 27 | 28 | export default Header 29 | -------------------------------------------------------------------------------- /app/src/components/image.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { useStaticQuery, graphql } from "gatsby" 3 | import Img from "gatsby-image" 4 | 5 | /* 6 | * This component is built using `gatsby-image` to automatically serve optimized 7 | * images with lazy loading and reduced file sizes. The image is loaded using a 8 | * `useStaticQuery`, which allows us to load the image from directly within this 9 | * component, rather than having to pass the image data down from pages. 10 | * 11 | * For more information, see the docs: 12 | * - `gatsby-image`: https://gatsby.dev/gatsby-image 13 | * - `useStaticQuery`: https://www.gatsbyjs.org/docs/use-static-query/ 14 | */ 15 | 16 | const Image = () => { 17 | const data = useStaticQuery(graphql` 18 | query { 19 | placeholderImage: file(relativePath: { eq: "gatsby-astronaut.png" }) { 20 | childImageSharp { 21 | fluid(maxWidth: 300) { 22 | ...GatsbyImageSharpFluid 23 | } 24 | } 25 | } 26 | } 27 | `) 28 | 29 | return 30 | } 31 | 32 | export default Image 33 | -------------------------------------------------------------------------------- /app/src/components/layout.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-family: sans-serif; 3 | -ms-text-size-adjust: 100%; 4 | -webkit-text-size-adjust: 100%; 5 | } 6 | body { 7 | margin: 0; 8 | -webkit-font-smoothing: antialiased; 9 | -moz-osx-font-smoothing: grayscale; 10 | } 11 | article, 12 | aside, 13 | details, 14 | figcaption, 15 | figure, 16 | footer, 17 | header, 18 | main, 19 | menu, 20 | nav, 21 | section, 22 | summary { 23 | display: block; 24 | } 25 | audio, 26 | canvas, 27 | progress, 28 | video { 29 | display: inline-block; 30 | } 31 | audio:not([controls]) { 32 | display: none; 33 | height: 0; 34 | } 35 | progress { 36 | vertical-align: baseline; 37 | } 38 | [hidden], 39 | template { 40 | display: none; 41 | } 42 | a { 43 | background-color: transparent; 44 | -webkit-text-decoration-skip: objects; 45 | } 46 | a:active, 47 | a:hover { 48 | outline-width: 0; 49 | } 50 | abbr[title] { 51 | border-bottom: none; 52 | text-decoration: underline; 53 | text-decoration: underline dotted; 54 | } 55 | b, 56 | strong { 57 | font-weight: inherit; 58 | font-weight: bolder; 59 | } 60 | dfn { 61 | font-style: italic; 62 | } 63 | h1 { 64 | font-size: 2em; 65 | margin: 0.67em 0; 66 | } 67 | mark { 68 | background-color: #ff0; 69 | color: #000; 70 | } 71 | small { 72 | font-size: 80%; 73 | } 74 | sub, 75 | sup { 76 | font-size: 75%; 77 | line-height: 0; 78 | position: relative; 79 | vertical-align: baseline; 80 | } 81 | sub { 82 | bottom: -0.25em; 83 | } 84 | sup { 85 | top: -0.5em; 86 | } 87 | img { 88 | border-style: none; 89 | } 90 | svg:not(:root) { 91 | overflow: hidden; 92 | } 93 | code, 94 | kbd, 95 | pre, 96 | samp { 97 | font-family: monospace, monospace; 98 | font-size: 1em; 99 | } 100 | figure { 101 | margin: 1em 40px; 102 | } 103 | hr { 104 | box-sizing: content-box; 105 | height: 0; 106 | overflow: visible; 107 | } 108 | button, 109 | input, 110 | optgroup, 111 | select, 112 | textarea { 113 | font: inherit; 114 | margin: 0; 115 | } 116 | optgroup { 117 | font-weight: 700; 118 | } 119 | button, 120 | input { 121 | overflow: visible; 122 | } 123 | button, 124 | select { 125 | text-transform: none; 126 | } 127 | [type="reset"], 128 | [type="submit"], 129 | button, 130 | html [type="button"] { 131 | -webkit-appearance: button; 132 | } 133 | [type="button"]::-moz-focus-inner, 134 | [type="reset"]::-moz-focus-inner, 135 | [type="submit"]::-moz-focus-inner, 136 | button::-moz-focus-inner { 137 | border-style: none; 138 | padding: 0; 139 | } 140 | [type="button"]:-moz-focusring, 141 | [type="reset"]:-moz-focusring, 142 | [type="submit"]:-moz-focusring, 143 | button:-moz-focusring { 144 | outline: 1px dotted ButtonText; 145 | } 146 | fieldset { 147 | border: 1px solid silver; 148 | margin: 0 2px; 149 | padding: 0.35em 0.625em 0.75em; 150 | } 151 | legend { 152 | box-sizing: border-box; 153 | color: inherit; 154 | display: table; 155 | max-width: 100%; 156 | padding: 0; 157 | white-space: normal; 158 | } 159 | textarea { 160 | overflow: auto; 161 | } 162 | [type="checkbox"], 163 | [type="radio"] { 164 | box-sizing: border-box; 165 | padding: 0; 166 | } 167 | [type="number"]::-webkit-inner-spin-button, 168 | [type="number"]::-webkit-outer-spin-button { 169 | height: auto; 170 | } 171 | [type="search"] { 172 | -webkit-appearance: textfield; 173 | outline-offset: -2px; 174 | } 175 | [type="search"]::-webkit-search-cancel-button, 176 | [type="search"]::-webkit-search-decoration { 177 | -webkit-appearance: none; 178 | } 179 | ::-webkit-input-placeholder { 180 | color: inherit; 181 | opacity: 0.54; 182 | } 183 | ::-webkit-file-upload-button { 184 | -webkit-appearance: button; 185 | font: inherit; 186 | } 187 | html { 188 | font: 112.5%/1.45em georgia, serif; 189 | box-sizing: border-box; 190 | overflow-y: scroll; 191 | } 192 | * { 193 | box-sizing: inherit; 194 | } 195 | *:before { 196 | box-sizing: inherit; 197 | } 198 | *:after { 199 | box-sizing: inherit; 200 | } 201 | body { 202 | color: hsla(0, 0%, 0%, 0.8); 203 | font-family: georgia, serif; 204 | font-weight: normal; 205 | word-wrap: break-word; 206 | font-kerning: normal; 207 | -moz-font-feature-settings: "kern", "liga", "clig", "calt"; 208 | -ms-font-feature-settings: "kern", "liga", "clig", "calt"; 209 | -webkit-font-feature-settings: "kern", "liga", "clig", "calt"; 210 | font-feature-settings: "kern", "liga", "clig", "calt"; 211 | } 212 | img { 213 | max-width: 100%; 214 | margin-left: 0; 215 | margin-right: 0; 216 | margin-top: 0; 217 | padding-bottom: 0; 218 | padding-left: 0; 219 | padding-right: 0; 220 | padding-top: 0; 221 | margin-bottom: 1.45rem; 222 | } 223 | h1 { 224 | margin-left: 0; 225 | margin-right: 0; 226 | margin-top: 0; 227 | padding-bottom: 0; 228 | padding-left: 0; 229 | padding-right: 0; 230 | padding-top: 0; 231 | margin-bottom: 1.45rem; 232 | color: inherit; 233 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 234 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 235 | font-weight: bold; 236 | text-rendering: optimizeLegibility; 237 | font-size: 2.25rem; 238 | line-height: 1.1; 239 | } 240 | h2 { 241 | margin-left: 0; 242 | margin-right: 0; 243 | margin-top: 0; 244 | padding-bottom: 0; 245 | padding-left: 0; 246 | padding-right: 0; 247 | padding-top: 0; 248 | margin-bottom: 1.45rem; 249 | color: inherit; 250 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 251 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 252 | font-weight: bold; 253 | text-rendering: optimizeLegibility; 254 | font-size: 1.62671rem; 255 | line-height: 1.1; 256 | } 257 | h3 { 258 | margin-left: 0; 259 | margin-right: 0; 260 | margin-top: 0; 261 | padding-bottom: 0; 262 | padding-left: 0; 263 | padding-right: 0; 264 | padding-top: 0; 265 | margin-bottom: 1.45rem; 266 | color: inherit; 267 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 268 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 269 | font-weight: bold; 270 | text-rendering: optimizeLegibility; 271 | font-size: 1.38316rem; 272 | line-height: 1.1; 273 | } 274 | h4 { 275 | margin-left: 0; 276 | margin-right: 0; 277 | margin-top: 0; 278 | padding-bottom: 0; 279 | padding-left: 0; 280 | padding-right: 0; 281 | padding-top: 0; 282 | margin-bottom: 1.45rem; 283 | color: inherit; 284 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 285 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 286 | font-weight: bold; 287 | text-rendering: optimizeLegibility; 288 | font-size: 1rem; 289 | line-height: 1.1; 290 | } 291 | h5 { 292 | margin-left: 0; 293 | margin-right: 0; 294 | margin-top: 0; 295 | padding-bottom: 0; 296 | padding-left: 0; 297 | padding-right: 0; 298 | padding-top: 0; 299 | margin-bottom: 1.45rem; 300 | color: inherit; 301 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 302 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 303 | font-weight: bold; 304 | text-rendering: optimizeLegibility; 305 | font-size: 0.85028rem; 306 | line-height: 1.1; 307 | } 308 | h6 { 309 | margin-left: 0; 310 | margin-right: 0; 311 | margin-top: 0; 312 | padding-bottom: 0; 313 | padding-left: 0; 314 | padding-right: 0; 315 | padding-top: 0; 316 | margin-bottom: 1.45rem; 317 | color: inherit; 318 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 319 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 320 | font-weight: bold; 321 | text-rendering: optimizeLegibility; 322 | font-size: 0.78405rem; 323 | line-height: 1.1; 324 | } 325 | hgroup { 326 | margin-left: 0; 327 | margin-right: 0; 328 | margin-top: 0; 329 | padding-bottom: 0; 330 | padding-left: 0; 331 | padding-right: 0; 332 | padding-top: 0; 333 | margin-bottom: 1.45rem; 334 | } 335 | ul { 336 | margin-left: 1.45rem; 337 | margin-right: 0; 338 | margin-top: 0; 339 | padding-bottom: 0; 340 | padding-left: 0; 341 | padding-right: 0; 342 | padding-top: 0; 343 | margin-bottom: 1.45rem; 344 | list-style-position: outside; 345 | list-style-image: none; 346 | } 347 | ol { 348 | margin-left: 1.45rem; 349 | margin-right: 0; 350 | margin-top: 0; 351 | padding-bottom: 0; 352 | padding-left: 0; 353 | padding-right: 0; 354 | padding-top: 0; 355 | margin-bottom: 1.45rem; 356 | list-style-position: outside; 357 | list-style-image: none; 358 | } 359 | dl { 360 | margin-left: 0; 361 | margin-right: 0; 362 | margin-top: 0; 363 | padding-bottom: 0; 364 | padding-left: 0; 365 | padding-right: 0; 366 | padding-top: 0; 367 | margin-bottom: 1.45rem; 368 | } 369 | dd { 370 | margin-left: 0; 371 | margin-right: 0; 372 | margin-top: 0; 373 | padding-bottom: 0; 374 | padding-left: 0; 375 | padding-right: 0; 376 | padding-top: 0; 377 | margin-bottom: 1.45rem; 378 | } 379 | p { 380 | margin-left: 0; 381 | margin-right: 0; 382 | margin-top: 0; 383 | padding-bottom: 0; 384 | padding-left: 0; 385 | padding-right: 0; 386 | padding-top: 0; 387 | margin-bottom: 1.45rem; 388 | } 389 | figure { 390 | margin-left: 0; 391 | margin-right: 0; 392 | margin-top: 0; 393 | padding-bottom: 0; 394 | padding-left: 0; 395 | padding-right: 0; 396 | padding-top: 0; 397 | margin-bottom: 1.45rem; 398 | } 399 | pre { 400 | margin-left: 0; 401 | margin-right: 0; 402 | margin-top: 0; 403 | margin-bottom: 1.45rem; 404 | font-size: 0.85rem; 405 | line-height: 1.42; 406 | background: hsla(0, 0%, 0%, 0.04); 407 | border-radius: 3px; 408 | overflow: auto; 409 | word-wrap: normal; 410 | padding: 1.45rem; 411 | } 412 | table { 413 | margin-left: 0; 414 | margin-right: 0; 415 | margin-top: 0; 416 | padding-bottom: 0; 417 | padding-left: 0; 418 | padding-right: 0; 419 | padding-top: 0; 420 | margin-bottom: 1.45rem; 421 | font-size: 1rem; 422 | line-height: 1.45rem; 423 | border-collapse: collapse; 424 | width: 100%; 425 | } 426 | fieldset { 427 | margin-left: 0; 428 | margin-right: 0; 429 | margin-top: 0; 430 | padding-bottom: 0; 431 | padding-left: 0; 432 | padding-right: 0; 433 | padding-top: 0; 434 | margin-bottom: 1.45rem; 435 | } 436 | blockquote { 437 | margin-left: 1.45rem; 438 | margin-right: 1.45rem; 439 | margin-top: 0; 440 | padding-bottom: 0; 441 | padding-left: 0; 442 | padding-right: 0; 443 | padding-top: 0; 444 | margin-bottom: 1.45rem; 445 | } 446 | form { 447 | margin-left: 0; 448 | margin-right: 0; 449 | margin-top: 0; 450 | padding-bottom: 0; 451 | padding-left: 0; 452 | padding-right: 0; 453 | padding-top: 0; 454 | margin-bottom: 1.45rem; 455 | } 456 | noscript { 457 | margin-left: 0; 458 | margin-right: 0; 459 | margin-top: 0; 460 | padding-bottom: 0; 461 | padding-left: 0; 462 | padding-right: 0; 463 | padding-top: 0; 464 | margin-bottom: 1.45rem; 465 | } 466 | iframe { 467 | margin-left: 0; 468 | margin-right: 0; 469 | margin-top: 0; 470 | padding-bottom: 0; 471 | padding-left: 0; 472 | padding-right: 0; 473 | padding-top: 0; 474 | margin-bottom: 1.45rem; 475 | } 476 | hr { 477 | margin-left: 0; 478 | margin-right: 0; 479 | margin-top: 0; 480 | padding-bottom: 0; 481 | padding-left: 0; 482 | padding-right: 0; 483 | padding-top: 0; 484 | margin-bottom: calc(1.45rem - 1px); 485 | background: hsla(0, 0%, 0%, 0.2); 486 | border: none; 487 | height: 1px; 488 | } 489 | address { 490 | margin-left: 0; 491 | margin-right: 0; 492 | margin-top: 0; 493 | padding-bottom: 0; 494 | padding-left: 0; 495 | padding-right: 0; 496 | padding-top: 0; 497 | margin-bottom: 1.45rem; 498 | } 499 | b { 500 | font-weight: bold; 501 | } 502 | strong { 503 | font-weight: bold; 504 | } 505 | dt { 506 | font-weight: bold; 507 | } 508 | th { 509 | font-weight: bold; 510 | } 511 | li { 512 | margin-bottom: calc(1.45rem / 2); 513 | } 514 | ol li { 515 | padding-left: 0; 516 | } 517 | ul li { 518 | padding-left: 0; 519 | } 520 | li > ol { 521 | margin-left: 1.45rem; 522 | margin-bottom: calc(1.45rem / 2); 523 | margin-top: calc(1.45rem / 2); 524 | } 525 | li > ul { 526 | margin-left: 1.45rem; 527 | margin-bottom: calc(1.45rem / 2); 528 | margin-top: calc(1.45rem / 2); 529 | } 530 | blockquote *:last-child { 531 | margin-bottom: 0; 532 | } 533 | li *:last-child { 534 | margin-bottom: 0; 535 | } 536 | p *:last-child { 537 | margin-bottom: 0; 538 | } 539 | li > p { 540 | margin-bottom: calc(1.45rem / 2); 541 | } 542 | code { 543 | font-size: 0.85rem; 544 | line-height: 1.45rem; 545 | } 546 | kbd { 547 | font-size: 0.85rem; 548 | line-height: 1.45rem; 549 | } 550 | samp { 551 | font-size: 0.85rem; 552 | line-height: 1.45rem; 553 | } 554 | abbr { 555 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 556 | cursor: help; 557 | } 558 | acronym { 559 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 560 | cursor: help; 561 | } 562 | abbr[title] { 563 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 564 | cursor: help; 565 | text-decoration: none; 566 | } 567 | thead { 568 | text-align: left; 569 | } 570 | td, 571 | th { 572 | text-align: left; 573 | border-bottom: 1px solid hsla(0, 0%, 0%, 0.12); 574 | font-feature-settings: "tnum"; 575 | -moz-font-feature-settings: "tnum"; 576 | -ms-font-feature-settings: "tnum"; 577 | -webkit-font-feature-settings: "tnum"; 578 | padding-left: 0.96667rem; 579 | padding-right: 0.96667rem; 580 | padding-top: 0.725rem; 581 | padding-bottom: calc(0.725rem - 1px); 582 | } 583 | th:first-child, 584 | td:first-child { 585 | padding-left: 0; 586 | } 587 | th:last-child, 588 | td:last-child { 589 | padding-right: 0; 590 | } 591 | tt, 592 | code { 593 | background-color: hsla(0, 0%, 0%, 0.04); 594 | border-radius: 3px; 595 | font-family: "SFMono-Regular", Consolas, "Roboto Mono", "Droid Sans Mono", 596 | "Liberation Mono", Menlo, Courier, monospace; 597 | padding: 0; 598 | padding-top: 0.2em; 599 | padding-bottom: 0.2em; 600 | } 601 | pre code { 602 | background: none; 603 | line-height: 1.42; 604 | } 605 | code:before, 606 | code:after, 607 | tt:before, 608 | tt:after { 609 | letter-spacing: -0.2em; 610 | content: " "; 611 | } 612 | pre code:before, 613 | pre code:after, 614 | pre tt:before, 615 | pre tt:after { 616 | content: ""; 617 | } 618 | @media only screen and (max-width: 480px) { 619 | html { 620 | font-size: 100%; 621 | } 622 | } 623 | -------------------------------------------------------------------------------- /app/src/components/layout.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Layout component that queries for data 3 | * with Gatsby's useStaticQuery component 4 | * 5 | * See: https://www.gatsbyjs.org/docs/use-static-query/ 6 | */ 7 | 8 | import React from "react" 9 | import PropTypes from "prop-types" 10 | import { useStaticQuery, graphql } from "gatsby" 11 | 12 | import Header from "./header" 13 | import "./layout.css" 14 | import "bootstrap/dist/css/bootstrap.min.css" 15 | import { Container } from "react-bootstrap" 16 | 17 | const Layout = ({ children }) => { 18 | const data = useStaticQuery(graphql` 19 | query SiteTitleQuery { 20 | site { 21 | siteMetadata { 22 | title 23 | } 24 | } 25 | } 26 | `) 27 | 28 | return ( 29 | <> 30 |
31 | 32 |
{children}
33 |
34 | © {new Date().getFullYear()}, Built with 35 | {` `} 36 | Gatsby 37 |
38 |
39 | 40 | ) 41 | } 42 | 43 | Layout.propTypes = { 44 | children: PropTypes.node.isRequired, 45 | } 46 | 47 | export default Layout 48 | -------------------------------------------------------------------------------- /app/src/components/seo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SEO component that queries for data with 3 | * Gatsby's useStaticQuery React hook 4 | * 5 | * See: https://www.gatsbyjs.org/docs/use-static-query/ 6 | */ 7 | 8 | import React from "react" 9 | import PropTypes from "prop-types" 10 | import Helmet from "react-helmet" 11 | import { useStaticQuery, graphql } from "gatsby" 12 | 13 | function SEO({ description, lang, meta, title }) { 14 | const { site } = useStaticQuery( 15 | graphql` 16 | query { 17 | site { 18 | siteMetadata { 19 | title 20 | description 21 | author 22 | } 23 | } 24 | } 25 | ` 26 | ) 27 | 28 | const metaDescription = description || site.siteMetadata.description 29 | 30 | return ( 31 | 72 | ) 73 | } 74 | 75 | SEO.defaultProps = { 76 | lang: `en`, 77 | meta: [], 78 | description: ``, 79 | } 80 | 81 | SEO.propTypes = { 82 | description: PropTypes.string, 83 | lang: PropTypes.string, 84 | meta: PropTypes.arrayOf(PropTypes.object), 85 | title: PropTypes.string.isRequired, 86 | } 87 | 88 | export default SEO 89 | -------------------------------------------------------------------------------- /app/src/components/sidebar.js: -------------------------------------------------------------------------------- 1 | import React, { useContext } from "react" 2 | import { Navbar, Nav } from "react-bootstrap" 3 | import { StaticQuery, graphql, Link } from "gatsby" 4 | import "../styles/sidebar.css" 5 | import { BookmarkContext } from '../context/globalState' 6 | var slugify = require('slugify') 7 | 8 | export default () => { 9 | const { readingList } = useContext(BookmarkContext) 10 | 11 | return ( 12 | ( 27 | 28 | 29 | 30 |
31 |
32 | 🔖 Reading List ({readingList.bookIds.length}) 33 |
34 | {data.allCategoriesJson.edges.map(function(x, index) { 35 | return ( 36 | 37 | 38 | {x.node.emoji} {x.node.name} 39 | 40 | 41 | ) 42 | })} 43 |
44 |
45 |
46 | )} 47 | /> 48 | ) 49 | } 50 | -------------------------------------------------------------------------------- /app/src/components/sortByDropdown.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Dropdown } from 'react-bootstrap'; 3 | 4 | export const compareFunctions = { 5 | title_a_z: ({ node: bookOne }, { node: bookTwo }) => bookOne.title.localeCompare(bookTwo.title), 6 | title_z_a: ({ node: bookOne }, { node: bookTwo }) => bookTwo.title.localeCompare(bookOne.title), 7 | year_descending: ({ node: bookOne }, { node: bookTwo }) => Number(bookTwo.year) - Number(bookOne.year), 8 | year_ascending: ({ node: bookOne }, { node: bookTwo }) => Number(bookOne.year) - Number(bookTwo.year), 9 | rating_descending: ({ node: bookOne }, { node: bookTwo }) => Number(bookTwo.rating) - Number(bookOne.rating), 10 | rating_ascending: ({ node: bookOne }, { node: bookTwo }) => Number(bookOne.rating) - Number(bookTwo.rating), 11 | }; 12 | 13 | export const FIELDS_TO_SORT_BY = [ 14 | { label: 'Rating, high to low', value: 'rating_descending' }, 15 | { label: 'Rating, low to high', value: 'rating_ascending' }, 16 | { label: 'Publication year, new to old', value: 'year_descending' }, 17 | { label: 'Publication year, old to new', value: 'year_ascending' }, 18 | { label: 'Title, A-Z', value: 'title_a_z' }, 19 | { label: 'Title, Z-A', value: 'title_z_a' }, 20 | ]; 21 | 22 | export default ({ sortBy, onSortByItemClick }) => ( 23 |
24 | 25 | 26 | Sort By: 27 | {' '} 28 | {sortBy} 29 | 30 | 31 | 32 | {FIELDS_TO_SORT_BY.map((field, index) => ( 33 | onSortByItemClick(field)}> 34 | {field.label} 35 | 36 | ))} 37 | 38 | 39 |
40 | ); 41 | -------------------------------------------------------------------------------- /app/src/context/bookReducer.js: -------------------------------------------------------------------------------- 1 | export default function bookReducer(state, action) { 2 | let readingListCopy = {...state} 3 | 4 | switch (action.type) { 5 | case 'init': { 6 | if (action.content) { 7 | return action.content 8 | } 9 | return readingListCopy 10 | } 11 | case 'bookmark': { 12 | let { bookIds, books } = readingListCopy 13 | const { retrievedBook } = action 14 | const retrievedBookId = retrievedBook.id 15 | // Delete existing bookmark 16 | if (bookIds.includes(retrievedBookId)) { 17 | readingListCopy.bookIds = bookIds.filter(id => id !== retrievedBookId) 18 | delete books[retrievedBookId] 19 | if (typeof window !== undefined) { 20 | localStorage.setItem('Bookmarks', JSON.stringify(readingListCopy)) 21 | } 22 | // Add new bookmark 23 | } else { 24 | books[retrievedBookId] = retrievedBook 25 | bookIds.push(retrievedBookId) 26 | if (typeof window !== undefined) { 27 | localStorage.setItem('Bookmarks', JSON.stringify(readingListCopy)) 28 | } 29 | } 30 | return readingListCopy 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/context/globalState.js: -------------------------------------------------------------------------------- 1 | import React, { useReducer, useEffect } from 'react' 2 | import bookReducer from './bookReducer' 3 | 4 | export const BookmarkContext = React.createContext() 5 | 6 | export default function GlobalState({children}) { 7 | let [readingList, updateReadingList] = useReducer(bookReducer, { 8 | books: {}, 9 | bookIds: [] 10 | }) 11 | 12 | useEffect(() => { 13 | if (typeof window !== undefined) { 14 | const retrievedBooks = JSON.parse(localStorage.getItem('Bookmarks')) 15 | console.log(retrievedBooks) 16 | updateReadingList({type: 'init', content: retrievedBooks}) 17 | } 18 | }, []) 19 | 20 | return ( 21 | 22 | {children} 23 | 24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /app/src/data/categories.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Startups and Business", 4 | "emoji": "🚀" 5 | }, 6 | { 7 | "name": "Philosophy And Psychology", 8 | "emoji": "☯️" 9 | }, 10 | { 11 | "name": "Autobiographies and Biographies", 12 | "emoji": "👩🏾" 13 | }, 14 | { 15 | "name": "History", 16 | "emoji": "📜" 17 | }, 18 | { 19 | "name": "Science and Medicine", 20 | "emoji": "🔬" 21 | }, 22 | { 23 | "name": "Logic and Problem Solving", 24 | "emoji": "🧩" 25 | }, 26 | { 27 | "name": "Politics", 28 | "emoji": "🗳️" 29 | }, 30 | { 31 | "name": "Economics", 32 | "emoji": "📈" 33 | }, 34 | { 35 | "name": "Gender", 36 | "emoji": "🏳️‍🌈" 37 | }, 38 | { 39 | "name": "Sexuality", 40 | "emoji": "😘" 41 | }, 42 | { 43 | "name": "Education", 44 | "emoji": "🏫" 45 | }, 46 | { 47 | "name": "Writing", 48 | "emoji": "📝" 49 | }, 50 | { 51 | "name": "Theater and Film", 52 | "emoji": "🎬" 53 | }, 54 | { 55 | "name": "Health", 56 | "emoji": "👩‍⚕️" 57 | }, 58 | { 59 | "name": "Travel", 60 | "emoji": "🛩️" 61 | }, 62 | { 63 | "name": "Language", 64 | "emoji": "🉐" 65 | }, 66 | { 67 | "name": "Nature", 68 | "emoji": "🌲" 69 | }, 70 | { 71 | "name": "Art", 72 | "emoji": "🖌️" 73 | } 74 | ] 75 | -------------------------------------------------------------------------------- /app/src/images/amazon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackerkid/Mind-Expanding-Books/2844c5ad5e1f4da8a637c74503763a2cb56f5550/app/src/images/amazon.png -------------------------------------------------------------------------------- /app/src/images/gatsby-astronaut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackerkid/Mind-Expanding-Books/2844c5ad5e1f4da8a637c74503763a2cb56f5550/app/src/images/gatsby-astronaut.png -------------------------------------------------------------------------------- /app/src/images/gatsby-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackerkid/Mind-Expanding-Books/2844c5ad5e1f4da8a637c74503763a2cb56f5550/app/src/images/gatsby-icon.png -------------------------------------------------------------------------------- /app/src/images/goodreads.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackerkid/Mind-Expanding-Books/2844c5ad5e1f4da8a637c74503763a2cb56f5550/app/src/images/goodreads.png -------------------------------------------------------------------------------- /app/src/pages/404.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import Layout from "../components/layout" 4 | import SEO from "../components/seo" 5 | 6 | const NotFoundPage = () => ( 7 | 8 | 9 |

NOT FOUND

10 |

You just hit a route that doesn't exist... the sadness.

11 |
12 | ) 13 | 14 | export default NotFoundPage 15 | -------------------------------------------------------------------------------- /app/src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react" 2 | import { graphql } from "gatsby" 3 | 4 | import Layout from "../components/layout" 5 | import SEO from "../components/seo" 6 | import SideBar from "../components/sidebar" 7 | import { Container, Row, Col, Navbar } from "react-bootstrap" 8 | import BookFeed from "../components/feed" 9 | 10 | function myFunction(setMaximumBooksToShow, maximumBooksToShow) { 11 | if ( 12 | document.documentElement.clientHeight + 13 | document.documentElement.scrollTop >= 14 | document.documentElement.scrollHeight 15 | ) { 16 | setMaximumBooksToShow(maximumBooksToShow + 12) 17 | } 18 | } 19 | 20 | export default ({ data }) => { 21 | let [maximumBooksToShow, setMaximumBooksToShow] = useState(12) 22 | 23 | useEffect(() => { 24 | window.document.onscroll = () => 25 | myFunction(setMaximumBooksToShow, maximumBooksToShow) 26 | }) 27 | 28 | return ( 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | {/*
45 | © {new Date().getFullYear()}, Built with 46 | {` `} 47 | Gatsby 48 |
*/} 49 |
50 |
51 |
52 | ) 53 | } 54 | 55 | export const query = graphql` 56 | query MyQuery { 57 | allBooksJson( 58 | sort: { 59 | fields: [rating] 60 | order: DESC 61 | } 62 | ) { 63 | edges { 64 | node { 65 | id 66 | title 67 | url 68 | rating 69 | author 70 | year 71 | category 72 | description 73 | image_url 74 | amazon_url 75 | } 76 | } 77 | } 78 | } 79 | ` 80 | -------------------------------------------------------------------------------- /app/src/pages/page-2.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { Link } from "gatsby" 3 | 4 | import Layout from "../components/layout" 5 | import SEO from "../components/seo" 6 | 7 | const SecondPage = () => ( 8 | 9 | 10 |

Hi from the second page

11 |

Welcome to page 2

12 | Go back to the homepage 13 |
14 | ) 15 | 16 | export default SecondPage 17 | -------------------------------------------------------------------------------- /app/src/pages/readingList.js: -------------------------------------------------------------------------------- 1 | import React, { useContext } from "react" 2 | import { Link } from "gatsby" 3 | import { Container, Row, Col } from "react-bootstrap" 4 | import SideBar from "../components/sidebar" 5 | import Layout from "../components/layout" 6 | import SEO from "../components/seo" 7 | import Bookcard from "../components/bookcard" 8 | import { BookmarkContext } from "../context/globalState" 9 | 10 | const ReadingList = () => { 11 | const { readingList } = useContext(BookmarkContext) 12 | 13 | return ( 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |

Your reading list

23 | Go back to the homepage 24 | { 25 | readingList.bookIds.map(bookId => { 26 | return 27 | }) 28 | } 29 | 30 |
31 |
32 |

Reading List

33 |
34 | )} 35 | 36 | export default ReadingList 37 | -------------------------------------------------------------------------------- /app/src/styles/global.css: -------------------------------------------------------------------------------- 1 | .custom-header{ 2 | position: fixed; 3 | } 4 | .footer-text { 5 | text-align:center; 6 | padding-bottom:1 rem; 7 | } 8 | 9 | .dark-mode { 10 | background-color: #3c4759; 11 | } -------------------------------------------------------------------------------- /app/src/styles/sidebar.css: -------------------------------------------------------------------------------- 1 | .sidebar { 2 | position: fixed; 3 | top: 0; 4 | bottom: 0; 5 | left: 0; 6 | min-height: 100vh !important; 7 | margin: 70px 0 0; 8 | box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.1); 9 | width: max-content; 10 | } 11 | 12 | .nav-link { 13 | font-size: 0.9rem; 14 | } 15 | 16 | #sidebar-wrapper { 17 | min-height: 100vh !important; 18 | width: 100vw; 19 | margin-left: -1rem; 20 | -webkit-transition: margin 0.25s ease-out; 21 | -moz-transition: margin 0.25s ease-out; 22 | -o-transition: margin 0.25s ease-out; 23 | transition: margin 0.25s ease-out; 24 | } 25 | #sidebar-wrapper .sidebar-heading { 26 | padding: 0.875rem 1.25rem; 27 | font-size: 1.2rem; 28 | } 29 | #page-content-wrapper { 30 | min-width: 0; 31 | width: 100%; 32 | } 33 | .navbar { 34 | padding: 10px 0px; 35 | } 36 | .navbar-toggler { 37 | margin-bottom: 1.2rem; 38 | } 39 | -------------------------------------------------------------------------------- /app/src/templates/categoryTemplate.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react" 2 | import { graphql } from "gatsby" 3 | 4 | import Layout from "../components/layout" 5 | import SEO from "../components/seo" 6 | import SideBar from "../components/sidebar" 7 | import CategoryDescription from "../components/categorydescription" 8 | import { Container, Row, Col } from "react-bootstrap" 9 | import BookFeed from "../components/feed" 10 | 11 | const basicTemplate = props => { 12 | const { pageContext } = props 13 | const { categoryName, data, image } = pageContext 14 | 15 | return ( 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | ) 31 | } 32 | export default basicTemplate 33 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1 3 | } 4 | -------------------------------------------------------------------------------- /utils/.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | __pycache__ 3 | config.py 4 | bin/ 5 | include/ 6 | lib/ 7 | out.json 8 | pip-selfcheck.json 9 | -------------------------------------------------------------------------------- /utils/HOUSEKEEPING.md: -------------------------------------------------------------------------------- 1 | This contains documentation on `housekeep.py` which was a command developed for converting from legacy README 2 | format to the new format. This is not used anymore. 3 | 4 | 5 | ## Getting started 6 | 7 | ### Setup 8 | 1) Copy ```config-sample.py``` to ```config.py``` 9 | 10 | ```bash 11 | cp config-sample.py config.py 12 | ``` 13 | 2) Get a GoodReads API key [here](https://www.goodreads.com/api/keys) 14 | 3) Copy your public key to the ```config.py``` file 15 | 16 | ### Converting 17 | 18 | Run 19 | 20 | ```bash 21 | python3 housekeep.py --file_type='old' 22 | ``` 23 | 24 | The ``--file_type='old'`` flag is needed if the books are displayed in the old format (in a list). New format is the default (when the records are displayed in tables). 25 | 26 | This will convert to the new format and save it to ``README-new.md``. 27 | 28 | **Note!** the first conversion can take some time, we wait 1 second between each request to GoodReads to not abuse the API. 29 | After the first generation only missing records will be tried to be retrieved. 30 | 31 | Run to see the available arguments 32 | ```bash 33 | python3 housekeep.py --help 34 | ``` 35 | -------------------------------------------------------------------------------- /utils/README.MD: -------------------------------------------------------------------------------- 1 | `utils/` mainly contains scripts for generating `app/src/data/books.json` file from `README.md` 2 | 3 | In most cases, you don't want to run the scripts in this directory or make changes to it. 4 | The only time you want to mess with the scripts is when you want to fetch some extra data from `API` or 5 | want to update the `app/src/data/books.json` file to include a newly added book or category. 6 | 7 | ## Generating `app/src/data/books.json` 8 | 9 | The website shows name of the book, year, rating, cover, amazon link, etc in book card. Some of the 10 | data like name, year, rating etc is present in the [main README.md](../README.md). Other details 11 | like cover photo, amazon link etc is fetched from various APIs. 12 | 13 | The script that fetches all these extra data lives in `utils/update_json_files.py` 14 | 15 | The script goes through all the books in [main README.md](../README.md) and starts fetching the extra details 16 | from `Goodreads` and `Google Search` API. And the result is stored in `utils/books.json` and `utils/book_name_to_details.json` 17 | (used for caching only). 18 | 19 | Once the script completes the run, the `utils/books.json` file is copied to `app/src/data/books.json` **manually**. 20 | 21 | And the website uses the data from `app/src/data/books.json` for generating the pages. 22 | 23 | ## Install packages for script 24 | 25 | ```bash 26 | cd utils 27 | virtualenv . 28 | source bin/activate 29 | pip install -r requirements.txt 30 | ``` 31 | 32 | ## Executing the script 33 | 34 | - Register at [goodreads](https://www.goodreads.com) 35 | - Apply for a developer api [here](https://www.goodreads.com/api) 36 | - Copy utils/config-sample.py as utils/config.py 37 | - Fill in the API Key credentials 38 | -------------------------------------------------------------------------------- /utils/config-sample.py: -------------------------------------------------------------------------------- 1 | # save this file as 'config.py' and then, fill it with you api key 2 | GOODREADS_PUBLIC_API_KEY = "write here your goodreads public API key" 3 | GOOGLE_SEARCH_RAPIDAPI_HOST = "" 4 | GOOGLE_SEARCH_RAPIDAPI_KEY = "" 5 | GOOGLE_BOOK_API_KEY = "" 6 | -------------------------------------------------------------------------------- /utils/gooodreads.py: -------------------------------------------------------------------------------- 1 | import time 2 | import xml.etree.ElementTree as ET 3 | import urllib.request 4 | import urllib.error 5 | 6 | import requests 7 | 8 | from bs4 import BeautifulSoup 9 | 10 | from config import GOODREADS_PUBLIC_API_KEY, GOOGLE_SEARCH_RAPIDAPI_HOST, GOOGLE_SEARCH_RAPIDAPI_KEY, GOOGLE_BOOK_API_KEY 11 | from googlesearch import search 12 | 13 | def get_details(book_object): 14 | 15 | url = "http://www.goodreads.com/book/title.xml?key={}&title={}".format( 16 | GOODREADS_PUBLIC_API_KEY, urllib.parse.quote_plus(book_object["title"]) 17 | ) 18 | print(url) 19 | try: 20 | time_to_sleep = 1 21 | while True: 22 | response = urllib.request.urlopen(url) 23 | print(response.getcode()) 24 | if response.getcode() == 429: 25 | time_to_sleep = time_to_sleep * 2 26 | print("Sleeping for {}".format(time_to_sleep)) 27 | time.sleep(time_to_sleep) 28 | else: 29 | break 30 | tree = ET.ElementTree(file=response) 31 | root = tree.getroot() 32 | book = root.find("book") 33 | book_object["year"] = book.find("publication_year").text or "" 34 | book_object["lang"] = book.find("language_code").text 35 | book_object["rating"] = book.find("average_rating").text 36 | book_object["pages"] = book.find("num_pages").text 37 | book_object["image_url"] = book.find("image_url").text 38 | book_object["isbn"] = book.find("isbn").text 39 | 40 | description = book.find("description").text 41 | if description: 42 | book_object["description"] = BeautifulSoup(description).text 43 | else: 44 | book_object["description"] = "" 45 | if GOOGLE_BOOK_API_KEY.strip(" "): 46 | # Attempt to use Google Book API 47 | url = "https://www.googleapis.com/books/v1/volumes?q={}+inauthor:{}&key={}".format( 48 | book_object["title"], book_object["author"], GOOGLE_BOOK_API_KEY, 49 | ) 50 | response = requests.request("GET", url) 51 | 52 | for item in response.json()["items"]: 53 | if "description" in item["volumeInfo"]: 54 | book_object["description"] = item["volumeInfo"]["description"] 55 | break 56 | 57 | print("Fetching amazon link") 58 | 59 | url = "https://google-search3.p.rapidapi.com/api/v1/search/q=site:amazon.com {} {}".format(book_object["title"], book_object["author"]) 60 | 61 | headers = { 62 | 'x-rapidapi-host': GOOGLE_SEARCH_RAPIDAPI_HOST, 63 | 'x-rapidapi-key': GOOGLE_SEARCH_RAPIDAPI_KEY, 64 | } 65 | 66 | response = requests.request("GET", url, headers=headers) 67 | book_object["amazon_url"] = response.json()["results"][0]["link"] 68 | return True 69 | except urllib.error.HTTPError as e: 70 | print( 71 | "Error getting book details from GoodReads for book: {}. \nGot error: ".format( 72 | book_object["title"] 73 | ) 74 | ) 75 | print(str(e.getcode()) + " " + e.msg) 76 | return False 77 | 78 | 79 | def get_goodread_info(library, force): 80 | import sys 81 | 82 | print("") 83 | print("Getting GoodReads data...") 84 | 85 | processed = 0 86 | total_book_count = 0 87 | for key in library: 88 | total_book_count += len(library[key]) 89 | 90 | for category in library: 91 | book_list = library[category] 92 | for book in book_list: 93 | # do not call the api again if we already have the infomation 94 | if not force and "rating" in book and book["rating"]: 95 | processed += 1 96 | continue 97 | get_details(book) 98 | processed += 1 99 | 100 | print( 101 | "{}/{} records processed.".format(processed, total_book_count), end="\b" 102 | ) 103 | sys.stdout.write("\r") 104 | sys.stdout.flush() # <- makes python print it anyway 105 | 106 | # need to wait a second between the requests, to not abuse the API 107 | time.sleep(1) 108 | -------------------------------------------------------------------------------- /utils/housekeep.py: -------------------------------------------------------------------------------- 1 | import simplejson 2 | 3 | # we assume that every line after # Books 4 | # starting with * is a book title if file type is old 5 | # starting with | (and not with | Name or |--) is a book if the file type is new 6 | 7 | # ARGUMENT HANDLING 8 | try: 9 | import argparse 10 | 11 | parser = argparse.ArgumentParser(description="Process file.") 12 | parser.add_argument("--in_file", help="File to process, defaults to ./../README.MD") 13 | parser.add_argument( 14 | "--out_file", help="File to save to, defaults to ./../README-NEW.MD" 15 | ) 16 | parser.add_argument( 17 | "--input_file_type", 18 | choices=["old", "new"], 19 | help="old if links are displayed in a list, new if in a table", 20 | ) 21 | parser.add_argument( 22 | "--sort_by", 23 | choices=["rating", "title", "author", "year"], 24 | help="defaults to rating", 25 | ) 26 | parser.add_argument("--force", dest="force", action="store_true", default=False) 27 | parser.add_argument( 28 | "--store-json", dest="store_json", action="store_true", default=False 29 | ) 30 | flags = parser.parse_args() 31 | except ImportError: 32 | flags = None 33 | 34 | 35 | def sort(library, key_to_sort_on, reverse=False): 36 | new_library = {} 37 | for key in library: 38 | books = library[key] 39 | new_library[key] = sorted( 40 | books, key=lambda k: k[key_to_sort_on], reverse=reverse 41 | ) 42 | return new_library 43 | 44 | 45 | def format_library(library): 46 | formated_library = [] 47 | for category in library: 48 | for book in library[category]: 49 | book["category"] = category[len("## ") :] 50 | formated_library.append(book) 51 | return formated_library 52 | 53 | 54 | def main(): 55 | from read_file import load 56 | from gooodreads import get_goodread_info 57 | from write_file import render 58 | 59 | in_file = flags.in_file or "./../README.md" 60 | out_file = flags.out_file or "./../README-new.md" 61 | input_file_type = flags.input_file_type or "new" 62 | sort_by = flags.sort_by or "rating" 63 | force = flags.force 64 | store_json = flags.store_json 65 | reverse = True if sort_by == "rating" else False 66 | 67 | library = load(in_file, input_file_type) 68 | get_goodread_info(library, force) 69 | library = sort(library, sort_by, reverse) 70 | render(in_file, out_file, library) 71 | if store_json: 72 | with open("out.json", "w") as f: 73 | f.write(simplejson.dumps(format_library(library), indent=4, sort_keys=True)) 74 | 75 | 76 | if __name__ == "__main__": 77 | main() 78 | -------------------------------------------------------------------------------- /utils/pyvenv.cfg: -------------------------------------------------------------------------------- 1 | home = /usr 2 | implementation = CPython 3 | version_info = 3.8.5.final.0 4 | virtualenv = 20.0.20 5 | include-system-site-packages = false 6 | base-prefix = /usr 7 | base-exec-prefix = /usr 8 | base-executable = /usr/bin/python3 9 | -------------------------------------------------------------------------------- /utils/read_file.py: -------------------------------------------------------------------------------- 1 | def read_file_content(file): 2 | with open(file) as f: 3 | content = f.readlines() 4 | # remove whitespaces 5 | return [_.strip() for _ in content] 6 | 7 | 8 | # old (list) 9 | def parse_book_string(book_string): 10 | book = {} 11 | book["title"] = book_string.split("[")[1].split("]")[0] 12 | book["url"] = book_string.split("]")[1].split("(")[1].split(")")[0] 13 | book["author"] = book_string.split(" by ")[-1] 14 | book["rating"] = "" 15 | book["year"] = "" 16 | return book 17 | 18 | 19 | # new (table) 20 | def parse_book_string_new(book_string): 21 | book = {} 22 | book_split = book_string.split("|") 23 | # print(book_split) 24 | book["title"] = book_split[1].strip() 25 | book["author"] = book_split[2].strip() 26 | book["url"] = book_split[3].strip().split("[")[1].split("(")[1].split(")")[0] 27 | book["rating"] = book_split[3].strip().split("[")[1].split("]")[0] 28 | book["year"] = book_split[4].strip() 29 | return book 30 | 31 | 32 | def load(file, file_type): 33 | file = read_file_content(file) 34 | 35 | # we start one line after tilte # Books 36 | line_to_start = file.index("# Books") + 1 37 | current_title = "" 38 | books_under_current_title = [] 39 | library = {} 40 | 41 | for i in range(line_to_start, len(file)): 42 | line = file[i] 43 | 44 | # we have a title 45 | if line.startswith("##"): 46 | if len(current_title) == 0: 47 | current_title = line 48 | else: 49 | library[current_title] = books_under_current_title 50 | books_under_current_title = [] 51 | current_title = line 52 | continue 53 | 54 | # we have a book 55 | if file_type == "old": 56 | if line.startswith("*"): 57 | book = parse_book_string(line) 58 | books_under_current_title.append(book) 59 | else: 60 | if ( 61 | line.startswith("|") 62 | and not line.startswith("| Name") 63 | and not line.startswith("|---") 64 | ): 65 | book = parse_book_string_new(line) 66 | books_under_current_title.append(book) 67 | 68 | return library 69 | -------------------------------------------------------------------------------- /utils/requirements.txt: -------------------------------------------------------------------------------- 1 | appdirs==1.4.4 2 | attrs==20.1.0 3 | black==19.10b0 4 | click==7.1.2 5 | pathspec==0.8.0 6 | regex==2020.7.14 7 | toml==0.10.1 8 | typed-ast==1.4.1 9 | amzsear==2.0.1 10 | appdirs==1.4.4 11 | attrs==20.1.0 12 | beautifulsoup4==4.9.1 13 | black==19.10b0 14 | bs4==0.0.1 15 | certifi==2020.6.20 16 | chardet==3.0.4 17 | click==7.1.2 18 | google==3.0.0 19 | idna==2.10 20 | pathspec==0.8.0 21 | regex==2020.7.14 22 | requests==2.24.0 23 | soupsieve==2.0.1 24 | toml==0.10.1 25 | typed-ast==1.4.1 26 | urllib3==1.25.10 27 | -------------------------------------------------------------------------------- /utils/update_json_files.py: -------------------------------------------------------------------------------- 1 | import json 2 | import time 3 | 4 | from read_file import load 5 | from gooodreads import get_details 6 | from bs4 import BeautifulSoup 7 | 8 | required_fields = [ 9 | "title", 10 | "author", 11 | "url", 12 | "rating", 13 | "year", 14 | "pages", 15 | "image_url", 16 | "description", 17 | "category", 18 | "amazon_url", 19 | ] 20 | 21 | 22 | def book_has_all_fields(book): 23 | for required_field in required_fields: 24 | if required_field not in existing_book: 25 | print(f"Missing {required_field}") 26 | return False 27 | return True 28 | 29 | 30 | def clean_category(category_raw): 31 | if "### " in category_raw: 32 | return category_raw[4:] 33 | if "## " in category_raw: 34 | return category_raw[3:] 35 | 36 | def validate_bookcover(book_details): 37 | """ 38 | Check if goodreads returns a nophoto 39 | Use open library to fetch the book cover 40 | based on ISBN 41 | 42 | Args: 43 | book_details: Book info returned as json by goodreads API 44 | 45 | Returns: 46 | This API checks for book cover, and returns with a valid 47 | bookcover if nophoto found on goodreads, using openlibrary 48 | """ 49 | no_photo_url='https://s.gr-assets.com/assets/nophoto/book/' 50 | open_library_url='http://covers.openlibrary.org/b/isbn/{isbn}-M.jpg' 51 | 52 | if (book_details['image_url'].__contains__(no_photo_url)): 53 | book_details['image_url'] = open_library_url.format(isbn=book_details['isbn']) 54 | return book_details 55 | 56 | if __name__ == "__main__": 57 | library = load("../README.md", "new") 58 | existing_book_names_to_details = json.load(open("book_name_to_details.json")) 59 | 60 | for category in library: 61 | category_name = clean_category(category) 62 | for book in library[category]: 63 | if (title := book["title"]) in existing_book_names_to_details: 64 | existing_book = existing_book_names_to_details[title] 65 | if book_has_all_fields(existing_book): 66 | print(f"🆗 {title}") 67 | continue 68 | new_book = { 69 | "title": title, 70 | "author": book["author"], 71 | "url": book["url"], 72 | "category": category_name, 73 | } 74 | fetched = get_details(new_book) 75 | if fetched: 76 | print(f"✅ {title}") 77 | new_book = validate_bookcover(new_book) 78 | existing_book_names_to_details[title] = new_book 79 | with open("book_name_to_details.json", "w") as f: 80 | json.dump( 81 | existing_book_names_to_details, 82 | f, 83 | sort_keys=True, 84 | indent=4, 85 | separators=(",", ": "), 86 | ) 87 | 88 | book_list = [] 89 | for _, book in existing_book_names_to_details.items(): 90 | book_list.append(book) 91 | with open("books.json", "w") as f: 92 | json.dump(book_list, f, sort_keys=True, indent=4, separators=(",", ": ")) 93 | else: 94 | print(f"❌ Error while fetching {title}") 95 | -------------------------------------------------------------------------------- /utils/write_file.py: -------------------------------------------------------------------------------- 1 | from shutil import copyfile 2 | import os 3 | 4 | 5 | def render_book_line(book_object): 6 | book = book_object 7 | book["rating"] = "?" if not "rating" in book else book["rating"] 8 | book["url"] = "" if not "url" in book else book["url"] 9 | book["year"] = "" if not "year" in book else book["year"] 10 | return "| {} | {} | [{}]({}) | {} | \n".format( 11 | book["title"], book["author"], book["rating"], book["url"], book["year"] 12 | ) 13 | 14 | 15 | # TODO: refine this logic 16 | def render(in_file, out_file, library): 17 | """ 18 | This renders the file to the out_file location 19 | savig the new file to tmp_file location, the copying it to out-file and deleting tmp_file 20 | this is done to prevent issues if the in and the out file are the same 21 | """ 22 | tmp_file = "./.tmp-file.md" 23 | open(tmp_file, "a").close() 24 | books_not_reached = True 25 | with open(tmp_file, "w") as out_file_tmp: 26 | with open(in_file) as original_file: 27 | for line in original_file: 28 | 29 | if line.strip() in library: 30 | if not books_not_reached: 31 | out_file_tmp.write("\n") 32 | books_not_reached = False 33 | 34 | # render chapter and start of the table 35 | out_file_tmp.write(line) 36 | if len(library[line.strip()]) > 0: 37 | out_file_tmp.write( 38 | "| Name | Author | Goodreads Rating | Year Published | \n" 39 | ) 40 | out_file_tmp.write( 41 | "|------|--------|------------------|----------------| \n" 42 | ) 43 | # render books 44 | for book in library[line.strip()]: 45 | out_file_tmp.write(render_book_line(book)) 46 | elif books_not_reached: 47 | out_file_tmp.write(line) 48 | elif line.startswith("## License"): 49 | out_file_tmp.write("\n") 50 | out_file_tmp.write("\n") 51 | out_file_tmp.write(line) 52 | books_not_reached = True 53 | 54 | copyfile(tmp_file, out_file) 55 | os.remove(tmp_file) 56 | --------------------------------------------------------------------------------