7. Community
Beyond the job-search and credentialing core, Ditto Up has a full social layer — posts, reactions, comments, follows, mentions, notifications, blocking and reporting. This section covers everything you can do in the community space.
In this section
7.1 The eight kinds of post
Ditto Up doesn't have one generic "post" type — there are eight, each with its own form fields, template and discoverability rules.
| Type | URL | Template | Use it for |
|---|---|---|---|
| Humor | /post/humor |
post_humor.html |
Memes, jokes, GIFs, light-hearted content. Searchable and reactable. |
| News | /post/news |
post_news.html |
Industry news, articles, market commentary with link preview. |
| Questions | /post/questions |
post_questions.html |
Ask the community — career advice, salary intel, "is X certification worth it?" |
| Volunteering | /post/volunteering |
post_volunteering.html |
Volunteer opportunities, pro-bono asks, mutual-aid posts. |
| Equipment | /post/equipment |
post_equipment.html |
Industry tools / hardware for sale, rent or trade. |
| Events | /post/events |
post_events.html |
Conferences, meetups, networking nights, training sessions. |
| Training | /post/training |
post_training.html |
Workshops, courses, mentorship offers tied to a term. |
| Service | /post/service |
(service post template) | Freelance / contract services offered. |
Each post type also has:
- A discriminator on the search results page (you can filter
type=post&post_kind=news). - Its own icon and colour on listings.
- Slightly different fields (e.g. Events require a date / location; Equipment requires a price; Questions open the comments section by default).
A unified entry point at /post_add and a legacy /create_post (template create_post.html) dispatch to the appropriate template based on a kind parameter — useful if you want a single "Create" button in your UI.
7.2 Creating a post
The flow looks the same for every post type:
- Click + Create in the top navigation, or click one of the eight post-type buttons in the home feed.
- The matching form template loads.
- Fill in:
- Title / headline — text, ~120 chars.
- Body — rich text editor with image/video/link embeds.
- Type-specific fields (price, event date, equipment condition, training term, etc.).
- Hashtags / terms — link the post to terms in the marketplace; clicking a term in the post body navigates to the term detail page.
- Media — image, video, GIF, or YouTube/Vimeo URL. Videos uploaded directly are routed through the same DinoCloud pipeline as candidate videos and stored on S3.
- Visibility — Public (anyone), Followers-only, or Direct (specific people via @mention).
- Click Post — or Save as draft to come back later.
- The post appears in the relevant feed and on your profile.
The community feed is the reverse-chronological merge of all post types you can see, with your followed users at the top. Filter chips above the feed let you narrow to a single post type.
7.2.1 LLM-assisted headlines and post bodies
If you click Suggest headline in the post composer, the platform calls /get-llm-post-headline to suggest a short, punchy title based on what you've written so far. Three suggestions appear; click one to use it or ignore them.
For job postings (which are technically a different type, see Section 3), the matching helper is /get-llm-job-description.
For profile summaries (used on the profile page), the helper is /get-llm-profile-summary.
For term definitions (when one is missing on a term page), the helper is /get-llm-term-definition.
These are all small, optional prompts — none of them are required to use the platform.
7.3 Reading a post (post detail page)
Click any post card to open its detail page. For a Humor post, that URL is:
/humor_detail/<posting_id>
(other post types use the same /<kind>_detail/<posting_id> pattern).
Template humor_detail.html (and equivalents) shows:
- Author identity card with follow button.
- Full body, attachments and media.
- The reactions bar (see 7.4).
- The comments thread (see 7.5).
- A Related posts section based on shared terms / hashtags.
- Schema.org Article JSON-LD for SEO.
7.4 Reactions
Six possible reactions on every post:
- 👍 like (thumbs up)
- ❤️ love
- 🎉 celebrate
- 😢 sad
- 😡 angry
- ⭐ bookmark (saves the post to your Bookmarks tab)
Click one to react; click the same one again to remove it. Backend:
- Toggle a reaction → POST
/api/post/<posting_id>/react/ - See who reacted with a specific reaction → GET
/api/post/<posting_id>/reactions/<reaction_type>/users/
Bookmark is the only reaction with a list page — your bookmarks live under the Bookmarks tab on your profile.
7.5 Comments and replies
Click Comment under any post to open the inline composer. Comments support:
- Plain text and basic markdown (bold, italic, links).
- @-mentions (autocomplete by name; sends a notification to the mentioned user).
- Replies — every comment can have child replies (threaded one level deep). The schema model is
PostCommentwith aparentfield (added in migration 0005).
Backend:
- Add a comment → POST
/api/post/<posting_id>/comment/ - (Edit / delete are exposed inside the same comment block, hover to reveal.)
Comment reactions are the same six emoji as post reactions and use the same /react/ endpoint with the comment's ID instead of the post's.
7.6 Following and unfollowing
Following someone means their posts surface near the top of your feed and you're notified of their activity (subject to your preferences).
| Action | URL |
|---|---|
| Follow a user | /profile/<user_id>/follow/ |
| Unfollow | /profile/<user_id>/unfollow/ |
| List a user's followers | /profile/<user_id>/followers/ |
| List who they follow | /profile/<user_id>/following/ |
| Toggle email/push notifications for one specific user | /profile/<user_id>/toggle-activity-notifications/ |
The follow relationship is one-way — they don't have to follow you back. There is no separate "connection request" flow; following is a public action and the followee gets a notification.
If you find a particular followed user too noisy, use the activity-notification toggle to silence their notifications without unfollowing.
7.7 Mentions
Type @ anywhere there's a rich-text editor (post body, comment, message) to open the mention autocomplete. Pick a user; their name becomes a clickable link to their profile.
A mention triggers a notification to the mentioned user. The full list of places you've been mentioned lives at /mentions/.
7.8 Notifications
The notification centre is at /notifications/ (template notifications.html). It is the single hub for every kind of platform alert.
Notifications are grouped by source:
- Messages (new conversation, new reply, voice message landed, message reaction)
- Posts & community (new comment on your post, reply to your comment, mention, reaction)
- Follows (someone followed you, someone you follow posted)
- Jobs (your application got a reply, a saved job has a new candidate, a saved search has new matches)
- Credentials (a credential you issued was accepted, a credential you hold has been verified by an employer)
- System (account warnings, terms-of-service updates, weekly digest)
7.8.1 Notification API endpoints
| Endpoint | What it does |
|---|---|
/api/notifications/ |
Returns the list (paginated). |
/api/notifications/mark-read/ |
POST a list of notification IDs to mark them read. |
/api/notifications/unread-count/ |
Returns the unread count for the top-bar badge. |
The badge is polled every 30 seconds, or pushed in real-time when WebSockets are enabled.
7.8.2 Notification preferences
In /settings/ (template settings.html) you can toggle per-channel preferences:
| Channel | Per-event toggles |
|---|---|
| In-app (the bell icon) | One global on/off per category. |
| Per category — instant, daily digest, weekly digest, off. | |
| SMS | Limited to high-priority items (new message, application reply); requires Twilio integration on your account. |
7.9 Blocking and reporting
If a user is harassing or spamming you:
| Action | URL | Effect |
|---|---|---|
| Block a user | /profile/<user_id>/block/ |
They cannot message you, see your profile (regardless of your visibility setting), follow you or comment on your posts. They will see a generic "User unavailable" page. |
| Unblock | /profile/<user_id>/unblock/ |
Restores normal access; existing conversations remain hidden until you also unarchive them. |
| List blocked users | /settings/blocked/ (template blocked_users.html) |
Manage your blocked list. |
| Report a user | /profile/<user_id>/report/ |
File a report. Choose a category: spam, harassment, fake profile, inappropriate content, fraud, other. Add optional context. The report goes to the platform moderation team — you do not see the resolution but you will get a notification when it's closed. |
| Report a post / comment / message | The same Report action is available from the … menu on every post, comment and message. |
Blocking is silent — the blocked user is not notified. They will discover it the next time they try to interact with you.
7.10 Moderation of community content
In addition to the message screening covered in Section 6, community content (posts, comments) is screened for the platform's policy violations:
- Hate speech and harassment
- Fraud (fake credentials, scam jobs)
- Personal information leaks
- Spam patterns
Posts that fail screening are not deleted but are shadowed — they remain on the author's profile but don't surface in feeds, search or term pages. The author sees a banner explaining why and an Appeal button.
If you encounter content that should have been caught but wasn't, use the Report action; reports from trusted-tier users are prioritised.
7.11 Activity notification preferences
Two endpoints fine-tune notification volume without changing global settings:
| URL | What it does |
|---|---|
/toggle-activity-notifications/ |
Flip your default — "send me notifications for activity from people I follow" — on or off. |
/profile/<user_id>/toggle-activity-notifications/ |
Per-user override — silence notifications from a specific person without unfollowing them. |
Use the global toggle if you only want messages and follows; use the per-user override for chronically noisy contacts.
Next: 8. Credentials & wallet — verifiable credentials, JSON-LD export and the DID document.