Community Actions allow you to access a library of AI actions created by the Local GPT community. These are pre-built prompts and system configurations you can install with one click.
Open Local GPT Settings
Go to Obsidian Settings → Local GPT
Find Community Actions
Scroll to the “Community Actions” section
Click 'Browse Community Actions'
This opens the Community Actions modal
src/LocalGPTSettingTab.ts
new Setting ( containerEl )
. setName ( I18n . t ( "settings.communityActions" ))
. setDesc ( I18n . t ( "settings.communityActionsOpenDesc" ))
. addButton (( button ) => {
button
. setButtonText ( I18n . t ( "settings.communityActionsOpen" ))
. setCta ()
. onClick (() => openCommunityActionsModal ());
});
Browsing Actions
The Community Actions modal provides:
Language Filter Filter actions by language (English, Spanish, etc.)
Search Fuzzy search across action names, descriptions, and prompts
Scoring Actions are ranked by community reactions (upvotes)
Status Badges See which actions are installed, modified, or have conflicts
Each community action displays:
Name : The action’s title
Description : What the action does (if provided)
Author : Who created the action
Score : Community rating based on reactions
Tags : Whether the action replaces selected text
Status : Installed, Modified, or Available
src/CommunityActionsService.ts
export interface CommunityAction {
id : string ;
name : string ;
language : string ;
description ?: string ;
prompt ?: string ;
system ?: string ;
replace ?: boolean ;
author : string ;
authorUrl ?: string ;
commentUrl ?: string ;
score : number ;
createdAt ?: string ;
updatedAt ?: string ;
}
Installing Actions
Find an action
Browse or search for the action you want
Click 'Install'
The action will be added to your actions list
Use the action
Access it via the context menu or action palette
Installed actions appear in your regular actions list and can be used immediately.
Automatic Updates
Community actions are automatically updated to the latest version when you browse the library.
How Auto-Update Works
When you open Community Actions, Local GPT fetches the latest versions
Installed actions are compared with the community versions
If a newer version exists and you haven’t modified the action, it updates automatically
A status message shows how many actions were updated
src/LocalGPTSettingTab.ts
const syncCommunityActions = async (
actions : CommunityAction [],
) : Promise <{ updated : number ; skipped : number }> => {
const lookup = buildCommunityActionsLookup (
this . plugin . settings . actions ,
);
let updated = 0 ;
let skipped = 0 ;
actions . forEach (( action ) => {
const localAction = findCommunityActionLink ( action , lookup );
if ( ! localAction ) return ;
const localSignature = buildCommunityActionSignature ( localAction );
const remoteSignature = buildCommunityActionSignature ( action );
// Check if action was modified locally
if ( isCommunityActionModified ( localAction , localSignature )) {
skipped ++ ;
return ;
}
// Update if signatures differ
if ( localSignature !== remoteSignature ) {
applyCommunityActionUpdate ( localAction , action );
updated ++ ;
}
});
return { updated , skipped };
};
Preventing Auto-Updates
To stick with a specific version or preserve your changes:
Simply modify the Prompt or System Prompt of the action. This will disable automatic updates for that action.
Changing only the Name does NOT prevent auto-updates. You must modify the prompt or system prompt.
src/LocalGPTSettingTab.ts
const dropCommunityLinkIfModified = ( action : LocalGPTAction ) => {
if ( ! action . community ?. hash ) {
return ;
}
const localSignature = buildCommunityActionSignature ( action );
if ( localSignature !== action . community . hash ) {
delete action . community ;
}
};
Action Status Badges
Action is installed and up-to-date with the community version
You’ve modified the action locally. Auto-updates are disabled. You can click “Update” to overwrite your changes with the community version.
You have a different action with the same name. Installing will replace it.
Sharing Your Own Actions
You can contribute your actions to the community:
Create your action
Build and test your action in Local GPT
Export the action
Click the copy button next to your action
When you copy an action, it’s formatted like this:
Name: Explain Like I'm Five ✂️
System: You are a patient teacher who explains complex topics in simple terms using analogies and examples that a 5-year-old would understand. ✂️
Prompt: Explain the following concept in simple terms: ✂️
Replace: false ✂️
Language: en
The ✂️ separator is used to delimit fields. Don’t remove it when sharing.
src/LocalGPTSettingTab.ts
const buildSharingString = ( action : LocalGPTAction ) => {
const detectedLanguage = detectDominantLanguage (
[ action . name , action . system , action . prompt ]
. filter (( value ) : value is string => Boolean ( value ))
. join ( " \n " ),
);
const resolvedLanguage = normalizeLanguageCode (
detectedLanguage === "unknown"
? defaultCommunityActionsLanguage
: detectedLanguage ,
);
const replaceValue = action . replace
? ` ${ sharingFieldLabels . replace }${ action . replace } `
: "" ;
return [
action . name && ` ${ sharingFieldLabels . name }${ action . name } ` ,
action . system && ` ${ sharingFieldLabels . system }${ action . system } ` ,
action . prompt && ` ${ sharingFieldLabels . prompt }${ action . prompt } ` ,
replaceValue ,
` ${ sharingFieldLabels . language }${ resolvedLanguage } ` ,
]
. filter ( Boolean )
. join ( ` ${ SEPARATOR } \n ` );
};
Quick Add Actions
You can also paste community action strings directly into the Quick Add field:
Copy an action string
Get the formatted action text from GitHub or another user
Open Local GPT Settings
Go to the Actions section
Paste into Quick Add
The action will be parsed and added automatically
src/LocalGPTSettingTab.ts
const quickAdd = new Setting ( containerEl )
. setName ( I18n . t ( "settings.quickAdd" ))
. addText (( text ) => {
text . onChange ( async ( value ) => {
const parts = value
. split ( SEPARATOR )
. map (( part ) => part . trim ())
. filter ( Boolean );
const quickAddAction : LocalGPTAction = {
name: "" ,
prompt: "" ,
};
for ( const part of parts ) {
const entry = sharingEntries . find (([, label ]) =>
part . startsWith ( label ),
);
const key = entry ?.[ 0 ];
const label = entry ?.[ 1 ];
const rawValue = label
? part . slice ( label . length ). trim ()
: "" ;
if ( ! key || ! rawValue ) continue ;
const handler = quickAddHandlers [ key ];
if ( handler ) {
handler ( rawValue , quickAddAction );
}
}
if ( quickAddAction . name ) {
await this . addNewAction ( quickAddAction );
text . setValue ( "" );
this . display ();
}
});
});
Community actions are fetched from:
GitHub Discussions : Discussion #89
Community reactions : Actions are scored based on positive/negative reactions
src/CommunityActionsService.ts
const DISCUSSION_COMMENTS_URL =
"https://api.github.com/repos/pfrankov/obsidian-local-gpt/discussions/89/comments" ;
static async getCommunityActions ( options ?: {
forceRefresh? : boolean ;
}): Promise < CommunityAction [] > {
if (this.cache && ! forceRefresh ) {
return this . cache ;
}
const { actions , failed } = await this.fetchCommunityActions();
if ( failed && this.cache) {
return this . cache ;
}
this. cache = actions ;
return actions;
}
Scoring System
Actions are ranked by their score , calculated from GitHub reactions:
Positive reactions (+1 each):
👍 Thumbs up
❤️ Heart
🎉 Hooray
🚀 Rocket
👀 Eyes
😄 Laugh
Negative reactions (-1 each):
src/CommunityActionsService.ts
private static getReactionScore (
reactions ?: GitHubDiscussionComment [ "reactions" ],
): number {
if ( ! reactions ) return 0 ;
const positive = POSITIVE_REACTIONS . reduce (( total , key ) => {
return total + ( reactions [ key ] ?? 0 );
}, 0 );
const negative = NEGATIVE_REACTIONS . reduce (( total , key ) => {
return total + ( reactions [ key ] ?? 0 );
}, 0 );
return positive - negative ;
}
React to actions on GitHub to help others discover quality prompts!
Search and Filter
Language Filtering
Actions are tagged by language. Select your preferred language from the dropdown to see relevant actions.
Fuzzy Search
Search matches against:
Action name (highest priority)
Description
Prompt text
System prompt
src/LocalGPTSettingTab.ts
const getCommunityActionSearchRank = (
action : CommunityAction ,
query : string ,
) : number | null => {
const fields = [
action . name ,
action . description ,
action . prompt ,
action . system ,
];
for ( let i = 0 ; i < fields . length ; i ++ ) {
const value = fields [ i ];
if ( ! value ) continue ;
const normalized = normalizeSearchValue ( value );
if ( normalized && fuzzyMatch ( normalized , query )) {
return i ; // Lower index = higher priority
}
}
return null ;
};
Troubleshooting
Check your internet connection
Click “Refresh” to retry fetching
Cached actions will be used if available
You may have a naming conflict
Check if you already have an action with the same name
The status badge will indicate conflicts
Ensure you haven’t modified the action’s prompts
Check that the action has the community badge
Try refreshing the community actions list
Make sure you modify the Prompt or System Prompt
Changing only the name doesn’t disable updates
The “Modified” badge should appear after editing
Next Steps
Creating Custom Actions Learn how to create your own actions from scratch
Contributing Contribute your actions to help the community