OpenInk is a sleek and modern blogging platform designed for writers who value simplicity and performance. Built with a powerful stack including React and Appwrite, it provides a seamless experience for creating, managing, and sharing your ideas with the world.
- 🔐 Full Authentication: Secure sign-up, log-in, and session management powered by Appwrite.
- ✍️ Rich Text Editing: A powerful WYSIWYG editor (TinyMCE) for crafting beautiful posts.
- 🖼️ Dynamic Image Uploads: Seamlessly upload and manage featured images for your posts with Appwrite Storage.
- 📰 Complete Post Management (CRUD): Full capabilities to create, read, update, and delete posts.
- 👤 User-Specific Content: A "My Posts" section for users to easily view and manage their own articles.
- 📱 Fully Responsive Design: A clean and modern UI built with TailwindCSS that looks great on all devices.
- ⚡ Optimized State Management: Centralized and predictable state powered by Redux Toolkit.
- Frontend: React (with Vite), TailwindCSS
- State Management: Redux Toolkit
- Backend as a Service (BaaS): Appwrite (Handles Auth, Database, and Storage)
- Form Handling: React Hook Form
- Rich Text Editor: TinyMCE
Follow these instructions to get a copy of the project up and running on your local machine.
- Node.js and npm installed on your machine.
- An Appwrite account (free tier is sufficient).
- A TinyMCE account to get a free API key.
- Create a Project: Log in to your Appwrite console and create a new project.
- Create a Database: In your project, navigate to Databases and create a new database.
- Create a Collection: Inside the database, create a collection named
Posts. - Define Attributes: Go to the Attributes tab for your
Postscollection and create the following attributes:title(string, required)content(string, required)featuredImage(string, required)status(string, required)userId(string, required)
- Create a Storage Bucket: Navigate to Storage and create a new bucket named
BlogImages. - Set Permissions: For both your collection and bucket, go to the Settings tab and grant Read and Write access to
Usersto allow authenticated users to manage their content. - Gather Credentials: Keep your Appwrite Endpoint, Project ID, Database ID, Collection ID, and Bucket ID handy for the next step.
-
Clone the Repository:
git clone [https://github.com/garvit811/openink.git](https://github.com/garvit811/openink.git) cd openink -
Install Dependencies:
npm install
-
Configure Environment Variables: Create a file named
.envin the root of the project and add the following, replacing the placeholder values with your actual credentials from Appwrite and TinyMCE.# Appwrite Configuration VITE_APPWRITE_ENDPOINT=[https://cloud.appwrite.io/v1](https://cloud.appwrite.io/v1) VITE_APPWRITE_PROJECT_ID=your_project_id VITE_APPWRITE_DATABASE_ID=your_database_id VITE_APPWRITE_COLLECTION_ID=your_collection_id VITE_APPWRITE_BUCKET_ID=your_bucket_id # TinyMCE Configuration VITE_TINY_MCE_API_KEY=your_tinymce_api_key
-
Run the Development Server:
npm run dev
The application should now be running on http://localhost:5173/.
The project follows a modular structure to keep the code organized and maintainable.
src/
├── appwrite/ # Appwrite services (auth, database config)
├── assets/ # Static assets like images and logos
├── components/ # Reusable UI components (Header, Footer, Button, etc.)
├── conf/ # Environment variable configurations
├── pages/ # Top-level page components (Home, AddPost, Login, etc.)
├── store/ # Redux Toolkit store, slices, and actions
├── App.jsx # Root component with routing
└── main.jsx # Application entry point
Contributions are welcome! If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the "enhancement" tag.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License. See the LICENSE file for more details.