A microblogging app built with Go Micro
A minimalist microblogging platform built with Go Micro. Share your thoughts and engage with the community.
- Microservices-based architecture (Users, Posts, Comments, Web)
- Minimalist web UI (feed, profiles, login, signup)
- Edit and delete your own posts (author-only controls)
- Tagging, clickable tags, and tag-based browsing (/tags/:tag)
- REST API for all major features
- GitHub Actions CI for Go tests
- Licensed under AGPL v3
The project consists of the following microservices:
- Users: User management (create, read, update, delete)
- Posts: Post management (create, read, delete, list, tag management)
- Comments: Comment management (create, read, delete, list)
- Web: REST API and web app that uses all other services
A minimalist web interface for the blog, located in web/static/:
index.html: Main feed, create posts, view posts and commentslogin.html: User login pagesignup.html: User registration pageprofile.html: User profile, posts, and comments
Everything is server side rendered
The blog allows you to:
- Add tags to posts
- Remove tags from posts
- Click tags on a post to browse posts with that tag
- Filter the feed to show posts with a specific tag at
/tags/:tag - Browse all available tags (API) or filter via UI
Notes
- Tag add/remove from the web UI will redirect you back to the post page on success.
- API/JSON clients receive JSON responses.
- Authors can edit or delete their own posts on the post page.
- Delete prompts for confirmation and then returns you to the feed.
- Go 1.24 or higher
- Micro v5 (master branch)
To install Micro CLI:
go install go-micro.dev/v5/cmd/micro@masterMake sure that $GOPATH/bin (or $HOME/go/bin) is in your PATH so you can use the micro command.
Clone and cd into the blog directory and run it
micro runBrowse to http://localhost:8089
GET /posts: List all postsGET /posts/:id: Get a post by IDPOST /posts: Create a new post{ "title": "Post title", "content": "Post content" }PATCH /posts/:id: Update a post (author only){ "title": "Updated title", "content": "Updated content" }DELETE /posts/:id: Delete a post (author only)
GET /comments: List all comments (optionally filter bypost_idquery param)POST /comments: Add a comment{ "content": "Comment content", "post_id": "post_id" }
GET /users: List all usersGET /users/:id: Get a user by IDPOST /users: Create a new user{ "name": "User Name" }POST /signup: Register a new user (and log in){ "name": "username", "password": "plaintextpassword" }POST /login: Log in as a user{ "name": "username", "password": "plaintextpassword" }POST /logout: Log out the current userGET /users/me: Get the current session user info
POST /posts/:id/tags: Add a tag to a post{ "tag": "tagname" }DELETE /posts/:id/tags/:tag: Remove a tag from a postGET /tags: Get all available tagsGET /tags?post_id=:id: Get tags for a specific postGET /posts/by-tag/:tag: Get posts with a specific tagGET /tags/:tag: HTML page showing posts filtered by tag (same template as the main feed)
blog/
├── comments/ # Comments service
│ ├── handler/ # Request handlers
│ ├── main.go # Entry point
│ └── proto/ # Protobuf definitions
├── posts/ # Posts service
│ ├── handler/
│ ├── main.go
│ └── proto/
├── users/ # Users service
│ ├── handler/
│ ├── main.go
│ └── proto/
└── web/ # REST API and static web UI
├── main.go # REST API server
└── static/ # Static web UI (index.html, login.html, signup.html, profile.html)