{"record":{"id":"43be2364bc924cd2","repo":"flarum/framework","slug":"could-not-fetch-announcements-from-discuss-flarum-org","errorCode":null,"errorMessage":"Could not fetch announcements from discuss.flarum.org: ","messagePattern":"Could not fetch announcements from discuss\\.flarum\\.org: ","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"framework/core/src/Announcements/AnnouncementsFetcher.php","lineNumber":77,"sourceCode":"    {\n        $url = self::API_BASE_URL.'?'.http_build_query([\n            'filter' => ['tag' => self::TAG],\n            'sort' => '-createdAt',\n            'page' => ['limit' => self::FETCH_LIMIT],\n            'include' => 'firstPost,user,tags',\n        ]);\n\n        try {\n            $response = $this->client->get($url, [\n                'headers' => [\n                    'Accept' => 'application/json',\n                    'User-Agent' => 'Flarum/'.Application::VERSION\n                        .' PHP/'.$this->appInfo->identifyPHPVersion()\n                        .' Database/'.$this->appInfo->identifyDatabaseDriver().'/'.$this->appInfo->identifyDatabaseVersion(),\n                ],\n            ]);\n        } catch (GuzzleException $e) {\n            throw new RuntimeException('Could not fetch announcements from discuss.flarum.org: '.$e->getMessage(), 0, $e);\n        }\n\n        $body = json_decode((string) $response->getBody(), true);\n\n        if (! is_array($body['data'] ?? null)) {\n            throw new RuntimeException('Unexpected response from discuss.flarum.org.');\n        }\n\n        $posts = [];\n        $users = [];\n        $tagSlugs = [];\n        foreach ($body['included'] ?? [] as $resource) {\n            if (Arr::get($resource, 'type') === 'posts') {\n                $posts[$resource['id']] = $resource;\n            } elseif (Arr::get($resource, 'type') === 'users') {\n                $users[$resource['id']] = $resource;\n            } elseif (Arr::get($resource, 'type') === 'tags') {\n                $tagSlugs[$resource['id']] = Arr::get($resource, 'attributes.slug');","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/flarum/framework/blob/4b939f685389bfe8a380e9e28ddf305a1c66950c/framework/core/src/Announcements/AnnouncementsFetcher.php#L59-L95","documentation":"Network failure wrapper in AnnouncementsFetcher::fetch: the HTTP GET to discuss.flarum.org (Flarum's announcement feed) threw a GuzzleException (DNS failure, timeout, TLS error, connection refused), and the fetcher rethrows it as a RuntimeException with the underlying reason appended. The message means outbound HTTP to the announcements API failed, not that announcements are absent.","triggerScenarios":"Thrown at framework/core/src/Announcements/AnnouncementsFetcher.php:77 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check server outbound network access / firewall rules to discuss.flarum.org.","Retry the fetch after transient network issues; consider caching the last successful announcement payload for offline fallback.","Verify DNS resolution and TLS certificates on the host.","Check the appended Guzzle reason for the specific transport cause."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"4b939f685389bfe8a380e9e28ddf305a1c66950c","analyzedAt":"2026-09-15T18:09:20.879Z","contentChangedAt":"2026-09-15T18:09:20.879Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}