Need some help searching through your code to look for potential vulnerabilities? Set up code scanning in your project today.
Microsoft is laying off thousands of workers. Meta is writing $300 million checks to snag top AI engineers. And there’s plenty of concern about jobs being replaced by artificial intelligence.
It’s not easy to assess the current state of the tech hiring market. But some trends emerged in our conversations with company leaders at a GeekWire event Tuesday on our office deck overlooking the Ship Canal in Seattle’s Fremont neighborhood. The event spotlighted GeekWork, a recruiting service from GeekWire and Prime Team Partners.
Here are some of the key takeaways from our reporting:
Things are normal, all things considered
Big Tech layoffs = opportunity for startups
AI is reshaping job roles — but not replacing them
Up-skilling is a priority
Soft skills still matter
Microsoft 365 Copilot is redefining how people interact with AI—embedding it directly into the flow of work as the intuitive, natural interface for agents: the ‘UI for AI’
As Copilot becomes the interface for AI in the workplace, we’re seeing growing demand from customers who want to extend its capabilities with their own solutions. Many of our customers are looking to create custom agents—or have already built agents that operate outside the Microsoft 365 ecosystem—using fine-tuned models, custom logic, orchestrators, tools, knowledge sources, or complex integrations with other systems. Today, we’re enabling them to bring these agents into Microsoft 365 Copilot. We’re excited to announce the General Availability of custom engine agents in Microsoft 365 Copilot.
No matter where or how developers build their agents—whether with Copilot Studio, Azure AI Foundry, Visual Studio, or other AI platforms—they can now bring them into Microsoft 365 Copilot with a seamless, native experience. This integration gives developers full control over agent behavior, data access, and user interaction—ensuring consistency, security, and adaptability across the Microsoft 365 ecosystem.
Custom engine agents bring LexisNexis Protégé to life in Microsoft 365 Copilot
Whether you’re starting fresh or extending existing solutions, with full control over logic, data access, and user interaction, developers can:
Developers can move faster and build custom engine agents for Microsoft 365 Copilot with the Microsoft 365 Agents Toolkit—available in both Visual Studio and Visual Studio Code. It streamlines the custom agent-building process with built-in scaffolding, debugging tools, testing, and seamless integration with the Microsoft 365 Agents SDK.
Once published, agents are instantly discoverable in the Agent Store, ready to meet users where they work—across Microsoft 365 Copilot, Teams, and more.
Watch how you can easily bring an agent built in Azure AI Foundry into Microsoft 365 Copilot with the Toolkit and SDK.
We’re also introducing new native patterns for agents in Microsoft 365 Copilot, enabling developers to build custom agents that operate asynchronously—unlocking richer, more flexible user experiences. Unlike traditional synchronous interactions, these patterns allow agents to continue working in the background or proactively engage users when needed.
With asynchronous scenario patterns, custom agents can now:
The experience for custom engine agents is designed to feel like a native part of Microsoft 365 Copilot. Once approved and published in the Agent Store, they’re instantly available to users—no separate installation required. Whether in Microsoft Teams or the Microsoft 365 Copilot web or desktop app, users can discover, launch, and interact with agents directly from Copilot Chat and sidebar.
Agents greet users with a friendly welcome message and offer suggested prompts to help them get started—making the experience intuitive and Copilot-native from the very first interaction. Users can browse agent descriptions, install their favorites, and pin them for quick access within the flow of work.
We are excited how our partners are building their custom agents for Microsoft 365 Copilot now available in the Agent Store including, SAP Joule, LexisNexis Protégé, Meltwater and Asana. These agents bring the customization needed from our partner’s agentic use cases to the flow of work in M365 Copilot. We are introducing additional agents from more partners in the upcoming weeks.
Custom engine agents follow the same management and governance model as other agents in Microsoft 365 Copilot, giving IT admins the confidence and control they need to scale securely. Through the Microsoft 365 admin center, admins can:
With custom engine agents now generally available, developers and organizations can shape how AI shows up in the flow of work. From custom logic and models to secure, scalable deployment, we empower teams to build agents that reflect their unique needs and work—directly within Microsoft 365 Copilot.
To get started, download the Microsoft 365 Agents Toolkit for Visual Studio and Visual Studio code and bring your first agent to Microsoft 365 Copilot in minutes. You can follow along these resources:
We look forward to seeing what great agents you bring to Microsoft 365 Copilot.
The post Bring your own agents into Microsoft 365 Copilot appeared first on Microsoft 365 Developer Blog.
You already know that security is important to keep in mind when creating code and maintaining projects. Odds are, you also know that it’s much easier to think about security from the ground up rather than trying to squeeze it in at the end of a project.
But did you know that GitHub Actions injections are one of the most common vulnerabilities in projects stored in GitHub repositories? Thankfully, this is a relatively easy vulnerability to address, and GitHub has some tools to make it even easier.
The truth is that security is not something that is ever “done.” It’s a continuous process, one that you need to keep focusing on to help keep your code safe and secure. While automated tools are a huge help, they’re not an all-in-one, fire-and-forget solution.
This is why it’s important to understand the causes behind security vulnerabilities as well as how to address them. No tool will be 100% effective, but by increasing your understanding and deepening your knowledge, you will be better able to respond to threats.
With that in mind, let’s talk about one of the most common vulnerabilities found in GitHub repositories.
So what exactly is a GitHub Actions workflow injection? This is when a malicious attacker is able to submit a command that is run by a workflow in your repository. This can happen when an attacker controls the data, such as when they create an issue title or a branch name, and you execute that untrusted input. For example, you might execute it in the run portion of your workflow.
One of the most common causes of this is with the ${{}}
syntax in your code. In the preprocessing step, this syntax will automatically expand. That expansion may alter your code by inserting new commands. Then, when the system executes the code, these malicious commands are executed too.
Consider the following workflow as an example:
- name: print title
run: echo "${{ github.event.issue.title }}"
Let’s assume that this workflow is triggered whenever a user creates an issue. Then an attacker can create an issue with malicious code in the title, and the code will be executed when this workflow runs. The attacker only needs to do a small amount of trickery such as adding backtick characters to the title: touch pwned.txt
. Furthermore, this code will run using the permissions granted to the workflow, permissions the attacker is otherwise unlikely to have.
This is the root of the actions workflow injection. The biggest issues with actions workflow injections are awareness that this is a problem and finding all the instances that could lead to this vulnerability.
As stated earlier, it’s easier to prevent a vulnerability from appearing than it is to catch it after the fact. To that end, there are a few things that you should keep in mind while writing your code to help protect yourself from actions workflow injections.
While these are valuable tips, remember that even if you follow all of these guidelines, it doesn’t guarantee that you’re completely protected.
Remember that the actions workflow injections happen as a result of expanding what should be treated as untrusted input. When it is inserted into your workflow, if it contains malicious code, it changes the intended behavior. Then when the workflow triggers and executes, the attacker’s code runs.
One solution is to avoid using the ${{}}
syntax in workflow sections like run
. Instead, expand the untrusted data into an environment variable and then use the environment variable when you are running the workflow. If you consider our example above, this would change to the following.
- name: print title
env:
TITLE: ${{ github.event.issue.title }}
run: echo "$TITLE"
This won’t make the input trusted, but it will help to protect you from some of the ways attackers could take advantage of this vulnerability. We encourage you to do this, but still remember that this data is untrusted and could be a potential risk.
When an actions workflow injection triggers, it runs with the permissions granted to the workflow. You can specify what permissions workflows have by setting the permissions for the workflow’s GITHUB_TOKEN. For this reason, it’s important to make sure that your workflows are only running with the lowest privilege levels they need in order to perform duties. Otherwise, you might be giving an attacker permissions you didn’t intend if they manage to inject their code into your workflow.
pull_request_target
The impact is usually much more devastating when injection happens in a workflow that is triggered on pull_request_target
than on pull_request
. There is a significant difference between the pull_request
and pull_request_target
workflow triggers.
The pull_request
workflow trigger prevents write permissions and secrets access on the target repository by default when it’s triggered from a fork. Note that when the workflow is triggered from a branch in the same repository, it has access to secrets and potentially has write permissions. It does this in order to help prevent unauthorized access and protect your repository.
By contrast, the pull_request_target
workflow trigger gives the workflow writer the ability to release some of the restrictions. While this is important for some scenarios, it does mean that by using pull_request_target
instead of pull_request
, you are potentially putting your repository at a greater risk.
This means you should be using the pull_request
trigger unless you have a very specific need to use pull_request_target
. And if you are using the latter, you want to take extra care with the workflow given the additional permissions.
It’s not uncommon to create several branches while developing your code, often for various features or bug fixes. This is a normal part of the software development cycle. And sometimes we’re not the best at remembering to close and delete those branches after merging or after we’ve finished working with them. Unfortunately, these branches are still a potential vulnerability if you’re using the pull_request_target
trigger.
An attacker can target a workflow that runs on a pull request in a branch, and still take advantage of this exploit. This means that you can’t just assume your repository is safe because the workflows against your main
branch are secure. You need to review all of the branches that are publicly visible in your repository.
CodeQL is GitHub’s code analysis tool that provides automated security checks against your code. The specific feature of CodeQL that is most relevant here is the code scanning feature, which can provide feedback on your code and help identify potential security vulnerabilities. We recently made the ability to scan GitHub Actions workflow files generally available, and you can use this feature to look for several types of vulnerabilities, such as potential actions workflow injection risks.
One of the reasons CodeQL is so good at finding where untrusted data might be used is because of taint tracking. We added taint tracking to CodeQL for actions late last year. With taint tracking, CodeQL tracks where untrusted data flows through your code and identifies potential risks that might not be as obvious as the previous examples.
Enabling CodeQL to scan your actions workflows is as easy as enabling CodeQL code scanning with the default setup, which automatically includes analyzing actions workflows and will run on any protected branch. You can then check for the code scanning results to identify potential risks and start fixing them.
If you’re already using the advanced setup for CodeQL, you can add support for scanning your actions workflows by adding the actions
language to the target languages. These scans will be performed going forward and help to identify these vulnerabilities.
While we won’t get into it in this blog, it’s important to know that CodeQL code scanning runs several queries—it’s not just good at finding actions workflow injections. We encourage you to give it a try and see what it can find.
While CodeQL is a very effective tool—and it is really good at finding this specific vulnerability—it’s still not going to be 100% effective. Remember that no tool is perfect, and you should focus on keeping a security mindset and taking a critical idea to your own code. By keeping this in the forefront of your thoughts, you will be able to develop more secure code and help prevent these vulnerabilities from ever appearing in the first place.
Actions workflow injections are known to be one of the most prevalent vulnerabilities in repositories available on GitHub. However, they are relatively easy to address. The biggest issues with eliminating this vulnerability are simply being aware that they’re a problem and discovering the possible weak spots in your code.
Now that you’re aware of the issue, and have CodeQL on your side as a useful tool, you should be able to start looking for and fixing these vulnerabilities in your own code. And if you keep the proactive measures in mind, you’ll be in a better position to prevent them from occurring in future code you write.
If you’d like to learn more about actions workflow injections, we previously published a four-part series about keeping your actions workflows secure. The second part is specifically about actions workflow injections, but we encourage you to give the entire series a read.
Need some help searching through your code to look for potential vulnerabilities? Set up code scanning in your project today.
The post How to catch GitHub Actions workflow injections before attackers do appeared first on The GitHub Blog.
Seamless in-IDE coding and async development with Junie
Software development has been significantly influenced by AI coding agents taking over more repetitive tasks, generating code faster and getting more done with less effort. It’s nice to have access to a fast coding agent or an in-IDE AI assistant, but in real-world scenarios, intelligence and trustworthiness are much more important than mere speed. Fast agents will reduce the time it takes you to complete a given task, but smart ones will tangibly enhance the end-to-end development experience, minimizing errors, bugs, and context switching, and helping you achieve high quality code.
Junie, the coding agent by JetBrains, is fully controlled by the developers who use it and boasts a transparent thought process, structured task planning, and comprehensive progress tracking. Our users value a detailed execution plan for approval, an in-depth actions log with reasoning for each action taken, and extensive collaboration options, including autonomous partner-like interaction*. 83% of managers mentioned that Junie increases their team’s productivity, and 76% are satisfied or very satisfied with Junie*.
*Based on data derived from the responses of 272 individual contributors and managers, collected via the Junie Developer Experience Survey conducted by JetBrains in June 2025
JetBrains is introducing some important updates to Junie that will help to make it the perfect companion for developers seeking to create high-quality solutions for commercial and personal projects.
With Junie now fully integrated with GitHub, the power of async development is at your fingertips. Delegate multiple tasks simultaneously, make quick-fixes without opening an IDE, and collaborate with your team on the same project straight from GitHub.
Here’s how it works:
The Early Access Program (EAP) for Junie on GitHub is now open!
Your feedback is extremely valuable to us, and we’re always excited to hear your thoughts and ideas on how we can improve Junie. Junie on GitHub is currently available for JVM and PHP only.
Our aim is to make Junie available to as many teams as possible, which is why we offer grants for open-source projects for Junie on GitHub.
We invite all open-source developers and teams to apply for a free, 6 months license for Junie on GitHub. Our aim is to support developers in their efforts to create exciting new open-source content using Junie. Please use this form to tell us about your project and include a general overview, details of how many people work on it, and an explanation of how you plan to use Junie to enhance your work. We’ll carefully review all applications and then choose a select number of projects to receive free access to Junie on GitHub.
We trust you to decide how you’d like to use Junie, and we want to support you by providing an in-IDE coding agent that can handle a wide variety of tasks and projects. Junie has already proven its effectiveness when it comes to understanding complex codebases in different programming languages, starting new projects, generating high-quality code, and writing functional tests – and now we’ve made it even better!
Junie has received several major updates to its functionality. In addition to significant speed increases, we’re also rolling out MCP and remote development support.
Code isn’t just for solving problems. It’s also for exploring ideas, expressing creativity, and building something just because it sparks joy.
For the Love of Code is a global, summer-long hackathon for developers of all experience levels to build the project they’ve been thinking about but haven’t had a reason to start. Whether it’s a web app, CLI tool, game, AI exploration, or a creative experiment, this is your invitation to build for the fun of it — solo, with friends, or alongside GitHub Copilot.
For the Love of Code will run from July 16 to September 22, 2025.
What you could win
The real prize is working on something you love.
Anything you want! We’ll be picking winners in six highly scientific categories. Each one is outlined below with inspiration to spark ideas and nerd-snipe you into action
Category 1: Buttons, beeps, and blinkenlights
If it lights up, makes noise, or looks like it escaped from a 1998 RadioShack, it belongs here. Hardware hacks (real or simulated) that blink, beep, buzz, or surprise. Think interactive, physical, tactile, and just a little chaotic. Examples:
Category 2: Agents of change
AI-powered experiences, agents, or old-fashioned bots that help, hinder, or hilariously misunderstand you. Whether it’s helping automate workflows, critiquing your code like a judgmental coworker, or pretending to be your sentient toaster, this is your playground for all things assistant-y and absurd. Examples:
Category 3: Terminal talent
Command-line tools, extensions, and TUI projects that are clever, useful, or just plain fun. Serious utilities with personality, beautifully crafted interfaces, or quirky scripts that make your terminal feel more alive all belong here. If it runs in the shell and makes you smile, it belongs here. Examples:
Category 4: Game on
Code is your controller. Build something playable, puzzling, or just plain fun. This category is for interactive experiences of all kinds, like prototyping a game idea, remixing mechanics, or mashing up genres. Think nostalgic, clever, or completely original. Fun first, functional close behind. Examples:
Category 5: World wide wonders
Any web project that makes people smile, think, learn, or click “view source” belongs here. Whether it’s your first HTML experiment, a polished tool you’ve been meaning to ship, or a playful side project that does something surprisingly useful, this is your space. Educational, delightful, impressive, or just plain fun, all kinds of web builds are welcome. Examples:
Category 6: Everything but the kitchen sink
Too niche? Too specific? Hard to categorize? Perfect. This is your wild card category for all the creative projects that don’t fit neatly anywhere else. Think extensions, plugins, tools, GitHub Actions, or prototypes that turned into something unexpectedly useful. Practical, playful, or just uniquely yours, we want to see it all. Examples:
Make it wildly useful, or just plain weird. As long as it brings you joy.
Who can participate?
Students, maintainers, weekend tinkerers, creative coders, salty seasoned pros, and curious beginners. Solo or squad. First-timer or frequent flyer. If you write code…or want to… it’s for you.
How to join
* Editor’s note: We suspect Lee picked this deadline to avoid doing time zone math, and so he’d never have to explain daylight saving time again. Respect.
Tag your progress with #ForTheLoveOfCode
and we’ll feature our favorites on social and GitHub Explore page!
The short and sweet version:
Please see complete terms and conditions.
We know… “terms and conditions” sounds like the least fun part of a joyful code challenge. But if you’re submitting a project or hoping for a prize, take a second to read the official rules. Future-you will thank you.
We’re building a space that’s creative, collaborative, and welcoming to all. Please be excellent to each other. See our Code of Conduct.
Judging
A panel of GitHub Stars, Campus Experts, and staff will evaluate entries based on joyfulness, execution, technical difficulty, ingenuity, and relevance to the category. Bonus points (figuratively) for unexpected use of GitHub Copilot.
We’ll pick three winners from each category and announce the winners by October 22, 2025 on the GitHub blog. But honestly? If it makes you smile, you’ve already won.
Frequently asked questions
Something not covered here? Please ask in the community discussion.
The post For the Love of Code: a summer hackathon for joyful, ridiculous, and wildly creative projects appeared first on The GitHub Blog.